android音视频基础
一、编码目的
编码的目的:压缩,各种音视频的编码方式就是为了让视频体积更小,有利于存储和传输。编码的核心四想就是去除冗余信息。
二、编码思路
1.空间冗余
图像内部相邻元素之间存在较强的相关性,造成信息的冗余。(一块区域颜色一样)
2.时间冗余
相邻视频帧具有较大的相关性,造成信息的冗余。(第一帧和第二帧绝大多数数据一样)
3. 视觉冗余
人类不敏感的信息可以去除。(红色偏点橘色)
4.信息熵冗余 == 熵编码-哈夫曼算法
也称编码冗余,人们用于表达某一信息所需要的比特数总比理论上表示该信息所需要的最少比特数要大,它们之间的差距就是信息熵冗余,或称编码冗余。
5.知识冗余 == 人类(头 身体 腿),汽车,房子 不需要记录
是指在有些图像中还包含与某些验证知识有关的信息。
6.I帧、P帧、B帧压缩思路
I帧:帧内编码帧,关键帧,I帧可以看作一个图像经过压缩之后的产物,可以单独解码出一个完整的图像;(压缩率最低)
P帧:前向预测/参考 编码帧,记录了本帧跟之前的一个关键帧(或P帧)的差别,解码时需要用之前缓存的画面叠加上本帧定义的差别,生成最终画面。 (压缩率比I帧高,比B帧低 属于 适中情况)
B帧:双向预测/参考 编码帧,记录了本帧与前后帧的差别,解码需要参考前面一个I帧或者P帧,同时也需要后面的P帧才能解码一张完整的图像。 (参考前后的预测得到的,压缩率是最高,但是耗时)
三、编码标准
1.组织
- 国际电信联盟:H.264、H.265
- MPEG系列标准:MPEG1、MPEG2、MPEG4、AVC
AVC == H.264
HEVC == H.265
2.视频编码概念
通过指定的压缩技术,把某一种视频格式文件,转换成另一种视频文件格式文件的方式。
3. H.264分层结构(VCL和NAL)
VCL
VCL(viedo coding layer,视频编码层):负责高效的视频内容展示。
VCL数据:编码处理的输出,被压缩编码后的视频数据序列。
NAL
NAL(Network Abstraction Layer,网络提取层):以网络所要求的恰当方式对数据进行打包传送,是传输层。不管是网络还是本地都需要通过这一层来传输。
NAL = 一个字节的片头 + 若干的片数据
传输的是NAL
4. H.264的输出结构
H.264编码器默认的输出为:起始码+NALU。
起始码:0x00000001和0x000001
0x00000001:NALU里有狠多片
0x000001:NALU里只有一片。
5.举例分析H.264文件格式。
SPS 序列参数集(记录有多少I帧,多少B帧,多少P帧,帧是如何排列) == 7
00 00 00 01 67,0x67 ---> 2进制01100111 ---> 取低五位 00000111 ---> 十六进制 0x07
PPS 图像参数集(图像宽高信息等) == 8
00 00 00 01 68, 0x68 ---> 2进制01101000---> 取低五位 00001000 ---> 十六进制 0x08
SEI补充信息单元(可以记录坐标信息,人员信息, 后面解码的时候,可以通过代码获取此信息)https://blog.csdn.net/y601500359/article/details/80943990
00 00 01 06 , 0x06 ---> 2进制00000110---> 取低五位00000110 ---> 十六进制 0x06
I帧
00 00 00 65, 0x65 ---> 2进制01100101---> 取低五位00000101 ---> 十六进制 0x05
最终是 5 I帧完整画面出来
P帧
61 -->0x01 重要P帧
41 -->0x01 非重要P帧
B帧
01 -->0x01 B帧
6.PTS和DTS
DTS:解码时间戳,在什么时候解码这一帧的数据。
PTS:显示时间戳,在什么时候显示这一帧数据。
在没有B帧的时候,DTS和PTS是一样的顺序。
因为B帧的解码需要靠前一帧和后一帧,只要有B帧DTS和PTS就一定会乱。
GOP:I帧+ 下一个I帧之前的所有B帧和P帧。
i帧=GOP是什么理解的?
SPS PPS I P B P B P B P B I 一组 SPS PPS I P B P B P B P B I 二组