概述
视频编码
1、概述
VENC模块,即视频编码模块。本模块支持多路实时编码,且每路编码独立,编码协议和编码profile 可以不同。本模块支持视频编码同时,调度Region 模块对编码图像内容进行叠加和遮挡。
VENC模块的输入源包括三类:
- 用户态读取图像文件向编码模块发送数据;
- 视频输入(VIU)模块采集的图像经视频处理子系统(VPSS)发送到编码模块;
- 视频输入(VIU)模块采集的图像直接发送到编码模块;
2、功能描述
2.1 编码数据流程图
典型的编码流程包括了输入图像的接收、图像内容的遮挡和覆盖、图像的编码、以及码流的输出等过程。
VENC 模块由编码通道子模块(VENC)和**编码协议子模块(H.264/H.265/JPEG/MJPEG)**组成。
通道支持接收YUV 格式图像输入另外,Hi3518EV200 能够支持单分量输入(只存在Y 分量)。通道模块接收外部原始图像数据,而不关心图像数据是来自哪个外部模块。
通道接收到图像之后,比较图像尺寸和编码通道尺寸:
-
如果输入图像比编码通道尺寸大,VENC 将按照编码通道尺寸大小,调用VGS 对源图像进行缩小,然后对缩小之后的图像进行编码。
-
如果输入图像比编码通道尺寸小,VENC 丢弃源图像。VENC 不支持放大输入图像编码。
-
如果输入图像与编码通道尺寸相当,VENC 直接接受源图像,进行编码。
-
1、通道的帧率控制默认不打开,需要用户调用接口设置。RC 中也具有帧率控制功能。推荐使用RC 的帧率控制,这样不会对码率控制造成过大的冲击。
-
2、对于 Hi3518EV200 的H.264 编码,输入图像格式由非单分量切换为单分量时,由于存在帧间预测,在编码出下一个I 帧之前图像会存有色度残留。建议客户在切换单分量时调用接口HI_MPI_VENC_ResetChn 进行通道复位。
REGION 模块支持对图像内容的遮挡和叠加。完成视频区域管理之后,图像被送入具体协议类型编码通道,完成视频编码,输出码流。
2.2 编码通道
编码通道作为基本容器,保存编码通道的多种用户设置和管理编码通道的多种内部资源。编码通道完成图像转化为码流的功能,具体由码率控制器和编码器协同完成。这里的编码器指的是狭义上的编码器,只完成编码功能。码率控制器提供了对编码参数的控制和调整,从而对输出码率进行控制。
2.3 码率控制
码率控制器实现对编码码率进行控制。从信息学的角度分析,图像的压缩比越低,压缩图像的质量越高;图像压缩比例越高,压缩图像的质量越低。对于场景变化的真实场景,图像质量稳定,编码码率会波动;编码码率稳定,图像质量会波动。以H.264 编码为例,通常图像Qp 越低,图像的质量越好,码率越高;图像Qp 越高,图像质量越差,码率越低。码率控制是针对连续的编码码流而言,所以,JPEG 协议编码通道不包括码率控制功能。
码率控制器分别提供了对H.264H.265MJPEG 协议编码通道CBR、VBR、FIXQP 等三种码率控制模式,对图像质量和码率进行调节。
CBR(Constant Bit Rate)固定比特率。即在码率统计时间内保证编码码率平稳。码率稳定主要由两个量来评估,这两个量都可以由用户在创建编码通道时指定。
- 码率统计时间
单位为秒(s),码率统计时间越长,每帧图像的码率波动对于码率调节的影响越弱,码率的调节会更缓慢,图像质量的波动会更轻微;码率统计时间越短,每帧图像的码率波动对于码率调节的影响越强,图像码率的调节会更灵敏,图像质量的波动会更剧烈。 - 行级码率控制调节幅度
行级码率控制调节幅度是一帧内行级调节的最大范围,其中行级以宏块行为单位。调节幅度越大,允许行级调整的QP 范围越大,码率越平稳。对于图像复杂度分布不均匀的场景,行级码率控制调节幅度设置过大会带来图像质量不均匀。
VBR(Variable Bit Rate)可变比特率,即允许在码率统计时间内编码码率波动,从而保证编码图像质量平稳。以H.264 编码为例,VENC 模块提供用户可设置MaxQp,MinQp,MaxBitrate 和ChangePos。MaxQp,MinQp 用于控制图像的质量范围,MaxBitrate 用于钳位码率统计时间内的最大编码码率,ChangePos 用于控制开始调整Qp 的码率基准线。当编码码率大于MaxBitrateChangePos 时,图像qp 会逐步向MaxQp 调整,如果图像QP 达到MaxQp,QP 会被钳位到最大值,MaxBitrate 的钳位效果失效,编码码率有可能会超出MaxBitrate。当编码码率小于MaxBitrateChangePos时,图像QP 会逐步向MinQp 调整,如果图像QP 达到MinQp,此时编码的码率已经
达到最大值,而且图像质量最好。
FIXQP固定Qp 值。在码率统计时间内,编码图像所有宏块Qp 值相同,采用用户设定
的图像Qp 值,I 帧和P 帧的QP 值可以分别设置。
2.4 GOP结构
两种编码协议(H.264/H.265),GOP 结构属性均支持五种GOP 结构类型模式
可以参考帮助理解的博文有:
视频编解码 基本概念:GOP;
海思智能编码使用指导
GOP模式 | 参考帧个数 | 备注 |
---|---|---|
VENC_GOPMODE_NORMALP | 1 | P 帧只需一个参考帧,且为前向参考帧。 |
VENC_GOPMODE_DUALP | 2 | P 帧需要两个参考帧,且两个前向参考帧。 |
VENC_GOPMODE_SMARTP | 2 | P 帧需要两个参考帧,且两个前向参考帧,一个短期参考帧,一个长期参考帧。 |
VENC_GOPMODE_BIPREDB | 2 | B 帧需要两个参考帧,且一个个前向参考帧,一个后向参考帧,P 帧需要一个参考帧,且为前向参考帧。 |
VENC_GOPMODE_LOWDELAYB | 2 | B 帧需要两个参考帧,且两个前向参考帧, P 帧需要一个参考帧,且为前向参考帧,暂不支持。 |
VENC_GOPMODE_DUALP 模式的帧结构图
其中:SP 指特殊的P 帧,这里简称SP 帧,该帧只需一个参考帧,且Qp 值小于其他P帧Qp 值,u32SpInterval=0 指不支持SP 帧。
VENC_GOPMODE_SMARTP 模式的帧结构
其中:Bg 指IDR 帧,且为长期参考帧,VI 指P 帧,该帧只参考Bg 帧,且Qp 值小于其他P 帧Qp 值。
VENC_GOPMODE_BIPREDB 模式的帧结构
其中:u32BFrmNum 指IDR 帧和P 帧或P 帧和P 帧之间B 帧的个数,且B 帧不作参考帧,上图中u32BFrmNum = 2,用户需注意,可能在一个Gop 的尾部,u32BFrmNum不一定为2,且一个Gop 的最后一帧一定是P 帧。
2.5 高级跳帧参考模式
高级跳帧参考模式涉及3 个参数:u32Base、u32Enhance 和bEnablePred
这里我们首先要了解这三个参数:
base 层的周期
enhance 层的周期
代表base 层的帧是否被base 层其他帧用作参考。当为HI_FALSE 时,base 层的所有帧都参考IDR 帧
- 说明:可分级事故偶那个编码通常由成为可扩展、可分层视频编码,最早是为了增强在异步传输模式下视频传输的鲁棒性而提出的。在早期的研究中发现,以编码的视频在传输的过程中非常容易丢数据包。针对这一情况,可分层的概念被提了出来:将原来的视频流分为两层,其中携带最重要信息的成为基本层(base层),而携带残留信息以增强基本层图像质量的则为增强层(enhance层)。如果遇到网络拥塞,则丢弃增强层数据而保留基本层.这种模式即后来为人们所熟悉的质量可分级(SNR)技术,并首次被包含到MPEG-2标准中的一系列可分级工具中.-------引用自可分级视频编码器层间预测分析。
2.6 彩转灰
彩转灰,即VENC 支持把彩色图像转换成灰度图像进行编码。
2.7 裁剪编码
裁剪编码,即VENC 从图像中裁剪出一部分进行编码,用户可以设置裁剪的起始点X、Y 和裁剪的宽度width 和高度height,
裁剪示意图如下
2.8 ROI
ROI(Region Of Interest)编码,感兴趣区域编码。用户可以通过配置ROI 区域,对该区域的图像Qp 进行限制,从而实现图像中该区域的Qp 与其他图像区域的差异化。系统现仅支持对H.264/H.265 通道进行ROI 设置。系统提供了8 个感兴趣区域,可供用户同时使用。8 个区域可以互相叠加,且叠加时的优先级按照0~7 的索引号依次提高,这里,叠加优先级是指发生叠加时,图像区域的最终Qp 值的判定,最终的区域Qp 值按照优先级最高的区域设定。ROI 区域可配置绝对Qp 和相对Qp 两种模式。
- 绝对 Qp:ROI 区域的Qp 为用户设定的Qp 值。
- 相对 Qp:ROI 区域的Qp 为码率控制产生的Qp 与用户设定的Qp 偏移值的和。
以下示例编码图像采用FixQp 模式,设置图像Qp 为25,即图像中所有宏块Qp 值为25。Roi 区域0 设置为绝对Qp 模式,Qp 值为10,索引为0;Roi 区域1 设置为相对Qp 模式,Qp 为-10,索引为1。区域0 的index 小于区域1 的index,所以在发生互相重叠的图像区域按高优先级的区域(区域1)Qp 设置。区域0 除了发生重叠的部分的Qp 值等于10。区域1 的Qp 值为25-10=15。
2.9 非ROI区域的低帧率编码
非ROI区域低帧率,即ROI区域正常编码,而非ROI区域低帧率编码,用户可以根据具体情况设置非ROI区域的帧率.
2.10 JPEG抓拍模式
JPEG编码抓拍模式有两种工作模式:全部抓拍和闪光灯抓拍模式.
- 全部抓拍模式:通道启动接受图像后,编码所有接收的图像。
- 闪光灯抓拍:通道启动接收图像后,只编码在闪光灯亮时采集到的图像.
2.11 帧帧内刷新
P 帧刷新ISlice/Intra 宏块行,可以为客户提供码流非常平滑的编码方式,每个I 帧和P帧的大小可以非常接近。在网络带宽有限(如无线网络)的情况下,降低I 帧过大带来的网络冲击,降低网传延时,降低网络传输出错的概率。
建议参考学习博文:
H264基本概念之 宏块、片和片组
视频编码帧内刷新Intra refresh
266中帧内预测完整过程的总结
宏块都有哪些类型?
2.12 编码码流帧配置
编码码流帧配置支持两种模式:单包模式和多包模式(在不调用slice 分割接口及其插入用户数据接口的情况下),如图所示:
- 多包模式:对于 H.264,当为I 帧时I 帧包含4 个NAL 包(4 个NAL 包分别为sps 包、pps 包、sei 包、Islice 包,这里假设pps 包只有一个,且4 个NAL 包是独立的,包类型不同);对于JPEG,一帧图像包含2 个包(1 个图像参数包,1 个图像数据包,2 个包是独立的,包类型不同)。
- 单包模式:对于 H.264,当为I 帧时,一个I 帧包含1 个NAL 包(该NAL 包的包类型为Islice 包,且包含sps、pps、sei、
Islice 的数据);对于JPEG,一帧图像只有1 个包(该包的包类型为图像数据包,且包含图像参数包的数据)。
两种模式可通过ko 加载时设置模块参数OneStreamBuffer 来选择。OneStreamBuffer=1表示单包模式;OneStreamBuffer=0 表示多包模式,系统默认OneStreamBuffer=0。一帧会被分成多个slice,如果用户选择单包模式时,对于I 帧来说,该帧第一个ISlice 包会包含 sps、pps、sei 的数据,该帧的其他ISlice 则没有。即对于H.264,sps、pps、sei 的数据只会出现在I 帧的第一个Islice 中并合为1 个包,且包类型为ISlice;对于JPEG/MJPEG 来说,图像参数包只会出现在一帧的第一个数据包中并合为1 个包,且包类型为数据包
2.13 编码码流buffer 配置模式
编码码流buffer 配置支持两种模式:一般模式和省内存模式。
- 一般模式:考虑到超大帧的情况,码流 Buffer 大小配置的下限为:H264 和H265是通道宽x 通道高x3/4,JPEG 和MJPEG 是通道宽x 通道高。
- 省内存模式:码流 Buffer 大小配置的下限是32*1024 bytes,此模式需要用户保证码流buffer 大小设置合理,否则会出现因码流buffer 不足而不断重编或者丢帧的情况。
两种模式可通过ko 加载时设置相应的模块参数来选择。模块参数值为1 表示省内存模
式,模块参数值 0 表示一般模式。
2.14 编码重构帧复用参考帧亮度内存模式
重构帧可以复用参考帧亮度内存,色度内存重构帧和参考帧都需要单独分配。可在加载h264e.ko 时设置模块参数H264eRcnEqualRef 来选择,H264eRcnEqualRef=0 为默认的重构帧、参考帧单独分配内存模式;H264eRcnEqualRef=1 为重构帧复用参考帧内存模式。
重构帧复用参考帧亮度内存带来的问题有:
- 因为在编码过程中参考帧已被重构帧覆盖,因此在异常情况下(比如超大帧、码率过冲、码流buffer 满等)只能插入I 帧。
- 2 倍跳帧参考编码比使用一般模式多占用一个帧大小的内存。
编码重构帧复用参考帧亮度内存时,编码参考帧色度内存以VB 方式分配内存,且计
算方法为:CSize = align(MaxPicWidth,16)*align(MaxPicHeight,16) / 2,参考帧亮度内存
从mmz 中分配,且计算方法为:
-
当参考帧压缩时:
BlkSize = HeadSize + YSize;其中HeadSize、Ysize 的大小计算如下所示:
HeadSize =(align(MaxPicWidth,16)+255)/256* align(MaxPicHeight,16)*2;
YSize = (align(MaxPicWidth,16)+48)*align(MaxPicHeight,16); -
当参考帧不压缩时:
BlkSize = YSize;其中Ysize 的大小计算:Ysize = align(MaxPicWidth,16)*align(MaxPicHeight,16)
编码重构帧复用参考帧亮度内存模式
H264eRcnEqualRef | 所需内存大小 |
---|---|
1 | 参考帧压缩时:BlkSize =HeadSize + YSize + 2CSize;参考帧非压缩时:BlkSize= Ysize +2 CSize; |
|0|参考帧压缩时:BlkSize =2* (HeadSize + YSize + CSize);
参考帧非压缩时:BlkSize= 2* (Ysize + CSize);|
最后
以上就是乐观中心为你收集整理的海思SDK学习(7)海思媒体处理软件平台MMP(6)视频编码VENC视频编码的全部内容,希望文章能够帮你解决海思SDK学习(7)海思媒体处理软件平台MMP(6)视频编码VENC视频编码所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复