如何购买海外服务器常德seo公司
news/
2025/9/22 20:33:24/
文章来源:
如何购买海外服务器,常德seo公司,html 标签 wordpress,宁波四方网络网站建设基础篇
1.常用图像格式介绍
常用图像像素格式 RGB 和 YUV。
1.1RGB
RGB分类通常指的是将图像或颜色按照RGB#xff08;红、绿、蓝#xff09;颜色空间进行分组或分类。RGB图像格式通常包括RGB24#xff08;RGB888#xff09;、RGB32、RGBA、RGB565等。
RGB24是一种常用…基础篇
1.常用图像格式介绍
常用图像像素格式 RGB 和 YUV。
1.1RGB
RGB分类通常指的是将图像或颜色按照RGB红、绿、蓝颜色空间进行分组或分类。RGB图像格式通常包括RGB24RGB888、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平面 packedY、U、V 分量穿插着排列三个分量存在一个 Byte 型数组里 planarY、U、V 分量分别存在三个 Byte 型数组中
常见的像素格式
YUV422YUYV、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 - YUV420I420(YU12)、YV12、NV12、NV21
YUV420p: I420、YV12YUV420sp: 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 插入到链表中位置在 prev 和 next 之间。函数首先更新 next 节点的 prev 指针使其指向新节点然后更新新节点的 next 和 prev 指针最后更新 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。函数更新新节点的 next 和 prev 指针并相应地调整链表中相邻节点的指针使链表保持连贯。
海思平台
媒体处理平台架构 主要的处理流程介绍如下 可以看到主要分为视频输入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、AVSVDECVO、VENC、VPSS、PCIV、VI虚拟PIPEVO(WBC)VO、VENC、VPSS、PCIV、VI虚拟PIPEAVSVO、VENC、VPSS、PCIV、VI虚拟PIPEAIAO、AENCADECAO
海思提供绑定函数 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里面的chnVI那边DEV的地位有点类似于VPSS这边的Grp。对接的时候是VI这边的chn去绑定VPSS这边的Grp。 参考文档https://blog.csdn.net/qq_28258885/article/details/118796350 VO篇 VOVideo Output视频输出模块主动从内存相应位置读取视频和图形数据并通过相应的显示设备输出视频和图形。 海思平台VO视频输出通常分为显示设备、视频层、图像层。
以海思SS528为例说明如下 VO模块包含了三路显示设备 超高清显示设备DHD0Device HD0高清设备0 视频层VHD0Video layer of DHD0 视频层VHD2Video PIP layer 图形层G0Graphic layer 0 图形层G2Graphic layer 2 图形层G3Graphic layer 3 高清显示设备DHD1Device HD1高清设备1 视频层VHD1Video layer of DHD1 视频层VHD2Video PIP layer 图形层G1Graphic layer 1 图形层G2Graphic layer 2 图形层G3Graphic layer 3 标清显示设备DSD0Device SD0标清设备0 视频层VSD0Video layer of DSD0 图形层G2Graphic layer 2 图形层G3Graphic 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格式的图片到内存通常用于保存固定背景图
根据显示图片文件名获取图片长和宽的大小(调用strstr函数获取文件名中特定字段的位置)由图片长款大小分别计算亮度、色度、图片字节大小亮度大小图片分辨率色度大小(图片分辨率4)*2,图片大小二者相加创建视频缓存池VB默认D1分辨率704*576ipc子码流通常为D1大小从创建好的缓存池中获取缓存块大小为要显示图片的大小 一个帧缓存块所在缓存池的 ID 获取缓存块的物理地址并转化对应的虚拟地址。到此准备工作结束图像帧结构体进行赋值缓存池ID、图像数据物理地址、图像数据虚拟地址、宽、高、视频图像像素格式-yuv420、图像数据跨距{图像宽大小}、帧场模式只读模式fopen打开要显示图像文件fread读取图像数据到虚拟地址中
2.如何通过VO的设备ID来获取VO设备的亮度、色度、对比度、锐度等参数
遍历VO设备的链表从链表节点 pos 中获取对应的 VoDevEntry 结构体指针判断找到的VO链表项的voID是否和传入的设备ID相等如果相等获取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*576D1大小现在需要单画面在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_FALSEDVI输出。video_format 视频制式。此参数需要与VO配置的制式保持一致deep_color_mode DeepColor输出模式。默认为HDMI_DEEP_COLOR_24BITaudio_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/910281.shtml
如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!