FLV、acc、H264(AVC)、GOP与NALU

发布时间 2023-07-18 20:32:28作者: 好人~

项目链接

提取h264和aac(07-02-extract-aac.c和07-03-extract-h264.c):使用过滤器加上一些头部信息从而提取出h264,给aac的每一帧加上一个头部信息从而提取出acc。下面的h264和aac的介绍中会对加上的信息进行解释。

FLV:

  • header+PTagsize+Tag+PTagsize+Tag,header(是否存在音/视频);

    • Tag分为音/视频和脚本,Tag=header(data部分的大小)+data;

    • PTagsize:前一个tag的size。

  • Script data脚本数据就是描述视频或⾳频的信息的数据,视频信息如宽度、⾼度、时间等等,⾳视频信息如采样、声道、频率,编码等信息。⼀个⽂件中通常只有⼀个Script data且放在FLV header后的第一个。

  • Video/Audio Tag Data的第一个字节是一些参数信息,根据第一个字节的具体参数信息,解析接下来的数据。

H264(AVC):H264利用同一帧中相邻块的相似性和不同帧之间的相似性进行压缩。

  • SPS:序列参数集,SPS中保存了⼀组编码视频序列(Coded video sequence)的全局参数。

  • PPS:图像参数集,对应的是⼀个序列中某⼀幅图像或者某⼏幅图像的参数

  • I帧 :⾃身可以通过视频解压算法解压成⼀张单独的完整的图⽚。

  • P帧:需要参考其前⾯的⼀个I frame 或者P frame来⽣成⼀张完整的图⽚。

  • B帧:要参考其前⼀个I或者P帧及其后⾯的⼀个P帧来⽣成⼀张完整的图⽚。如果一秒25帧,每一帧代表40ms,则在直播时,如果发送IBBBP,那么要解析出中间三个B,就必须等待120ms后的P帧被解析出来。所以直播中的视频流一般不使用B帧。

GOP与NALU:H.264原始码流(裸流)是由⼀个接⼀个NALU组成,SPS、PPS、I、P、B帧都是用NALU来装。

  • GOP:以I帧开头的一组完整的视频帧。

  • NALU = [StartCode] [NALU Header] [NALU Payload]。

    mp4中每个NALU(每⼀个frame)前⾯4个字节是这个frame的⻓度,没有startcode。所以要获取H264数据需要去除每一frame前面的4个字节,并加上startcode,在ffmpeg中⽤h264_mp4toannexb_filter可以做这个工作。

H265:H265的编解码代价大,但是压缩率更高,带宽、容量需求要求更低

AAC:

  • ADIF:只有一个header,只能从头部开始解码

  • ADTS:任意帧都有header,可以从流的任意位置开始解码。

    • ADTS:每⼀帧由ADTS Header和AAC Audio Data组成。我从mp4提取出aac时,就需要给每一帧加上header,不然就没办法正常播放。

    • header= 固定头+可变头。每⼀帧的ADTS的头都包含了⾳频的采样率,声道,帧⻓度等信息,这样解码器才能解析读取。