核心内容摘要
邂逅“美女吃78”,开启味蕾的奇幻之旅
视频为什么要编码在我们做音视频产品的时候经常会把音视频数据进行网络传输而此时音视频数据就需要进行 编码(所谓编码就是指压缩)。
因为在网络传输的时候网络带宽有限若此时网络传输的时候还用 原始数据进行传输的时候则会对网络带宽造成极大的负担。
比方说一个分辨率为1280 * 720 帧 率为30帧的视频按照YUV420格式的计算它每秒传输的数据量就是1280* 720* 30 * 3/2 ~
3
5M这个数据量是极其惊人的。
所以此时我们就要引入视频编码技术来压缩视频让其体 积大小能够大幅度缩小这样在网络传输的时候就会大大降低网络负担。
在音视频开发中一般 分为H
H265这两种最常见的编码格式。
H264的压缩比能够达到1100H265的压缩比能够达到1:200但是目前业内由于HEVC技术还没完全成熟所以绝大部分设备都是用H264进行压 缩处理。
YUV 420 的 每像素平均字节数
5因为 Y 每个像素 1 字节UV 合起来平均
5 字节/像素帧大小1280×720×
5921600×
51382400 字节每秒字节数1382400×3041472000 字节/秒转换成 Mbps注意1 Mbps 1,000,000 bits/s不是 1024×102441472000 字节/秒×8 比特/字节331776000 bps331776000÷106≈
3
8 Mbps331776000÷106 ≈
3
8 Mbps
H
VCL层和NALH264编码格式是目前业内最流行的视频编码格式它是MPEG-4的第十个部分。
H264具有高压缩 率、高图像质量、网络适应性很强等特点。
在同等的图像质量下H264的压缩比远超绝大部分编 码格式(HEVC**除外)。
在H264(HEVC)编码框架中分为两大层一层是VCL(Video Coding Layer)、另外一层是NAL层(Network Abstraction Layer)。
VCL层主要负责内容的表示(如下 图)NAL层主要负责对H264数据进行打包和传输
VCL层(Video Coding Layer)VCL层包含了四个比较重要的知识点分别是帧内预测压缩、帧间预测压缩、变换量化、熵编码帧内压缩也称之为空间压缩当压缩一张图片的时候若仅仅考虑帧的数据也不考虑相邻帧和帧之间的冗 余数据这样的方式就叫帧内压缩。
在H264中I帧生成的原理就是帧内压缩帧内压缩可以独立解码出一帧完整的图像而不需要参考任何帧帧内压缩表现出来的数据是最大16 x 16的宏块(它也 包括4x48x
。
帧内压缩本质上是在空间的XY轴上进行压缩它的压缩率比较小。
下面9张图是9种不同的预测方式帧间压缩帧间压缩是通过对比相邻两帧之间的数据进行压缩并且进一步提高压缩量。
用这种方法可以先 编码出一个完整的图像1帧紧接着2帧的数据就不编码出一张完整的图像而是只写入和1帧的不同的数据这样2帧数据的大小则会大大降低。
以此类推3帧的数据参考2帧数据并且也只写入2帧不同的数据帧间压缩表现出来的数据同样也是最大16 x 16的宏块(它也包括4x4 8x
。
按照这样的方法不停地循环下去。
这样的方式就是P帧、B帧的实现方法变换量化为了要让压缩的H264图像在网络传输中节省更多的码率需要采用变换编码以及量化技术来消除 图像信号中的相关性以及减小图像编码中的动态变换范围。
变换编码的原理就是把图像时域信号 变换成频域信号在频域范围内绝大部分信号集中在低频区域相对时域信号码率能够大幅 度下降。
而在H264中通常用下面方法进行处理H264数据经过帧内压缩(16 * 16亮度、4 * 4 亮度、8 * 8亮度)、帧间预测(4 * 4 ~ 16 * 16亮度)得到了残差值。
这些残差值需要经过冗余的统 计并进行数据的变换和量化操作。
注意对于H264的16 x 16的亮度块通过4x4的前向DCT变换然后对16个DC系数再进行4 x4 的 Hadmard变换最后把这16个DC系数进行量化。
而对于8x8的色度块则进行4x4的DCT变换后得到4个DC和60个AC系数并对DC系数进行2x2的 Hadmard变换。
变换后则对DC系数和AC系数进行量化操作。
要值得注意的是由于变换块越大编码的效率越高图像的还原度越好。
所以为了让其编码质量 得到更好的效果在H264的高清(HD)档次它支持8x8的DCT变换并且不需要对DC系数进行 Hadmard变换DCT变换后则对DC和AC系数进行统一处理。
熵编码熵编码压缩是一种无损压缩模式其
实现原理是使用的编码模式来表示输入的数据并达到压缩 效果。
常用的熵编码方式分别是变长编码(CAVLC)和算术编码(CABAC)。
变长编码(CAVLC)对出现概率大的符号对出现概率小的符号提供长字节二进制码。
算术编码(CABAC)采用一个浮点数代替一串输入符号范围是[0,
CABAC的编码压缩率远远大于CAVLCCABAC具有更高的编码效果。
NAL层(Network Abstraction Layer)负责以网络所要求的方式进行打包和传送NAL层一般由三部分组成分别是StartCode(起始码必须是00 00 00
、NALU Header(NALU 头部)、NALU Payload(具体传输的视频内容)比方说一串H264码流的NALU00 00 00 01 68 43 A0 25 56 2E...[00 00 00 01]是StartCode也就是起始码[68] 是NAL头部[43 A0 25 56 2E...]就是NALU Payload的数据StartCode起始码起始码是所有H264码流开始时候的分隔符一般分为0x000001和 0x00000001两种NAL头部NALU头部长度为一个字节它的语法是NALU类型(5bit)、重要性位(2bit)、禁止 位(1bit)比方说NALU头部是0x68转换为二进制数据就是0110
这表示禁止位为0NAL重要性为11(最重要)01000换算成HEX格式就是8也就是PPS。
NALU Payload具体的视频内容
H264重点帧
帧的概念在视频中帧是视频传输的最小单位。
一帧实际上静态图片视频本质上是由连续的静态图片组 成我们经常耳熟能详的30帧、60帧实际上指的就是静态图片的数量。
比方说30帧它指的是1 秒内有30张静态图片而60帧它指的是1秒内有60张静态图片。
换言之帧率越高它所生成 的静态图片就越多视频质量就越好、视频的流畅度也更好。
在H264中最重要的NALU是SPS、PPS、SEI、I帧。
下面是一个经典的NALU一般而言H264开头都是 以SPS、PPS为开头若SEI有数据则添加SEI数据(SEI帧可有可无)紧接着就是I帧SPSSequence Parameter Set 全称是序列参数集(它的NALU是00 00 00 01
它保存了一组编码视频序列的全局参数。
也就是原始视频经过压缩编码后组成的序列而每一帧编码数据它所依赖的全局参数就保存到图像参数集里面。
通常来说SPS和PPS都是整个NALU的起始位置。
ppsPicture Parameter Set 图像参数集合(PPS它的NALU是它的NALU是00 00 00 01
。
在一般的情况PPS经常和SPS联合在一起保存到视频文件的头部里面。
SEISupplemental Enhancement Information 补充增强信息是一种用于视频流传输中的额外附加信息(它在传输的时候可有可无)SEI是H264标准的一部 分。
SEI可以传输多种类型的信息如字幕、时间戳等信息。
SEI信息通过H264码流传输到解码器解码器通过解析SEI对视频进行后处理操作。
I帧I帧Intra-coded frame 帧内编码帧就是我们常说的关键帧(NALU00 00 00 01
它不需要参考任何帧就可以拥有一副完整的 画面。
(帧内压缩)P帧P帧Predictive-coded frame 预测编码帧是前向预测帧它需要根据本帧和相邻的前一帧(I帧或P帧)的不同点来压缩本帧数据。
从上面这张图我们可以看出来P帧(1号)的压缩数据需要参考I帧的数据进行视频的压缩而P帧(2号)需要参考P帧(1号)的数据进行视频压缩。
换言之P帧它需要不停地参考前面帧的数据才能够压缩本帧数 据。
B帧B帧Bi-directionally predictive-coded frame 双向预测编码帧属于双向预测的帧它需要根据相邻的前一帧数据、以及后一帧数据的不同点来压缩本帧换 言之B帧只记录本帧和前后帧的差值。
B帧的压缩比是三种帧里面最高的压缩比能够达到 200:1。
B帧常用在高清电影的和蓝光影响的录制。
GOP
GOP概念GOP(Group of Pictures中文名称是图像组)它是把一个图像序列中连续几个图像组成一个小组 它本质上是两个I帧的距离。
通常来说GOP的长度越长P帧/B帧的数量就会越多压缩比更高画面质量越好所以在音视频开发中经常会用GOP的长度来改善画面质量。
上面这张图是通过H264解析工具StreamEye来获取到对应H264的GOP信息可以看到每一个画矩形框的部分就是I帧。
从这张图的数据来看每个I帧的间隔都是30这一点可以从下面statistcs数据的I distance参数可以看到。
GOP类别GOP分为两种一种是闭合GOP另外一种是开放GOP闭合GOP闭合GOP是指不对外开放的GOP结构它的特点是GOP内的帧不可以参考其前后其他的帧闭合GOP一般都是以I帧开头开放GOP允许其内的帧参考其他GOP内的帧一般而言在有B帧的情况下才会出现open-gop。
如下图末尾的两个B帧需要依赖下一个GOP中的I帧进行解码。
GOP的长度设置GOP的设置一般是帧率的整数倍。
比方说视频的帧率是30帧则GOP的长度最好设置为
60等。
若帧率是60则把GOP设置为