RGA模块
RGA模块定义
RGA模块是RV1126用于2D图像的裁剪、缩放、旋转、镜像、图片叠加等格式转换的模块。比方说:要把一个原分辨率1920 * 1080的视频压缩成1280 * 720的视频,此时就要用到RGA模块了。
RGA模块结构体定义
RGA区域属性结构体
imgType:图像格式类型
u32X:RGA的X轴坐标
u32Y:RGA的Y轴坐标
u32Width:RGA的宽度
u32Height:RGA的高度
u32HorStride:虚宽,一般和宽度一样
u32VirStride:虚高,一般和高度一样
rga属性结构体
stImgIn:输入图像信息,一般填写的是原分辨率参数。比方说CMOS摄像头分辨率是1920*1080,则stImgIn分辨率就是1920*1080
stImgOut:输出图像信息,一般填写的是原分辨率参数。比方说要输出的是1280 * 720,则stImgOut分辨率就是1280 * 720
u16Rotation: 旋转角度,取值范围0, 90 ,180, 270
bEnBufPool:使能缓冲池
u16BufPoolCnt:缓冲池计数
获取RGA的数据并保存
步骤如下:
初始化VI模块
设置VI模块并使能
启动VI模块
初始化RGA模块
绑定VI和RGA模块
创建线程
销毁
视频编码原理讲解一:VCL层和NAL层的讲解
视频为什么要编码
在我们做音视频产品的时候,经常会把音视频数据进行网络传输,而此时音视频数据就需要进行编码(所谓编码就是指压缩)。因为在网络传输的时候,网络带宽有限,若此时网络传输的时候还用原始数据进行传输的时候,则会对网络带宽造成极大的负担。比方说一个分辨率为1280 * 720 帧率为30帧的视频,按照YUV420格式的计算,它每秒传输的数据量就是1280* 720* 30 * 3/2 ~= 39.5M,这个数据量是极其惊人的。所以此时,我们就要引入视频编码技术来压缩视频,让其体积大小能够大幅度缩小,这样在网络传输的时候就会大大降低网络负担。在音视频开发中,一般分为H264、H265这两种最常见的编码格式。H264的压缩比能够达到1:100,H265的压缩比能够达到1:200,但是目前业内由于HEVC技术还没完全成熟,所以绝大部分设备都是用H264进行压缩处理。
VCL层和NAL层的讲解
H264编码格式是目前业内最流行的视频编码格式,它是MPEG-4的第十个部分。H264具有高压缩率、高图像质量、网络适应性很强等特点。在同等的图像质量下,H264的压缩比远超绝大部分编码格式(HEVC除外)。在H264(HEVC)编码框架中分为两大层,一层是VCL(Video Coding Layer)、另外一层是NAL层(Network Abstraction Layer)。VCL层主要负责内容的表示(如下图),NAL层主要负责对H264数据进行打包和传输.
VCL层的知识点
帧内压缩
也称之为空间压缩,当压缩一张图片的时候,若仅仅考虑帧的数据也不考虑相邻帧和帧之间的冗余数据,这样的方式就叫帧内压缩。在H264中I帧生成的原理就是帧内压缩,帧内压缩可以独立解码出一帧完整的图像而不需要参考任何帧,帧内压缩表现出来的数据是最大16 x 16的宏块(它也包括:4x4,8x8)。帧内压缩本质上是在空间的XY轴上进行压缩,它的压缩率比较小。下面9张图是9种不同的预测方式.
帧间压缩
帧间压缩是通过对比相邻两帧之间的数据进行压缩,并且进一步提高压缩量。用这种方法可以先编码出一个完整的图像1帧,紧接着2帧的数据就不编码出一张完整的图像,而是只写入和1帧的不同的数据,这样2帧数据的大小则会大大降低。以此类推,3帧的数据参考2帧数据,并且也只写入2帧不同的数据,帧间压缩表现出来的数据同样也是最大16 x 16的宏块(它也包括:4x4,8x8)。按照这样的方法,不停地循环下去。这样的方式,就是P帧、B帧的实现方法。
变换量化
为了要让压缩的H264图像在网络传输中节省更多的码率,需要采用变换编码以及量化技术来消除图像信号中的相关性以及减小图像编码中的动态变换范围。变换编码的原理就是把图像时域信号变换成频域信号,在频域范围内,绝大部分信号集中在低频区域,相对时域信号,码率能够大幅度下降。而在H264中通常用下面方法进行处理:H264数据经过帧内压缩(16 * 16亮度、4 * 4亮度、8 * 8亮度)、帧间预测(4 * 4 ~ 16 * 16亮度)得到了残差值。这些残差值需要经过冗余的统计,并进行数据的变换和量化操作。
熵编码
熵编码压缩是一种无损压缩模式,其实现原理是使用的编码模式来表示输入的数据,并达到压缩效果。常用的熵编码方式分别是变长编码(CAVLC)和算术编码(CABAC)。
变长编码(CAVLC):对出现概率大的符号,对出现概率小的符号提供长字节二进制码。
算术编码(CABAC):采用一个浮点数代替一串输入符号,范围是[0,1)
具体的参考(https://blog.csdn.net/yanceyxin/article/details/82965656)
CABAC的编码压缩率远远大于CAVLC,CABAC具有更高的编码效果。
视频编码原理讲解二:H264重点帧和GOP的讲解
帧的概念
在视频中,帧是视频传输的最小单位。一帧实际上静态图片,视频本质上是由连续的静态图片组成,我们经常耳熟能详的30帧、60帧实际上指的就是静态图片的数量。比方说30帧:它指的是1秒内有30张静态图片;而60帧,它指的是1秒内有60张静态图片。换言之,帧率越高,它所生成的静态图片就越多,视频质量就越好、视频的流畅度也更好。
I帧
I帧就是我们常说的关键帧(NALU:00 00 00 01 65),它不需要参考任何帧就可以拥有一副完整的画面。
P帧
P帧是前向预测帧,它需要根据本帧和相邻的前一帧(I帧或P帧)的不同点来压缩本帧数据。下面是P帧的图解:
从上面这张图我们可以看出来,P帧(1号)的压缩数据需要参考I帧的数据进行视频的压缩,而P帧(2号)需要参考P帧(1号)的数据进行视频压缩。换言之,P帧它需要不停地参考前面帧的数据才能够压缩本帧数据。
B帧
B帧属于双向预测的帧,它需要根据相邻的前一帧数据、以及后一帧数据的不同点来压缩本帧,换言之B帧只记录本帧和前后帧的差值。B帧的压缩比是三种帧里面最高的,压缩比能够达到200:1。B帧常用在高清电影的和蓝光影响的录制。
GOP的概念
GOP(Group of Pictures,中文名称是图像组)它是把一个图像序列中连续几个图像组成一个小组,它本质上是两个I帧的距离。通常来说,GOP的长度越长P帧/B帧的数量就会越多,压缩比更高,画面质量越好,所以在音视频开发中经常会用GOP的长度来改善画面质量。
闭合GOP
闭合GOP是指不对外开放的GOP结构,它的特点是GOP内的帧不可以参考其前后其他的帧,闭合GOP一般都是以I帧开头
开放GOP
允许其内的帧参考其他GOP内的帧,一般而言在有B帧的情况下才会出现open-gop
GOP的设置
一般是帧率的整数倍。比方说视频的帧率是30帧,则GOP的长度最好设置为30、60等。若帧率是60,则把GOP设置为60、120等。
视频编码原理讲解三:视频码率和视频码率控制模式
码率的概念
视频码率是数据传输时单位时间内传输的数据位数,对于视频来说视频码率的单位是kbps(千比特率)每秒。简单说,码率就是取样率,码率越高画面质量精度越高,处理的文件或者码流就越接近原始文件。视频码率传输的大小跟分辨率是息息相关的
什么是码率控制模式
码率控制指的是利用编码中的一些特殊手段控制图像的压缩比例,使其画面质量在不同的场景中保持一个最优的状态。RV1126的码率控制方式,总共分为三种:分别是CBR固定码率控制模式、VBR可变码率控制模式、AVBR码率控制模式。
CBR固定码率控制模式
CBR指的是固定比特率,它指的是在统计时间内编码码率处于平稳状态。这种方式的特点是码率调节会相对比较缓慢,它不会跟着图像的质量的波动去改变码率。CBR控制模式一般用于网络流媒体视频编码。CBR的优点在于压缩速度非常快,并且码率很平稳不会出现码率跳变的情况。但缺点也很明显,就是它不会根据画面的波动对码率进行节省,这样的话会导致每秒空间的浪费。在RV1126的API里面,CBR一般用平均比特率去表示。
VBR可变码率控制模式
VBR指的是动态码率,它的作用是在统计时间内允许编码编率出现波动,这种波动可以使得编码图像质量变高。VBR的特点是它是随着图像的复杂程度的不同而变化。假设在编码到简单图像的时候它会节省码率,而如果编码到一些相对复杂的图像它的码率将会提升,VBR模式一般使用在DVD、蓝光、HD录播上面。VBR同样也有优缺点,VBR的优点是它的尽可能保证整个图像编码质量,利用VBR编码的图像很少会出现马赛克、画面丢失的情况。但缺点同样也很明显,使用VBR编码出来的图像它的体积是不固定的。所以,它会根据画面的复杂程度去决定视频文件的大小,另外还有的是使用VBR进行编码的时候它的编码算法复杂度会变高,这就会导致解码端的复杂度升高。
AVBR码率控制模式
AVBR全称叫适配式可变码率控制方式,它的很多思想跟VBR基本上是一致的。但它比VBR强大的一点是这种控制方式能够自动检测当前编码场景是静止画面还是运动画面。若当前画面是静止画面则会主动降低码率、若当前画面是运动画面则会把码率主动提升。AVBR适用于当前编码视频静止画面和运动画面频繁出现的场景,所以AVBR码率控制方式经常用在大型体育比赛上面。
RV1126的视频编码模块的讲解
VENC模块的介绍
VENC模块是RV1126专门用于视频编码的模块,VENC模块提供了多种编码方式,分别是:H264/H265/MJPEG/JPEG。而在此次编码模块中,我们重点是讲解H264、H265编码模块(MJPEG/JPEG用的不多,所以就不作详细讲解)。
VENC结构体的定义
VENC_CHN_ATTRS是管理整个VENC模块的管理结构体,这里面它包含三个VENC子类结构体:分别是VENC_ATTR_S结构体(编码器基础属性结构体)、VENC_RC_ATTR_S结构体(编码码率控制属性结构体)、VENC_GOP_ATTR_S结构体(编码器GOP属性结构体)。
VENC_ATTR_S结构体(编码器基础属性结构体)
这个结构体主要是设置编码器的基础属性,比方说:分辨率、编码器类型、Profile等等
enType
编码器协议类型,下面是画框部分就是它支持的视频编码类型:包括RK_CODEC_TYPE_H264、RK_CODEC_TYPE_H265、RK_CODEC_TYPE_JPEG、RK_CODEC_TYPE_MJPEG
imageType
输入图像类型,venc的imageType和VI的imageType必须保持一致
u32VirWidth
编码图像的虚宽,一般虚宽和宽度保持一致
u32VirHeight
编码图像的高度,一般高度和高度保持一致
u32Profile
H264支持66:baseline、77: MP、100:HP。H265支持default:Main;
bByFrame
RW,范围是[0,1],默认是0
u32PicWidth
编码图像宽度
u32PicHeight
编码图像高度
enRotation
图像旋转角度,VENC_ROTATION_0, VENC_ROTATION_90, VENC_ROTATION_180,VENC_ROTATION_270。
编码器额外属性
VENC_ATTR_H264_S、VENC_ATTR_H265_S、VENC_ATTR_MJPEG_S、VENC_ATTR_JPEG_S
VENC_RC_ATTR_S结构体(编码码率控制属性结构体)
这个结构体主要设置码率控制属性,这其中包括:enRcMode、stH264Cbr(H264的CBR码率控制模式)、stH264Vbr(H264的VBR码率控制模式)、stH264Avbr(H264的AVBR码率控制模式)、stMJpegCbr(MJPEG的CBR模式)、stMJpegVbr(MJPEG的VBR模式)、stH265Cbr(H265的CBR码率控制模式)、stH265Vbr(H265的VBR码率控制模式)、stH265Avbr(H265的AVBR码率控制模式)
enRcMode:码率控制类型,下面是不同编码的控制码率类型(注意:编码类型必须要和码率控制的编码类型要一致,比方说:若enType是H264,那enRcMode对应的码率控制结构体是stH264Cbr、stH264Vbr、stH264Avbr结构体)。
2.2.6.1. u32SrcFrameRateNum:数据源帧率分子
2.2.6.2.u32SrcFrameRateDen:数据源帧率分母
2.2.6.3.u32DstFrameRateNum:目标帧率分子
2.2.6.4. u32DstFrameRateDen:目标帧率分子
2.2.6.5. u32BitRate:平均码率,取值范围[2000, 98000000]bps(比特数)
2.2.8. stH265Cbr:H265的CBR码率控制结构体
VENC_H265_CBR_S结构体的参数和VENC_H264_CBR_S参数一致
2.2.9. stH265Vbr:H265的VBR码率控制结构体
VENC_H265_VBR_S结构体的参数和VENC_H264_VBR_S参数一致
2.2.10. stH265AVbr:H265的VBR码率控制结构体
VENC_H265_AVBR_S结构体的参数和VENC_H264_AVBR_S参数一致
VENC_GOP_ATTR_S结构体(编码器GOP属性结构体)
这个结构体主要是设置编码器的GOP属性
2.3.1.1. VENC_GOPMODE_NORMALP:普通GOP模式
2.3.1.2. VENC_GOPMODE_TSVC:TSVC模式
2.3.1.3. VENC_GOPMODE_SMARTP:智能SMARTP模式
2.3.2. u32GopSize:编码GOP大小,可以理解为关键帧间隔数量
2.3.3. s32IPQpDelta:I帧相对于P帧的QP差值
2.3.4. u32BgInterval:长期参考帧间隔(SMARTP模式才会用到)
2.3.5. s32ViQpDelta:虚拟I帧相对于普通P帧的QP差值
通过多线程获取VENC的H264码流数据
步骤流程
VI模块不在演示,跟上面都是一样的
初始话VENC模块
绑定VI和VENC模块
创建线程
销毁
H265码流结构的分析
H265的优势和特点
H265编码(也称之为HEVC编码),它是继H264之后所制定的一个全新的视频编码标准。H265保留了许多H264的技术,并在H264的基础上使用了全新的技术来改善编码质量和画面质量。H265的优势在于超高的压缩比(压缩比高达1:200)编码超高清的分辨率,如:4K分辨率(3840 * 2160)、8K分辨率(7680 * 4320),一般只有在编码超高清分辨率的时候才会用到H265编码,普通的分辨率如:1920 * 1080以下的分辨率只需要H264即可(这是由于H265虽然压缩比非常高,但是它的算法复杂程度也远超H264,对于一般播放器来说CPU运算也过于复杂)。
H265的帧内预测
H265的帧内预测比H264更加灵活,H264帧内预测只支持16 * 16的宏块。但是H265能够支持支持多种尺寸的宏块预测,包括4 * 4、8 * 8、16 * 16、32 * 32多种宏块的预测。 下面我们来看看,两种编码格式的区别。
通过多线程同时获取H264和H265码流
步骤流程