海思MPP音视频总结

基础篇

1.常用图像格式介绍

常用图像像素格式 RGB 和 YUV。

1.1RGB

RGB分类通常指的是将图像或颜色按照RGB(红、绿、蓝)颜色空间进行分组或分类。RGB图像格式通常包括RGB24(RGB888)、RGB32、RGBA、RGB565等。

RGB24是一种常用的图像颜色格式,表示每个像素使用24位(8位红、8位绿、8位蓝)来存储颜色信息。

RGB32是在RGB24的基础上增加了一个8位的alpha通道,用于表示透明度。每个像素总共占用32位。

RGB565使用16位表示颜色,其中5位用于红色,6位用于绿色,5位用于蓝色,适用于减少内存占用的场景

1.2YUV

        YUV 图像是指将亮度参量 Y 和色度参量 U/V 分开表示的像素格式,主要用于优化彩色视频信号的传输。YUV 相比于 RGB 格式最大的好处是可以做到在保持图像质量降低不明显的前提下,减小文件大小。YUV 格式之所以能够做到,是因为进行了采样操作。主流的采样方式有三种:YUV 4:4:4(YUV444),YUV 4:2:2(YUV422),YUV 4:2:0(YUV420)。

若以以黑点表示采样该像素点的 Y 分量,以空心圆圈表示采用该像素点的 UV 分量,则这三种采样方式如下:

YUV 存储格式

YUV 存储可以分为两种:packed(打包)和 planar(平面);

  • packed:Y、U、V 分量穿插着排列,三个分量存在一个 Byte 型数组里;

  • planar:Y、U、V 分量分别存在三个 Byte 型数组中;

常见的像素格式

YUV422:YUYV、YVYU、UYVY、VYUY

这四种格式每一种又可以分为 2 类(packed和planar),以 YUYV 为例,一个 6*4 的图像的存储方式如下:

	Y Y Y Y Y Y                   Y Y Y Y Y Y                  Y Y Y Y Y Y                   Y Y Y Y Y Y                    U U U U U U                  Y U Y V Y U Y V Y U Y VU U U U U U                  Y U Y V Y U Y V Y U Y VV V V V V V                  Y U Y V Y U Y V Y U Y VV V V V V V                  Y U Y V Y U Y V Y U Y V- Planar -                          - Packed - 
YUV420:I420(YU12)、YV12、NV12、NV21
  • YUV420p: I420、YV12
  • YUV420sp: NV12、NV21

 同样,对于一个6*4的图像,这四种像素格式的存储方式如下:

	Y Y Y Y Y Y      Y Y Y Y Y Y      Y Y Y Y Y Y      Y Y Y Y Y YY Y Y Y Y Y      Y Y Y Y Y Y      Y Y Y Y Y Y      Y Y Y Y Y YY Y Y Y Y Y      Y Y Y Y Y Y      Y Y Y Y Y Y      Y Y Y Y Y YY Y Y Y Y Y      Y Y Y Y Y Y      Y Y Y Y Y Y      Y Y Y Y Y YU U U U U U      V V V V V V      U V U V U V      V U V U V UV V V V V V      U U U U U U      U V U V U V      V U V U V U- I420 -          - YV12 -         - NV12 -         - NV21 -
  • I420、YV12 三个分量均为平面格式,即分别存在三个数组中;
  • NV12、NV21 的存储格式为 Y 平面,UV 打包,即 Y 信息存储在一个数组中,UV 信息存储在一个另一个数组中。

2.链表

2.1普通链表

2.1.1链表的难点

链表的难点  --->  指针。

口诀:

  • 变量变量,能变,就是能读能写,必定在内存里
  • 指针指针,保存的是地址,32处理器中地址都是32位的,无论是什么类型的指针变量,都是4字节

2.2改进链表

2.3常见双向链表宏
struct list_head
{struct list_head *next, *prev;
};
  • next:指向链表中下一个节点的指针。
  • prev:指向链表中上一个节点的指针。
  • 这个结构体用于表示链表的每个节点,允许在链表中双向遍历。
初始化链表头部
#define LIST_HEAD_INIT(name) { &(name), &(name) }
  • 这是一个宏,用于初始化链表头部。
  • 它将链表头部的 next 和 prev 指针都指向自身,表示这是一个空链表。
 声明和初始化一个新的链表头部
#define LIST_HEAD(name) \struct list_head name = LIST_HEAD_INIT(name)
  • 这个宏用于声明和初始化一个新的链表头部。
  • name 是用户指定的链表头的名称。该宏创建一个 struct list_head 类型的变量,并使用 LIST_HEAD_INIT 进行初始化。
 初始化已定义的链表头部
#define INIT_LIST_HEAD(ptr) do { \(ptr)->next = (ptr); (ptr)->prev = (ptr); \
} while (0)
  • 这个宏用于初始化已定义的链表头部。
  • ptr 是指向链表头的指针,宏将其 next 和 prev 指针都设置为指向自身,以表示它是一个空链表。
 在链表中增加链表项
static __inline__ void __list_add(struct list_head *new,struct list_head *prev,struct list_head *next)
{next->prev = new;   // 将新节点的下一个节点的 prev 指针指向新节点new->next = next;   // 新节点的 next 指向原本的下一个节点new->prev = prev;   // 新节点的 prev 指向前一个节点prev->next = new;   // 前一个节点的 next 指向新节点
}
  • 参数

    • new:要添加的新节点。
    • prev:新节点要插入的位置之前的节点。
    • next:新节点要插入的位置之后的节点。
  • 功能:将新节点 new 插入到链表中,位置在 prevnext 之间。函数首先更新 next 节点的 prev 指针,使其指向新节点,然后更新新节点的 nextprev 指针,最后更新 prev 节点的 next 指针,以完成插入操作。

 在链表中替换列表项
static inline void list_replace(struct list_head *old,struct list_head *new)
{new->next = old->next;               // 新节点的 next 指向旧节点的下一个节点new->next->prev = new;               // 旧节点下一个节点的 prev 指向新节点new->prev = old->prev;               // 新节点的 prev 指向旧节点的前一个节点new->prev->next = new;               // 旧节点的前一个节点的 next 指向新节点
}
  • 参数

    • old:要被替换的旧节点。
    • new:新的节点,将替换旧节点。
  • 功能:替换链表中的旧节点 old 为新节点 new。函数更新新节点的 nextprev 指针,并相应地调整链表中相邻节点的指针,使链表保持连贯。

海思平台

媒体处理平台架构

主要的处理流程介绍如下:

        

        可以看到主要分为视频输入(VI)、视频处理(VPSS)、视频编码(VENC)、视频解码(VDEC)、视频输出(VO)、视频拼接(AVS)、音频输入(AI)、音频输出(AO)、音频编码(AENC)、音频解码(ADEC)、区 域管理(REGION)等模块,几个主要模块的大致功能为:

VI模块:捕获视频图像,可对其做剪切、去噪等处理,并输出多路不同分辨率的图像数据。

VDEC模块:解码模块对编码后的视频码流进行解码,并将解析后的图像数据送 VPSS 进行图像处理,再送 VO 显示。可对 H.265/H.264/JPEG 格式的视频码流进行解码。

VPSS模块:接收 VI 和解码模块发送过来的图像,可对图像进行图像增强、锐化等处理,并实现同源输出多路不同分辨率的图像数据用于编码、预览或抓拍。

VENC模块:编码模块接收 VI 捕获并经 VPSS 处理后输出的图像数据,可叠加用户通过 Region
模块设置的 OSD 图像,然后按不同协议进行编码并输出相应码流。

VO模块:接收 VPSS 处理后的输出图像,可进行播放控制等处理,最后按用户配置的协议输出给外围视频设备。

AVS模块:接收多路VI采集的图像,进行拼接合成全景图像(这里的AVS是指“视频拼接子系统”,我之前一直以为是编解码的AVS标准)。

AI模块:捕获音频数据,然后AENC模块支持按多种音频协议对其进行编码,最后输出音频码流。

ADEC模块:用户从网络或外围存储设备获取的音频码流可直接送给ADEC模块,ADEC支持解码多种不同的音频格式码流,解码后数据送给AO模块即可播放声音。

视频缓存池

功能:视频缓存池主要向媒体业务提供大块物理内存管理功能,负责内存的分配和回收,充
分发挥内存缓存池的作用,让物理内存资源在各个媒体处理模块中合理使用。
构成:一组大小相同、物理地址连续的缓存块组成一个视频缓存池。
使用注意点: 必须在系统初始化之前配置公共视频缓存池 。根据业务的不同,公共缓存池的数量、缓存块的大小和数量不同。
典型的公共视频缓存池数据流图:所有的视频输入通道都可以从公共视频缓存池中获取视频缓存块用于保存采集的图像,如图中所示 VI 从公共视频缓存池 B 中获取视频缓存块 Bm, 缓存块 Bm VI 发送给VPSS,输入缓存块 Bm 经过 VPSS 处理之后被释放回公共视频缓存池。假设 VPSS 通道的工作模式是USER ,则 VPSS 通道 0 从公共视频缓存池 B 中获取缓存块 Bi 作为输出图像缓存buffer发送给 VENC VPSS 通道 1 从公共视频缓存池 B 中获取缓存块 Bk 作为输出图像缓存buffer 发送给 VO Bi VENC 编码完之后释放回公共视频缓存池, Bk VO 显示完之后释放回公共视频缓存池。

系统绑定

        MPP提供系统绑定接口(HI_MPI_SYS_Bind),即通过数据接收者绑定数据源来建立两者之间的关联关系(只允许数据接收者绑定数据源)。绑定后,数据源生成的数据将自动发送给接收者。目前MPP支持的绑定关系如下:

数据源数据接受者
VIVO 、VENC、VPSS、PCIV、VI(虚拟PIPE)
VPSSVO、VENC、VPSS、PCIV、VI(虚拟PIPE)、AVS
VDECVO、VENC、VPSS、PCIV、VI(虚拟PIPE)
VO(WBC)VO、VENC、VPSS、PCIV、VI(虚拟PIPE)
AVSVO、VENC、VPSS、PCIV、VI(虚拟PIPE)
AIAO、AENC
ADECAO

海思提供绑定函数 HI_MPI_SYS_Bind 来实现数据源与数据接受者的绑定:

HI_S32 HI_MPI_SYS_Bind(const MPP_CHN_S *pstSrcChn, const MPP_CHN_S
*pstDestChn);
  •   pstSrcChn指源通道指针
  •   pstDestChn指目的通道指针
  •   API需求的头文件为:hi_comm_sys.h、mpi_sys.h,需求的库文件为:libmpi.a

 注意:同一个数据接收者只能绑定一个数据源

VENC绑定VI为数据源示例:

HI_S32 SAMPLE_COMM_VI_UnBind_VENC(VI_PIPE ViPipe, VI_CHN ViChn, VENC_CHN VencChn)
{MPP_CHN_S stSrcChn;MPP_CHN_S stDestChn;stSrcChn.enModId   = HI_ID_VI;stSrcChn.s32DevId  = ViPipe;stSrcChn.s32ChnId  = ViChn;stDestChn.enModId  = HI_ID_VENC;stDestChn.s32DevId = 0;stDestChn.s32ChnId = VencChn;CHECK_RET(HI_MPI_SYS_UnBind(&stSrcChn, &stDestChn), "HI_MPI_SYS_UnBind(VI-VENC)");return HI_SUCCESS;
}

解绑的API为 HI_MPI_SYS_UnBind 

HI_S32 HI_MPI_SYS_UnBind(const MPP_CHN_S *pstSrcChn, const MPP_CHN_S
*pstDestChn);

注意:pstDestChn如果找不到绑定的源通道,则直接返回成功。如果找到了绑定的源通道,但是绑定的源通道和pstSrcChn不匹配,则返回失败。

若需将上面的VENC和VI解绑,示例如下: 

HI_S32 SAMPLE_COMM_VI_UnBind_VENC(VI_PIPE ViPipe, VI_CHN ViChn, VENC_CHN VencChn)
{MPP_CHN_S stSrcChn;MPP_CHN_S stDestChn;stSrcChn.enModId   = HI_ID_VI;stSrcChn.s32DevId  = ViPipe;stSrcChn.s32ChnId  = ViChn;stDestChn.enModId  = HI_ID_VENC;stDestChn.s32DevId = 0;stDestChn.s32ChnId = VencChn;CHECK_RET(HI_MPI_SYS_UnBind(&stSrcChn, &stDestChn), "HI_MPI_SYS_UnBind(VI-VENC)");return HI_SUCCESS;
}

 视频处理子系统(VSPP)

        支持对输入图像进行统一预处理,如去噪、去隔行、裁剪等,然后再对各通道分别进行处理,如缩放、加边框等。

常见的几个概念

Group:

VPSS对用户提供组(Group)的概念。最大个数请参见 VPSS_MAX_GRP_NUM定义,各Group分时复用VPSS硬件,硬件依次处理各个组提交的任务。

group实际上是对VPSS硬件功能的虚拟化,即若系统里只有一个group,那么这个group实际就是VPSS;若有多个group,那么就是一会给group0用一会给group1用,这就是分时复用。

Channel:

VPSS 组的通道。一个 VPSS组提供多个通道,每个通道具有缩放等功能。

通道分为 2 种:物理通道扩展通道。 VPSS 硬件提供多个物理通道,每个通道具有缩放、裁剪等功能。扩展通道具备缩放功能,它通过绑定物理通道,将物理通道输出作为自己的输入,把图像缩放成用户设置的目标分辨率输出。
chn是Grp里面的通道,这个通道有物理的有扩展的,物理通道有对应的硬件,扩展通道没有对应的硬件,扩展通道其实是对应了一些功能(缩放等)

  • 物理通道
    视频物理通道负责将输入设备解析后得到的视频数据输出到 DDR。在真正将数据 输出到 DDR 之前,它可以实现裁剪等功能,具体功能见各芯片的详细描述。
  • 扩展通道
    扩展通道是物理通道的扩展,主要实现缩放功能,其数据来源于物理通道。

FRC:

帧率控制分为两种:组帧率控制和通道帧率控制。
– 组帧率控制:用于控制各Group 对输入图像的接收。
– 通道帧率控制:用于控制各个通道图像的处理。

功能描述

通过调用 SYS 模块的绑定接口,可与 VPSS/USER/VDEC/VI VO/VENC/SVP 等模块进行绑定,其中前者为VPSS 的输入源,后者为 VPSS 的接收者。用户可通过 MPI 接口对Group进行管理。每个 Group 仅可与一个输入源绑定。 Group 的物理通道有两种工作模式:AUTO USER ,两种模式间可动态切换。 AUTO 模式下各通道仅可与一个接收者绑定,主要用于预览和回放场景下做播放控制。USER 模式下各通道可与多个接收者绑定。
需要特别注意USER模式主要用于对同一通道图像进行多路编码的场景,此模式下播 放控制不生效,因此回放场景下不建议使用USER模式 VPSS 只有工作在离线模式下才支持AUTO 模式。

在VI对sensor采集完的图像做好处理后,可以让VPSS的group和VI的通道进行绑定,从而进行裁剪操作,然后VPSS的组输出多路channel产生不同分辨率的视频,用于不同操作。
实际上VPSS的作用大部分在于缩放,用于视频预览;一些帧率控制、裁剪的功能VI也能完成,那么用于功能性的视频通道,如算法处理、抓图,就可以直接使用VI出来的拓展通道,这样就能少一次传输,不用走VPSS再到算法,一定程度上节省DDR的带宽。

注:海思中的VI的chn和VPSS的chn是两回事,VI那边的chn是VI里面Dev里面的chn,VI那边DEV的地位有点类似于VPSS这边的Grp。对接的时候是VI这边的chn去绑定VPSS这边的Grp。
 
参考文档:https://blog.csdn.net/qq_28258885/article/details/118796350

VO篇

        VO(Video Output,视频输出)模块主动从内存相应位置读取视频和图形数据,并通过相应的显示设备输出视频和图形。

        海思平台VO(视频输出)通常分为显示设备、视频层、图像层。

以海思SS528为例,说明如下

VO模块包含了三路显示设备

  • 超高清显示设备DHD0(Device HD0,高清设备0)

        视频层VHD0(Video layer of DHD0)
        视频层VHD2(Video PIP layer)
        图形层G0(Graphic layer 0)
        图形层G2(Graphic layer 2)
        图形层G3(Graphic layer 3)

  • 高清显示设备DHD1(Device HD1,高清设备1)

        视频层VHD1(Video layer of DHD1)
        视频层VHD2(Video PIP layer)
        图形层G1(Graphic layer 1)
        图形层G2(Graphic layer 2)
        图形层G3(Graphic layer 3)

  • 标清显示设备DSD0(Device SD0,标清设备0)

        视频层VSD0(Video layer of DSD0)
        图形层G2(Graphic layer 2)
        图形层G3(Graphic layer 3)

显示设备

        SS528平台支持三路显示设备,分别为两路高清DHD0和DHD1,支持1路标清DSD0,三路显示设备的输出接口和最大输出时序如下图:

视频层

        视频层建立在设备之上,用于视频显示,视频层可以把解码、视频处理子系统处理后的视频流数据显示到视频层的某个通道上。

        海思平台通常在每个显示设备都会对应一个视频层,来用于视频的显示,VHD0、VHD1、VSD0分别固定绑定在DHD0、DHD1、DSD0上面。而VHD2,也就是PIP层,支持动态绑定在DHD0或DHD1上。

VO通道

        在视频层之下,有多个通道,每一个通道都可以单独显示视频数据,视频被限制在通道内,通道被限制在视频层内。对于一个视频层,其上面的通道都是独立的。同时,不同的视频层上的通道也是独立的。对于通道的排号上面不存在跨层的连续,对于系统绑定,应该使用视频层号和通道号来进行绑定配置。

SS528各个视频层通道数:

        VHD0:支持64通道(SINGLE模式)、支持64通道(MULTI模式)
        VHD1:支持64通道(SINGLE模式)、支持64通道(MULTI模式)
        VHD2(PIP):支持64通道(SINGLE模式)、不支持通道(MULTI模式)
        VSD0:支持64通道(SINGLE模式)、不支持通道(MULTI模式)

1.如何读取一张YUV420格式的图片到内存(通常用于保存固定背景图)

  1. 根据显示图片文件名获取图片长和宽的大小(调用strstr函数获取文件名中特定字段的位置)
  2. 由图片长款大小,分别计算亮度、色度、图片字节大小(亮度大小=图片分辨率,色度大小=(图片分辨率>>4)*2,图片大小=二者相加)
  3. 创建视频缓存池VB(默认D1分辨率704*576,ipc子码流通常为D1大小)
  4. 从创建好的缓存池中,获取缓存块(大小为要显示图片的大小)
  5. 一个帧缓存块所在缓存池的 ID
  6. 获取缓存块的物理地址,并转化对应的虚拟地址。
  7. 到此准备工作结束
  8. 图像帧结构体进行赋值,(缓存池ID、图像数据物理地址、图像数据虚拟地址、宽、高、视频图像像素格式-yuv420图像数据跨距{图像宽大小}、帧场模式
  9. 只读模式fopen打开要显示图像文件,fread读取图像数据到虚拟地址中

2.如何通过VO的设备ID来获取VO设备的亮度、色度、对比度、锐度等参数

  1. 遍历VO设备的链表,从链表节点 pos 中获取对应的 VoDevEntry 结构体指针
  2. 判断找到的VO链表项的voID是否和传入的设备ID相等
  3. 如果相等,获取VO设备结构体中的亮度、色度、对比度等参数
static int GetVoDevData(int voId, VoDevStruct **devStruct)
{int result = ERR_DEVID;struct list_head *pos = NULL;struct list_head *save = NULL;//确保 voId 和 devStruct 参数的有效性VO_CHECK_VOID(voId);CHECK_POINTER(devStruct);//使用 list_for_each_safe 宏安全遍历链表 voDevslist_for_each_safe(pos, save, &voDevs) {//通过链表节点获取对应的 VoDevStruct 结构体指针(*devStruct) = list_entry(pos, VoDevStruct , node);//检查 (*devStruct) 是否为 NULL,如果是,记录错误并返回if (NULL == (*devStruct)){LogErr("find vo info err. voId = %d\n", voId);result = ERR_INPOITERNULL;goto EXIT_0;}//如果找到匹配的 voId,则设置 result 为成功状态 ERR_OK,并跳出循环if ((*devStruct)->voId == voId){result = ERR_OK;break;}}EXIT_0:return result;
}

3.VO子系统如何接收VPSS发送的视频流

        以输出一张背景图举例,在此例子中,vpss会直接处理背景图数据。

        1.将背景图yuv数据保存到内存中,操作方法可参考上述第一条总结。

        2.解绑vo通道上的绑定关系

        3.清楚vo通道buffer内容(否则可能会出现残留上一帧内容的清空)

        4.将内存中的的yuv数据,保存到图像帧结构体中

        5.设置绑定参数,请求vpss与vo直接绑定,记录当前绑定关系,返回绑定句柄(用于后期解绑操作)

        6.给vpss发送帧图像数据,vpss会处理原图像数据,比如说原始图像是704*576(D1)大小,现在需要单画面在1920*1080显示器上显示,那这个分辨率的变化,就需要vpss这边自动去处理,等处理完成后,vpss自动将数据发送给vo去显示。由于vpss和vo直接是绑定关系,vo接收vpss的数据是自动进行的,不需要做其他操作。

        7.解绑vpss和vo的绑定关系

ps:在此示例中,vpss接收数据到处理数据可以理解为一个组,在这个组里面有物理通道和扩展通道,物理通道由硬件提供,负责数据的输出和处理,扩展通道通过绑定物理通道,实现图像的缩放功能,但没有对应的硬件,而是通过软件实现。

4. VO模块如何实现视频流的播放控制等操作

1.基本播放控制

        播放:启动视频流的播放

        暂停:暂停当前播放状态,保持当前帧

        停止:停止视频播放并重置状态。

2.快进/快退

允许用户在视频中快速前进或后退,调整播放速度

3.帧控制

        单帧播放:逐帧播放功能,适合于分析视频内容

        跳帧:可以跳过指定数量的帧,以加快播放进度

4.音视频同步

确保音频和视频在播放时保持同步,处理音频延迟或视频卡顿的情况

5.缓冲管理

动态管理视频帧缓冲区,优化播放性能,避免卡顿现象。

6.显示参数调整

支持分辨率、亮度、对比度等显示参数的调整,以适应不同显示设备的需求

5.VO模块如何按照用户配置的协议输出给外围设备

6.VO的开启和停止实现方式

1.VO开启

1.确定显示设备(DHD0、DHD1),构建vo公共参数,完成配置vo设备公共属性。

  • bg_color   背景色、
  • intf_type    接口类型(VGA、HDMI、BT1120、MIPI、RGB_24等)
  • intf_sync   接口时序(VO_OUT_1280x800_60、VO_OUT_1080P60等

2.使能视频输出设备,调用接口开启视频dev。

3.构建视频层属性结构体,获取视频显示宽、高、像素格式、等参数

4.设置视频层属性,使能视频层。调用SDK接口函数完成设置视频层属性,使能视频层。

视频层属性

  • display_rect   视频显示区域矩形结构体,SINGLE模式下display_rect为动态属性;MULTI模式下display_rect为静态属性。
  • img_size    图像分辨率结构体,即合成画面尺寸,静态属性。
  • display_frame_rate  视频显示帧率
  • pixel_format   视频层输入像素格式:YUV444、YUV422、YUV420
  • 其他参数等

5.设置通道属性参数并使能视频通道。获取窗口通道数,先获取再设置通道属性,使能视频通道。

通道属性:

  • priority 视频通道叠加优先级,数值越大优先级越大
  • rect        通道矩形显示区域
  • deflicker_en  是否使能抗闪烁

6.设置HDMI属性参数,开启HDMI输出。设置设备HDMI输出图像效果,设备HDMI属性,启动HDMI输出。

HDMI输出图像效果参数

  • csc_matrix CSC转换矩阵,YUV颜色空间转RGB颜色空间
  • luma 亮度值
  • contrast 对比度值
  • hue 色调值
  • saturation 饱和度值

HDMI属性参数

  • hdmi_en 是否强制HDMI输出。TD_TRUE:强制HDMI输出;TD_FALSE:DVI输出。
  • video_format 视频制式。此参数需要与VO配置的制式保持一致
  • deep_color_mode DeepColor输出模式。默认为HDMI_DEEP_COLOR_24BIT
  • audio_en 是否使能音频
  • sample_rate 音频采样率,此参数需要与AO的配置保持一致
  • bit_depth 音频位宽,默认为16,此参数需要与AO的配置保持一致
  • auth_mode_en 使能该模式,HDMI强制输出,不再去根据显示或认证设备的EDID信息来自适应调整
  • deep_color_adapt_en 是否打开驱动Deepcolor自适应策略
  • pix_clk 用户设置自定义时序的像素时钟

2.VO停止

VO停止是VO开启的逆过程

1.禁用指定的视频输出通道

2.禁用视频层

3.禁用视频输出设备

文章持续更新中……

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/884005.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

预览 PDF 文档

引言 在现代Web应用中,文件预览功能是非常常见的需求之一。特别是在企业级应用中,用户经常需要查看各种类型的文件,如 PDF、Word、Excel 等。本文将详细介绍如何在Vue项目中实现 PDF 文档的预览功能。 实现原理 后端API 后端需要提供一个…

【c++ gtest】使用谷歌提供的gtest和抖音豆包提供的AI大模型来对代码中的函数进行测试

【c gtest】使用谷歌提供的gtest和抖音豆包提供的AI大模型来对代码中的函数进行测试 下载谷歌提供的c测试库在VsCode中安装抖音AI大模型找到c项目文件夹,使用VsCode和VS进行双开生成gtest代码进行c单例测试 下载谷歌提供的c测试库 在谷歌浏览器搜索github gtest, 第…

Pycharm,2024最新版Pycharm现在安装环境配置汉化详细教程!

码(文末附带精品籽料): K384HW36OBeyJsaWNlbnNlSWQiOiJLMzg0SFczNk9CIiwibGljZW5zZWVOYW1lIjoibWFvIHplZG9uZyIsImxpY2Vuc2VlVHlwZSI6IlBFUlNPTkFMIiwiYXNzaWduZWVOYW1lIjoiIiwiYXNzaWduZWVFbWFpbCI6IiIsImxpY2Vuc2VSZXN0cmljdGlvbiI6IiIsIm…

【论文分享】TensorTEE 24‘ASPLOS

目录 AbstractIntroductionContribution BackgroundCollaborative ComputingLLM CPU-NPU collaborative computing Memory ProtectionMemory encryption Integrity verificationHeterogeneous NPU TEEIntegrated NPU TEEDiscrete NPU TEE Threat Model MotivationInefficient C…

力扣每日一题合集

3211. 生成不含相邻零的二进制字符串 - 力扣&#xff08;LeetCode&#xff09; class Solution { public:vector<string> validStrings(int n) {vector<string> ans;ans.emplace_back("0");ans.emplace_back("1");for(int i 1; i < n; i)…

Vue3 中实现过渡动画的几种方式?

前言 首先抛开 vue 本身&#xff0c;假设需要给某个 Dom 元素实现一些过渡动画&#xff0c;那么下面这些事是必须的&#xff1a; 实现目标元素不同时刻下的样式&#xff0c;常见做法就是抽取在不同的 css 选择器中根据不同时刻切换不同的 css 选择器以达到样式的变化设置样式…

Linux 中,flock 对文件加锁

在Linux中&#xff0c;flock是一个用于对文件加锁的实用程序&#xff0c;它可以帮助协调多个进程对同一个文件的访问&#xff0c;避免出现数据不一致或冲突等问题。以下是对flock的详细介绍&#xff1a; 基本原理 flock通过在文件上设置锁来控制多个进程对该文件的并发访问。…

【华为HCIP实战课程二十七】中间到中间系统协议IS-IS Hello报文,网络工程师

一、IS-IS术语 1、IIH: ISIS hello 报文,相当于OSPF的Hello报文,hello-interval 10s, hold-time 30s 2、LSP:链路状态数据单元,类似OSPF的LSA,携带路由信息(L1和L2的LSP) 3、SNP:系列号PDU (1)、PSNP:部分序列号协议数据单元,类似OSPF的ACK,Request (2)、CSNP:…

python-opencv给图片或视频去水印

文章目录 引言inpaint函数的使用方法鼠标事件回调函数cv2.setMouseCallback介绍去水印步骤实现代码 引言 本文主要基于cv2.inpaint函数实现图片的水印去除。 inpaint函数基于图像修复算法&#xff0c;通过对缺陷区域周围像素的分析和插值&#xff0c;生成合适的像素值来填充缺…

渗透测试-百日筑基—文件上传篇特征截断渲染%00绕过——下篇

目录 day10-渗透测试文件上传篇&绕过&特征&截断&渲染 一、黑名单大小写绕过代码分析 1、获取文件后缀名进行判断&#xff0c;如果后缀在这个字典里就禁止上传。 2、黑名单大小写绕过攻击 二、利用 windows 系统特征绕过上传 1、windows 系统特征绕过漏洞…

C语言 | Leetcode C语言题解之第522题最长特殊序列II

题目&#xff1a; 题解&#xff1a; #define MAX(a, b) ((a) > (b) ? (a) : (b))bool is_subseq(const char *s, const char *t) {int pt_s 0, pt_t 0;int len_s strlen(s), len_t strlen(t);while (pt_s < len_s && pt_t < len_t) {if (s[pt_s] t[pt_…

STM32CUBEMX安富莱STM32-V6开发板使用FMC驱动SDRAM芯片MT48LC4M32B2TG

文章的目的是快速使用SDRAM芯片&#xff0c;没有详细讲解原理。 1、环境&#xff1a; 单片机&#xff1a;STM32F429VIT6 CUBE版本&#xff1a;STM32CUBMX 6.12.1 编译&#xff1a;KEIL MDK 硬件&#xff1a;安富莱STM32-V6开发板 SDRAM芯片&#xff1a;MT48LC4M32B2TG 2、配…

为什么QNAP威联通NAS的APP center无法安装APP?

创作立场&#xff1a;原创不易&#xff0c;拒绝搬运~ hello大家好&#xff0c;我是你们的老伙伴&#xff0c;稳重的大王~ 如题&#xff0c;大王带你一起来排查一下&#xff0c;可能遇到的问题。如有帮助&#xff0c;请给个关注鼓励&#xff0c;互谢~ 1 首先&#xff0c;安装…

人工智能算法之粒子群优化算法

人工智能算法之粒子群优化算法 粒子群优化算法&#xff08;PSO&#xff09;是一种群体智能优化算法&#xff0c;由Kennedy和Eberhart在1995年提出&#xff0c;灵感来源于鸟群、鱼群等生物群体行为。PSO通过群体中个体的交互及对周围环境的感知&#xff0c;快速找到最优解。PSO算…

【深入浅出】深入浅出transformer(附面试题)

本文的目的是为了帮助大家面试transformer&#xff0c;会结合我的面试经历以及看法去讲解transformer&#xff0c;并非完整的技术细致讲解&#xff0c;介意请移步。 结构 提到transformer网络模型&#xff0c;大家脑海中是否有这张图呢&#xff1f; 这是网络结构中经典的编解…

net 获取本地ip地址,net mvc + net core 两种

net mvc public static string GetIP(HttpRequestBase request){// 尝试获取 X-Forwarded-For 头string result request.Headers["X-Forwarded-For"]?.Split(,).FirstOrDefault()?.Trim();if (string.IsNullOrEmpty(result)){// 获取用户的 IP 地址result reques…

Handler、Looper、message进阶知识

Android Handler、Looper、Message的进阶知识 在Android开发中&#xff0c;Handler、Looper和Message机制是多线程通信的核心。为了深入理解并优化它们的使用&#xff0c;尤其是在高并发和UI性能优化中&#xff0c;可以利用一些高级特性。 1. Handler的高阶知识 Handler在基本…

开源一款基于 JAVA 的仓库管理系统,支持三方物流和厂内物流,包含 PDA 和 WEB 端的源码

大家好&#xff0c;我是一颗甜苞谷&#xff0c;今天分享一款基于 JAVA 的仓库管理系统,支持三方物流和厂内物流,包含 PDA 和 WEB 端的源码。 前言 在当前的物流仓储行业&#xff0c;企业面临着信息化升级的迫切需求&#xff0c;但往往受限于高昂的软件采购和维护成本。现有的…

Sigrity Power SI Resonance analysis模式如何进行谐振分析操作指导

Sigrity Power SI Resonance analysis模式如何进行谐振分析操作指导 Sigrity Power SI可以方便快捷的进行谐振分析,谐振分析的目的是为了分析电源地平面组成的腔体的谐振频率以及谐振幅度,让频率在谐振频率附近的信号避开谐振腔,以及添加相应的电容来降低谐振峰值. 仍然以这…

vue特性

Vue.js是一套构建用户界面的渐进式框架&#xff0c;其特性主要包括以下几点&#xff1a; MVVM模式 Vue.js采用了MVVM&#xff08;Model-View-ViewModel&#xff09;的设计模式。在这种模式下&#xff0c;Model代表数据模型&#xff0c;View代表用户界面&#xff0c;ViewModel…