音视频理论知识

羊小咩2022年9月19日
大约 5 分钟

音视频理论知识

封装格式

什么是封装格式

视频封装格式也叫做容器,它是将已经编码压缩好的视频流、音频流以及字幕按照一定的方式放到一个文件中,方便播放软件播放。一般来说,视频文件的后缀名就是它的封装格式。

解码/编码

视频经过H.264解码器视频解码成视频原始数据YUV,YUV经过转换成ARGB8888,最后通过屏幕渲染 音频经过AAC进行音频解码,解码成音频原始数据PCM,最后通过喇叭进行播放声音,(音频重采样,双声道转单声道)

为什么要进行编码?

视频是连续的图像序列,由连续的帧构成,一帧即为一副图像 由于人眼的视觉暂留效应,当帧序列以一定的速率播放时,我们看到的就是动作连续的视频 这么多的连续图像数据如果不经过编码数据量就很大。

比如一个19201080分辨率,每秒30帧的视频,一秒钟需要192010803032 大小大概为237Mb的数据

编码的目的

编码的目的,就是为了压缩数据,有利于存储和传输,编码的核心思想就是去除冗余信息 冗余信息有以下几点:

  1. 空间冗余->图像内部相邻像素之间存在较强的相关性(相邻像素重复)
  2. 时间冗余->视频图像序列中的不同帧之间的相关性(帧之间差值)
  3. 视觉冗余->人眼不敏感的图像信息

视频解码流程图

音频编码流程图

I帧 B帧 P帧

  • I帧:帧内编码帧,关键帧,I帧可以看作一个图像经过压缩之后的产物,可以单独解码出一个完整的图像(压缩率最低)

  • P帧:向前预测/参考 编码帧,记录了本帧跟之前的一个关键帧(或P帧)的差别,解码时需用之前缓存的画面叠加上本帧定义的差别,生成最终的画面

  • B帧:双向预测/参考 编码帧,记录了本帧与前后帧的差别,解码需要参考前面一个I帧或者P帧,同时也需要后面的P帧才能解码一张完整的图像

H.264分成结构(VCL与NAL)

VCL(网络编码层):负责高效的视频内容表示 VCL就是被压缩编码后原始数据,在VCL数据封装到NAL单元中之后,才可以用于传输或存储。

NAL(网络提取层):负责以网络所要求的恰当的方式对数据进行打包和 传送,是传输层。不管在本地播放还是网络播放,都要通过这一层来传输。

分层框架图

image.png

NAL(片(宏块))

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

image.png

一般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)

image.png

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)(可以记录坐标信息,人员信息,后面解码的时候,可以通过代码获取此信息)

image

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

image.png

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图像的片)

image.png

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

image.png

真实开放只分析: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 二组