USB一线通监控副屏

RTThread物联网操作系统 2024-12-06 18:42

环境搭建

环境变量配置

为了提高一些编译的速度,选择了在 Linux 系统下进行开发,在 Linux 上开发 N947 需要先安装 env 工具 https://github.com/RT-Thread/env ,按照说明文档进行安装即可,然后配置一些环境变量如下

其中 /opt/arm-gnu-toolchain-13.2.Rel1-x86_64-arm-none-eabi/bin 是自己的编译工具链的路径,/home/book/rt-thread 是 RT-Thread 根目录的路径

 source ~/.env/env.sh export RTT_CC=gcc export RTT_ROOT=/home/book/rt-thread export RTT_DIR=/home/book/rt-thread export RTT_EXEC_PATH=/opt/arm-gnu-toolchain-13.2.Rel1-x86_64-arm-none-eabi/bin export PATH=$PATH:$RTT_EXEC_PATH

如果需要将 N947 的例程从 rt-thread 的根文件夹中独立出来的话,需要删除工程中 Kconfig 文件的这行代码

代码高亮

这里使用 VSCode 中的 Clang 插件,代码高亮和补全可以通过使用编译时候生成的 compile_commands.json 文件来实现,而 RT-Thread 的工程是采用的 scons 工具,所以可以使用 scons_compiledb 这个 python 包来生成 compile_commands.json 实现代码高亮,修改过的 SConstruct 文件如下

import osimport sysimport rtconfigimport scons_compiledbif os.getenv('RTT_ROOT'):    RTT_ROOT = os.getenv('RTT_ROOT')else:    RTT_ROOT = os.path.normpath(os.getcwd() + '/../../../../..')sys.path = sys.path + [os.path.join(RTT_ROOT, 'tools')]try:    from building import *except:    print('Cannot found RT-Thread root directory, please check RTT_ROOT')    print(RTT_ROOT)    exit(-1)TARGET = 'rtthread.' + rtconfig.TARGET_EXTif rtconfig.PLATFORM == 'armcc':    env = Environment(tools = ['mingw'],        AS = rtconfig.AS, ASFLAGS = rtconfig.AFLAGS,        CC = rtconfig.CC, CFLAGS = rtconfig.CFLAGS,        CXX = rtconfig.CXX, CXXFLAGS = rtconfig.CXXFLAGS,        AR = rtconfig.AR, ARFLAGS = '-rc',        LINK = rtconfig.LINK, LINKFLAGS = rtconfig.LFLAGS,        # overwrite cflags, because cflags has '--C99'        CXXCOM = '$CXX -o $TARGET --cpp -c $CXXFLAGS $_CCCOMCOM $SOURCES')else:    env = Environment(tools = ['mingw'],        AS = rtconfig.AS, ASFLAGS = rtconfig.AFLAGS,        CC = rtconfig.CC, CFLAGS = rtconfig.CFLAGS,        CXX = rtconfig.CXX, CXXFLAGS = rtconfig.CXXFLAGS,        AR = rtconfig.AR, ARFLAGS = '-rc',        LINK = rtconfig.LINK, LINKFLAGS = rtconfig.LFLAGS,        CXXCOM = '$CXX -o $TARGET -c $CXXFLAGS $_CCCOMCOM $SOURCES')env.PrependENVPath('PATH', rtconfig.EXEC_PATH)scons_compiledb.enable(env)env.CompileDb()if rtconfig.PLATFORM in ['iccarm']:    env.Replace(CCCOM = ['$CC $CFLAGS $CPPFLAGS $_CPPDEFFLAGS $_CPPINCFLAGS -o $TARGET $SOURCES'])    env.Replace(ARFLAGS = [''])    env.Replace(LINKCOM = env["LINKCOM"] + ' --map rtthread.map')Export('RTT_ROOT')Export('rtconfig')SDK_ROOT = os.path.abspath('./')if os.path.exists(SDK_ROOT + '/Libraries'):    libraries_path_prefix = SDK_ROOT + '/Libraries'else:    libraries_path_prefix = os.path.dirname(SDK_ROOT) + '/Libraries'SDK_LIB = libraries_path_prefixExport('SDK_LIB')# prepare building environmentobjs = PrepareBuilding(env, RTT_ROOT, has_libcpu=False)objs.extend(SConscript(os.path.join(libraries_path_prefix, 'drivers', 'SConscript')))# include cmsisobjs.extend(SConscript(os.path.join(libraries_path_prefix, rtconfig.BSP_LIBRARY_TYPE, 'SConscript')))# make a buildingDoBuilding(TARGET, objs)

最终搭建完成的效果如下所示,代码高亮十分方便查看代码

LVGL 适配

屏幕拓展板

FRDM-MCXN947 这个开发板预留了一个 FlexIO 接口可以适配 8080 的并口屏,于是做了一个屏幕拓展板,把手里闲置的屏幕用起来

实物如下,触摸排线座子有点偏下,不过不影响功能

屏幕手册说明分辨率是 240*320 驱动芯片是 ST7789V、触摸芯片是 FT6336G,而官方的 SDK 中是有 ST7796 和 FT5406 的驱动代码的,后续还需要稍作修改

驱动适配

在官方的 SDK 中有 ST7796 和 FT5406 的驱动程序,直接移植过来即可,同时也把 EDMA 和 SMARTDMA 的驱动复制了过来,修改一下屏幕的初始化序列即可驱动屏幕

LVGL 适配

将SDK中的 lvgl_support 复制到工程中,修改屏幕的宽高为 240*320

然后在 board 中新建一个 lv_conf.h 文件,填入关于 LVGL 的一些配置,因为许多配置在 menuconfig 中有所设置,所以这里的配置项并不多

复制过来的 lvgl_support 中有对 FreeRTOS 的支持,这里将 FreeRTOS 的 API 修改为 RTT 的 API,例如如下这段代码

并且 N947 的驱动程序有 EDMA + FlexIO 和 SMARTDMA + FlexIO 两种驱动方式,具体区别不太了解,不过可以运行 LVGL 的 Benchmark 测试来看下结果,左边是 SMARTDMA 运行的结果,右边是 EDMA 的结果,可以看到前者的 FPS 更高。后续也就继续采用 SMARTDMA + FlexIO 的驱动方式

界面设计

然后使用 GUI Guider 设计一个界面,生成绘制界面的代码,然后添加到工程中

还需要修改工程文件夹中的 rtconfig.py,增加一个 LV_LVGL_H_INCLUDE_SIMPLE 的预定义,因为生成的代码默认包含 lvgl.h 是 #include "lvgl/lvgl.h"

最终适配完成的 LVGL 代码和 GUI Guider 的代码目录如下,LVGL 的 UI 绘制代码段如图右边所示,具体代码可见开源地址

USB 通讯

适配 CDC

完成了下位机的界面的初始化绘制,后续的任务当然就是怎么把数据采集并发送给下位机来更新界面的数据了,下面先完成 USB 的通讯,这里使用的是 RTT 官方推荐的 CherryUSB 这个开源 USB 协议栈

将如下链接中的适配代码复制到工程中

https://github.com/CherryUSB/cherryusb_mcx

因为传输的数据比较单一,这里使用串口屏的思路,直接用 CDC_ACM 的通讯方式,也就是在上位机显示为一个 USB 转串口设备,直接使用串口 API 完成通讯

将 RTT 根目录中 rt-thread/components/drivers/usb/cherryusb/demo 文件夹中的 CDC_ACM 例程复制到工程中,并且把根目录中的这两行代码屏蔽

修改工程中的 cherryusb_port.c 文件,添加对 CDC_ACM 的支持

/* * Copyright (c) 2006-2024, RT-Thread Development Team * * SPDX-License-Identifier: Apache-2.0 * * Change Logs: * Date           Author       Notes * 2024/04/23     sakumisu    first version */#include #include /* low level init here, this has implemented in cherryusb *//* low level deinit here, this has implemented in cherryusb */#ifdef RT_CHERRYUSB_DEVICE_TEMPLATE_CDC_ACMint cherryusb_devinit(void){    // extern void cherryusb_devinit(uint8_t busid, uintptr_t reg_base);    extern void cdc_acm_init(uint8_t busid, uintptr_t reg_base);    cdc_acm_init(0, USBHS1__USBC_BASE);    return 0;}INIT_COMPONENT_EXPORT(cherryusb_devinit);#endif#ifdef RT_CHERRYUSB_DEVICE_TEMPLATE_MSCint cherryusb_devinit(void){    extern void msc_ram_init(uint8_t busid, uintptr_t reg_base);    msc_ram_init(0, USBHS1__USBC_BASE);    return 0;}INIT_COMPONENT_EXPORT(cherryusb_devinit);#endif#ifdef RT_CHERRYUSB_HOST#include "usbh_core.h"int cherryusb_hostinit(void){    usbh_initialize(0, USBHS1__USBC_BASE);    return 0;}INIT_COMPONENT_EXPORT(cherryusb_hostinit);#endif

将刚才复制到工程中的 CDC_ACM 的 demo 程序中端点收发的程序做如下修改,增加对于输入信息的回显

void usbd_cdc_acm_bulk_out(uint8_t busid, uint8_t ep, uint32_t nbytes){    USB_LOG_RAW("actual out len:%d\r\n", nbytes);    /* setup next out ep read transfer */    usbd_ep_start_read(busid, CDC_OUT_EP, read_buffer, 2048);    for (int i = 0; i < nbytes; i++) {        printf("%02x ", read_buffer[i]);    }    printf("\r\n");}

验证

然后插上开发板的 USB HS 那个 USB 接口,用串口工具发个数据包

可以看到 已经识别成了 USB 串行设备,PID 和 VID 也是我自己设置的 0xE6E9 和 0x1122,后续上位机与开发板建立通讯锁定 COM 号就是依靠 PID VID 来查询实现,使用串口工具给开发板发送的数据也可以正常接收到

上位机

时间原因上位机做的比较简单,实现了如下几个功能:

  • 读取电脑的 CPU、GPU 的占用率和温度信息、获取当前时间

  • 根据 VID、PID 查询 COM来与开发板通讯,下发采集数据与时间

  • 增加帧头后发送到下位机,固定长度 32+2 个字节

下位机数据更新

在开发板端增加一个 thread 来负责把 USB 接收到的数据更新到屏幕上面,使用 LVGL 的 API 直接修改数据即可,代码如下

数据结构体

typedef struct{    uint16_t cpu_usage;    uint16_t mem_usage;    uint16_t gpu_usage;    uint16_t cpu_freq;    uint16_t cpu_temperature;    uint16_t gpu_temperature;    uint16_t board_temperature;} monitor_info_u16_t;typedef struct {    uint16_t wYear;    uint16_t wMonth;    uint16_t wDayOfWeek;    uint16_t wDay;    uint16_t wHour;    uint16_t wMinute;    uint16_t wSecond;    uint16_t wMilliseconds;} mytime_t;

在 USB 端点输出的回调函数中增加消息队列发送函数

void usbd_cdc_acm_bulk_out(uint8_t busid, uint8_t ep, uint32_t nbytes){    USB_LOG_RAW("actual out len:%d\r\n", nbytes);    /* setup next out ep read transfer */    usbd_ep_start_read(busid, CDC_OUT_EP, read_buffer, 2048);    for (int i = 0; i < nbytes; i++) {        printf("%02x ", read_buffer[i]);    }    printf("\r\n");    if (34 == nbytes)    {        rt_mq_send(&usb_mq, read_buffer, 34);    }}

main 函数中的接收消息队列

uint8_t read_buffer[128];while (1){    /* 从消息队列中接收消息 */    if (rt_mq_recv(&usb_mq, read_buffer, 34, RT_WAITING_FOREVER) > 0)    {        mytime_t* p_time_u16 = (mytime_t*)(read_buffer + 2);        monitor_info_u16_t* p_info_u16 = (monitor_info_u16_t *)(read_buffer + 2 + sizeof(mytime_t));        rt_kprintf("wYear         %u\r\n", p_time_u16->wYear);        rt_kprintf("wMonth        %u\r\n", p_time_u16->wMonth);        rt_kprintf("wDayOfWeek    %u\r\n", p_time_u16->wDayOfWeek);        rt_kprintf("wDay          %u\r\n", p_time_u16->wDay);        rt_kprintf("wHour         %u\r\n", p_time_u16->wHour);        rt_kprintf("wMinute       %u\r\n", p_time_u16->wMinute);        rt_kprintf("wSecond       %u\r\n", p_time_u16->wSecond);        rt_kprintf("wMilliseconds %u\r\n", p_time_u16->wMilliseconds);        rt_kprintf("cpu_usage         %u\r\n", p_info_u16->cpu_usage);        rt_kprintf("mem_usage         %u\r\n", p_info_u16->mem_usage);        rt_kprintf("gpu_usage         %u\r\n", p_info_u16->gpu_usage);        rt_kprintf("cpu_freq          %u\r\n", p_info_u16->cpu_freq);        rt_kprintf("cpu_temperature   %u\r\n", p_info_u16->cpu_temperature);        rt_kprintf("gpu_temperature   %u\r\n", p_info_u16->gpu_temperature);        rt_kprintf("board_temperature %u\r\n", p_info_u16->board_temperature);        lv_label_set_text_fmt(guider_ui.screen_label_cpu_temp, "%2d", p_info_u16->cpu_temperature);        lv_label_set_text_fmt(guider_ui.screen_label_gpu_temp, "%2d", p_info_u16->gpu_temperature);        lv_label_set_text_fmt(guider_ui.screen_label_cpu_load, "%2d", p_info_u16->cpu_usage);        lv_label_set_text_fmt(guider_ui.screen_label_gpu_load, "%2d", p_info_u16->gpu_usage);        lv_arc_set_value(guider_ui.screen_arc_gpu_load, p_info_u16->gpu_usage);        lv_arc_set_value(guider_ui.screen_arc_gpu_temp, p_info_u16->gpu_temperature);        lv_label_set_text_fmt(guider_ui.screen_time, "%02d:%02d", p_time_u16->wHour, p_time_u16->wMinute);        lv_label_set_text_fmt(guider_ui.screen_date, "%02d.%02d.%02d", p_time_u16->wYear, p_time_u16->wMonth, p_time_u16->wDay);    }}

成品效果

目前支持了对于时间、日期、CPU、GPU 的占用率和温度信息,其他的信息还在完善当中

下位机代码可见GitHub:https://github.com/POMIN-163/FRDM-MCXN947-USB-Monitor

上位机代码.zip(https://club.rt-thread.org/file_download/412971c88469523e

视频.mp4(https://club.rt-thread.org/file_download/ac333cc9ed03e24b


——————End——————

想要在RT-Thread平台或社区投放内容?或想参与相关直播活动及赛事?RT-Thread已开放对接窗口,请通过邮件与我们取得联系,期待合作!

合作邮箱: tongfangyi@rt-thread.com 

RTThread物联网操作系统 帮助您了解RT-Thread相关的资讯.
评论 (0)
  • 这款无线入耳式蓝牙耳机是长这个样子的,如下图。侧面特写,如下图。充电接口来个特写,用的是卡座卡在PCB板子上的,上下夹紧PCB的正负极,如下图。撬开耳机喇叭盖子,如下图。精致的喇叭(HY),如下图。喇叭是由电学产生声学的,具体结构如下图。电池包(AFS 451012  21 12),用黄色耐高温胶带进行包裹(安规需求),加强隔离绝缘的,如下图。451012是电池包的型号,聚合物锂电池+3.7V 35mAh,详细如下图。电路板是怎么拿出来的呢,剪断喇叭和电池包的连接线,底部抽出PCB板子
    liweicheng 2025-05-06 22:58 530浏览
  • 硅二极管温度传感器是一种基于硅半导体材料特性的测温装置,其核心原理是利用硅二极管的电学参数(如正向压降或电阻)随温度变化的特性实现温度检测。以下是其工作原理、技术特点及典型应用:一、工作原理1、‌PN结温度特性‌硅二极管由PN结构成,当温度变化时,其正向电压 VF与温度呈线性负相关关系。例如,温度每升高1℃,VF约下降2 mV。2、‌电压—温度关系‌通过jing确测量正向电压的微小变化,可推算出环境温度值。部分型号(如SI410)在宽温域内(如1.4 K至475 K)仍能保持高线性度。
    锦正茂科技 2025-05-09 13:52 119浏览
  • 二位半 5线数码管的驱动方法这个2位半的7段数码管只用5个管脚驱动。如果用常规的7段+共阳/阴则需要用10个管脚。如果把每个段看成独立的灯。5个管脚来点亮,任选其中一个作为COM端时,另外4条线可以单独各控制一个灯。所以实际上最多能驱动5*4 = 20个段。但是这里会有一个小问题。如果想点亮B1,可以让第3条线(P3)置高,P4 置低,其它阳极连P3的灯对应阴极P2 P1都应置高,此时会发现C1也会点亮。实际操作时,可以把COM端线P3设置为PP输出,其它线为OD输出。就可以单独控制了。实际的驱
    southcreek 2025-05-07 15:06 428浏览
  • 文/Leon编辑/cc孙聪颖‍《中国家族企业传承研究报告》显示,超四成“企二代” 明确表达接班意愿,展现出对家族企业延续发展的主动担当。中国研究数据服务平台(CNRDS)提供的精准数据进一步佐证:截至 2022 年,已有至少 280 家上市家族企业完成权杖交接,其中八成新任掌门人为创始人之子,凸显家族企业代际传承中 “子承父业” 的主流模式。然而,对于“企二代” 而言,接棒掌舵绝非易事。在瞬息万变的商业环境中,他们既要在白热化的市场竞争中开拓创新、引领企业突破发展瓶颈,又需应对来自父辈管理层的经
    华尔街科技眼 2025-05-06 18:17 27浏览
  • 多功能电锅长什么样子,主视图如下图所示。侧视图如下图所示。型号JZ-18A,额定功率600W,额定电压220V,产自潮州市潮安区彩塘镇精致电子配件厂,铭牌如下图所示。有两颗螺丝固定底盖,找到合适的工具,拆开底盖如下图所示。可见和大部分市场的加热锅一样的工作原理,手绘原理图,根据原理图进一步理解和分析。F1为保险,250V/10A,185℃,CPGXLD 250V10A TF185℃ RY 是一款温度保险丝,额定电压是250V,额定电流是10A,动作温度是185℃。CPGXLD是温度保险丝电器元件
    liweicheng 2025-05-05 18:36 416浏览
  • 后摄像头是长这个样子,如下图。5孔(D-,D+,5V,12V,GND),说的是连接线的个数,如下图。4LED,+12V驱动4颗LED灯珠,给摄像头补光用的,如下图。打开后盖,发现里面有透明白胶(防水)和白色硬胶(固定),用合适的工具,清理其中的胶状物。BOT层,AN3860,Panasonic Semiconductor (松下电器)制造的,Cylinder Motor Driver IC for Video Camera,如下图。TOP层,感光芯片和广角聚焦镜头组合,如下图。感光芯片,看着是玻
    liweicheng 2025-05-07 23:55 308浏览
  • UNISOC Miracle Gaming奇迹手游引擎亮点:• 高帧稳帧:支持《王者荣耀》等主流手游90帧高画质模式,连续丢帧率最高降低85%;• 丝滑操控:游戏冷启动速度提升50%,《和平精英》开镜开枪操作延迟降低80%;• 极速网络:专属游戏网络引擎,使《王者荣耀》平均延迟降低80%;• 智感语音:与腾讯GVoice联合,弱网环境仍能保持清晰通话;• 超高画质:游戏画质增强、超级HDR画质、游戏超分技术,优化游戏视效。全球手游市场规模日益壮大,游戏玩家对极致体验的追求愈发苛刻。紫光展锐全新U
    紫光展锐 2025-05-07 17:07 281浏览
  • Matter协议是一个由Amazon Alexa、Apple HomeKit、Google Home和Samsung SmartThings等全球科技巨头与CSA联盟共同制定的开放性标准,它就像一份“共生契约”,能让原本相互独立的家居生态在应用层上握手共存,同时它并非另起炉灶,而是以IP(互联网协议)为基础框架,将不同通信协议下的家居设备统一到同一套“语义规则”之下。作为应用层上的互通标准,Matter协议正在重新定义智能家居行业的运行逻辑,它不仅能向下屏蔽家居设备制造商的生态和系统,让设备、平
    华普微HOPERF 2025-05-08 11:40 289浏览
  • 文/郭楚妤编辑/cc孙聪颖‍相较于一众措辞谨慎、毫无掌舵者个人风格的上市公司财报,利亚德的财报显得尤为另类。利亚德光电集团成立于1995年,是一家以LED显示、液晶显示产品设计、生产、销售及服务为主业的高新技术企业。自2016年年报起,无论业绩优劣,董事长李军每年都会在财报末尾附上一首七言打油诗,抒发其对公司当年业绩的感悟。从“三年翻番顺大势”“智能显示我第一”“披荆斩棘幸从容”等词句中,不难窥见李军的雄心壮志。2012年,利亚德(300296.SZ)在深交所创业板上市。成立以来,该公司在细分领
    华尔街科技眼 2025-05-07 19:25 352浏览
  • 随着智能驾驶时代到来,汽车正转变为移动计算平台。车载AI技术对存储器提出新挑战:既要高性能,又需低功耗和车规级可靠性。贞光科技代理的紫光国芯车规级LPDDR4存储器,以其卓越性能成为国产芯片产业链中的关键一环,为智能汽车提供坚实的"记忆力"支持。作为官方授权代理商,贞光科技通过专业技术团队和完善供应链,让这款国产存储器更好地服务国内汽车厂商。本文将探讨车载AI算力需求现状及贞光科技如何通过紫光国芯LPDDR4产品满足市场需求。 车载AI算力需求激增的背景与挑战智能驾驶推动算力需求爆发式
    贞光科技 2025-05-07 16:54 190浏览
  • 飞凌嵌入式作为龙芯合作伙伴,隆重推出FET-2K0300i-S全国产自主可控工业级核心板!FET-2K0300i-S核心板基于龙芯2K0300i工业级处理器开发设计,集成1个64位LA264处理器,主频1GHz,提供高效的计算能力;支持硬件ECC;2K0300i还具备丰富的连接接口USB、SDIO、UART、SPI、CAN-FD、Ethernet、ADC等一应俱全,龙芯2K0300i支持四路CAN-FD接口,具备良好的可靠性、实时性和灵活性,可满足用户多路CAN需求。除性价比超高的国产处理器外,
    飞凌嵌入式 2025-05-07 11:54 65浏览
  • 温度传感器的工作原理依据其类型可分为以下几种主要形式:一、热电阻温度传感器利用金属或半导体材料的电阻值随温度变化的特性实现测温:l ‌金属热电阻‌(如铂电阻 Pt100、Pt1000):高温下电阻值呈线性增长,稳定性高,适用于工业精密测温。l ‌热敏电阻‌(NTC/PTC):NTC 热敏电阻阻值随温度升高而下降,PTC 则相反;灵敏度高但线性范围较窄,常用于电子设备温控。二、热电偶传感器基于‌塞贝克效应‌(Seebeck effect):两种不同
    锦正茂科技 2025-05-09 13:31 109浏览
  • ‌一、高斯计的正确选择‌1、‌明确测量需求‌‌磁场类型‌:区分直流或交流磁场,选择对应仪器(如交流高斯计需支持交变磁场测量)。‌量程范围‌:根据被测磁场强度选择覆盖范围,例如地球磁场(0.3–0.5 G)或工业磁体(数百至数千高斯)。‌精度与分辨率‌:高精度场景(如科研)需选择误差低于1%的仪器,分辨率需匹配微小磁场变化检测需求。2、‌仪器类型选择‌‌手持式‌:便携性强,适合现场快速检测;‌台式‌:精度更高,适用于实验室或工业环境。‌探头类型‌:‌横向/轴向探头‌:根据磁场方向选择,轴向探头适合
    锦正茂科技 2025-05-06 11:36 437浏览
  • 在过去的很长一段时间里,外卖市场呈现出美团和饿了么双寡头垄断的局面。美团凭借先发优势、强大的地推团队以及精细化的运营策略,在市场份额上长期占据领先地位。数据显示,截至2024年上半年,美团外卖以68.2%的市场份额领跑外卖行业,成为当之无愧的行业老大。其业务广泛覆盖,从一线城市的繁华商圈到二三线城市的大街小巷,几乎无处不在,为无数消费者提供便捷的外卖服务。饿了么作为阿里本地生活服务的重要一环,依托阿里强大的资金和技术支持,也在市场中站稳脚跟,以25.4%的份额位居第二。尽管市场份额上与美团有一定
    用户1742991715177 2025-05-06 19:43 79浏览
  • 2024年初,OpenAI公布的Sora AI视频生成模型,震撼了国产大模型行业。随后国产厂商集体发力视频大模型,快手发布视频生成大模型可灵,字节跳动发布豆包视频生成模型,正式打响了国内AI视频生成领域第一枪。众多企业匆忙入局,只为在这片新兴市场中抢占先机,却往往忽视了技术成熟度与应用规范的打磨。以社交平台上泛滥的 AI 伪造视频为例,全红婵家人被恶意仿冒博流量卖货,明星们也纷纷中招,刘晓庆、张馨予等均曾反馈有人在视频号上通过AI生成视频假冒她。这些伪造视频不仅严重侵犯他人权
    用户1742991715177 2025-05-05 23:08 115浏览
我要评论
0
0
点击右上角,分享到朋友圈 我知道啦
请使用浏览器分享功能 我知道啦