音视频理论知识
音视频理论知识
封装格式
什么是封装格式
视频封装格式也叫做容器,它是将已经编码压缩好的视频流、音频流以及字幕按照一定的方式放到一个文件中,方便播放软件播放。一般来说,视频文件的后缀名就是它的封装格式。
解码/编码
视频经过H.264解码器视频解码成视频原始数据YUV,YUV经过转换成ARGB8888,最后通过屏幕渲染 音频经过AAC进行音频解码,解码成音频原始数据PCM,最后通过喇叭进行播放声音,(音频重采样,双声道转单声道)
为什么要进行编码?
视频是连续的图像序列,由连续的帧构成,一帧即为一副图像 由于人眼的视觉暂留效应,当帧序列以一定的速率播放时,我们看到的就是动作连续的视频 这么多的连续图像数据如果不经过编码数据量就很大。
比如一个19201080分辨率,每秒30帧的视频,一秒钟需要192010803032 大小大概为237Mb的数据
编码的目的
编码的目的,就是为了压缩数据,有利于存储和传输,编码的核心思想就是去除冗余信息 冗余信息有以下几点:
- 空间冗余->图像内部相邻像素之间存在较强的相关性(相邻像素重复)
- 时间冗余->视频图像序列中的不同帧之间的相关性(帧之间差值)
- 视觉冗余->人眼不敏感的图像信息
视频解码流程图

音频编码流程图

I帧 B帧 P帧
I帧:帧内编码帧,关键帧,I帧可以看作一个图像经过压缩之后的产物,可以单独解码出一个完整的图像(压缩率最低)
P帧:向前预测/参考 编码帧,记录了本帧跟之前的一个关键帧(或P帧)的差别,解码时需用之前缓存的画面叠加上本帧定义的差别,生成最终的画面
B帧:双向预测/参考 编码帧,记录了本帧与前后帧的差别,解码需要参考前面一个I帧或者P帧,同时也需要后面的P帧才能解码一张完整的图像
H.264分成结构(VCL与NAL)
VCL(网络编码层):负责高效的视频内容表示 VCL就是被压缩编码后原始数据,在VCL数据封装到NAL单元中之后,才可以用于传输或存储。
NAL(网络提取层):负责以网络所要求的恰当的方式对数据进行打包和 传送,是传输层。不管在本地播放还是网络播放,都要通过这一层来传输。
分层框架图

NAL(片(宏块))
一帧图片经过 H.264 编码器之后,NAL单元就是装载着这些片(被编码为一个或多个片 slice), 每片包 含整数个宏块(至少一个宏块,最多包含整个图像宏块)。

一般H.264编码器的默认输出为:起始码+NAL单元
起始码为:0x00000001或者 0x000001
为什么需要起始码
因为每个NALU都要分割,才能识别进行传输
为什么有两个起始码
0x000001代表一个nalu里面一个片可以搞定 0x00000001代表一个nalu里面有很多个片
NAL单元分析
传输使用NAL单元 一个NAL包括(起始码+类型+数据) 起始码(两种) 类型8位 01100111 第一位:1 不可以用 0 可用 第2,3位:11代表这个帧很重要 第4-8位:16进制 查表(7->sps)

sps 00 00 00 01 启始码 67 01100111 取低5位-> 00000111-> 7 -> 序列参数集(记录多少个I帧,B帧,P帧) pps 00 00 00 01 启始码 68 01101000 取低5位-> 00001000->8->图像序列集(图像宽高信息等)
sel 00 00 01 启始码 06 00000110 取低5位 ->00000110->6 -> 补充增强信息单元(SEL)(可以记录坐标信息,人员信息,后面解码的时候,可以通过代码获取此信息)

I帧 00 00 01 65 00 00 01 启始码 65->01100101->低5位00000101-> 5->(IDR图像中的片,I帧完整画面)

P帧 00 00 01 41(不重要的P帧) 41->01000001->取2,3位 10->代表不重要的帧->低5位->1(非IDR图像的片) 00 00 01 61(重要的P帧) 61->01100001->取2,3位 11->代表是重要的帧->低5位->1(非IDR图像的片)

B帧 00 00 01 01(B帧) 01->00000001->取2,3位 00->代表不重要的帧->低5位->1(非IDR图像的片)

真实开放只分析:SPS,PPS,I帧,
PTS&DTS&GOP序列 DTS: 表示解码时间戳,在什么时候解码这一帧的数据 PTD: 表示显示时间戳,在什么时候显示这一帧 在没有B帧的情况,DTS和PTS的输出顺序是一样的 因为B帧打乱了解码和显示的顺序(要解码B帧需要先解码后面的P帧),所以一旦存在B帧,PTS和DTS就不同
GOP序列
SPS PPS I P B P B P B I 一组
SPS PPS I P B P B P B I 二组