1.音视频解码播放流程
.mp4、.avi、.rmvb等格式文件是用于封装音频流和视频流的。ffmpeg在处理该类视频的流程如下,首先会解封装,将封装格式的音视频文件分成音频压缩数据和视频压缩数据。音频压缩数据然后通过解码转化为音频原始数据,最后通过音频重采样,将双声道音频转化为单声道经过扬声器播放出来;视频压缩数据通过视频解码转化为视频原始数据,然后将YUV格式的原始数据转化为RGBA通过显示器显示出来。
2.音视频录制过程
音视频录制过程和播放过程是恰恰相反的过程。麦克风采集到pcm原始数据之后经过音频编码成acc压缩文件;原始视频文件通过编码成H.264格式的压缩数据。最后通过封包封装成mp4等视频格式
3.视频源码原理
视频是连续的图像序列,由连续的帧构成,一帧即为一幅图像。由于人眼的视觉暂留效应,当帧序列以一定的速率播放时,我们看到的就是动作连续的视频。这么多连续的图像数据如果不经过编码的数据量太大了。
比如一个1920x1080分辨率,32位,四个字节(RGBA),每秒30帧的视频,一秒钟需要1920x1080x4x30,大小大概为243MB数据。因此,视频需要编码压缩后保存。
3.1 空间冗余
空间冗余:图像内部相邻像素之间存在较强的相关性多造成的冗余。
3.2 时间冗余
时间冗余:视频图像序列中的不同帧之间的相关性所造成的冗余。
3.3 视觉冗余
视觉冗余:是指人眼不能感知或不敏感的那部分图像信息。人类对颜色的亮度不敏感,对颜色值敏感。
3.4 信息熵冗余
信息熵冗余:也称编码冗余,人们用于表达某一信息所需要的比特数总比理论上表示该信息所需要的最少比特 数要大,它们之间的差距就是信息熵冗余,或称编码冗余。
3.5 知识冗余
知识冗余:是指在有些图像中还包含与某些验证知识有关的信息
4.帧的概念
视频中的帧分为I帧、B帧、P帧
- I帧:帧内编码帧,关键帧,I帧可以看作一个图像经过压缩之后的产物,可以单独解码出一个完整的图像; (压缩率最低)
- P帧:前向预测/参考编码帧,记录了本帧跟之前的一个关键帧(或P帧)的差别,解码时需要用之前缓存的画 面叠加上本帧定义的差别,生成最终画面。 (压缩率比I帧高,比B帧低,属于适中情况)
- B帧:双向预测/参考 编码帧,记录了本帧与前后帧的差别,解码需要参考前面一个I帧或者P帧,同时也需要 后面的P帧才能解码一张完整的图像。 (参考前后的预测得到的,压缩率是最高,但是耗时)
5. H.264数据分析
5.1 H.264分层结构(VCL与NAL)
- VCL(Video Coding Layer,视频编码层):负责高效的视频内容表示, VCL数据即编码处理的输出,它表示被压缩编码后的视频数据序列。
- NAL(Network Abstraction Layer,网络提取层):负责以网络所要求的恰当的方式对数据进行打包和 传送, 是传输层。不管在本地播放还是网络播放,都要通过这一层来传输。
NAL片:一帧图片经过 H.264 编码器之后,NAL单元就是装载着这些片(被编码为一个或多个片 slice), 每片包
含整数个宏块(至少一个宏块,最多包含整个图像宏块)。
H.264编码器的默认输出为:起始码+NALU(Nal单元)。起始码为:0x00000001或者0x000001,可以通过010editor工具看到。一个NALU包含:PPS, I帧,B帧,P帧。
起始码主要用于每一个NALU之间的分割:
- 0x00000001 起始码代表:一个NALU里面有很多片。
- 0x000001 起始码代表: 一个NALU里面一个片。
每一个NALU包含:起始码
+ 1个字节的Nal Header
+ 若干整数字节的负荷数据EBSP
构成。
nal_unit_type | nal类型 |
---|---|
0 | 未使用 |
1 | 不分区,非IDR图像的片 |
2 | 片分区A |
3 | 片分区B |
4 | 片分区C |
5 | IDR图像中的片 |
6 | 补充增强信息单元(SEI) |
7 | 序列参数集(SPS) |
8 | 图像参数集(PPS) |
9 | 分隔符 |
10 | 序列结束 |
11 | 码流结束 |
12 | 填充 |
13-23 | 保留 |
14-31 | 未使用 |
nal头部分为八位:01100111
第1位禁止位,值为1表示语法出错
第2~3位为参考级别(重要级别)
第4~8为是nal单元类型
其中0x67的二进制码为:
0110 0111
4-8为00111,转为十进制7,7对应序列参数集SPS
其中0x68的二进制码为:
0110 1000
4-8为01000,转为十进制8,8对应图像参数集PPS
其中0x65的二进制码为:
0110 0101
4-8为00101,转为十进制5,6代表重要,5对应IDR图像中的片(I帧)
其中0x61/0x41的二进制码为:
0110 0001 / 0100 0001
4-8为00001,转为十进制1,6和4代表重要,1对应非IDR图像中的片(P帧)
其中0x01的二进制码为:
0000 0001
4-8为00001,转为十进制1,0代表不重要,1对应非IDR图像中的片(B帧)
6.PTS与DTS
DTS表示解码时间戳,在什么时候解码这一帧的数据;PTS表示显示时间戳,在什么时候显示这一帧。
在没有B帧的情况下,DTS和PTS的输出顺序是一样的。因为B帧打乱了解码和显示的顺序(要解码B帧需要先解码后面的P帧),所以一旦存在B帧,PTS和DTS就会不同。
GOP是用于表示两个I帧之间的分组。例如:I P B P B P B P B I 一组