使用FFMpeg 模仿Android MediaPlayer

H264系列--码流组成和分层结构

2021-03-10  本文已影响0人  llm_5243

Android FFmpeg专题结构

H264码流结构

无论是解析视频文件或这通过网络传输, 其实都是一串字节序列. H264码流就是按照一定的规则组织排列的字节串.

直观理解的角度

按照从大到小分为: 视频序列, 图像帧, 片,宏块,子块

66.png

码流功能的角度

从码流功能的角度可以分为两层:NAL层和VCL层

码流解析的角度

可以理解为有一个一个的NALU单元组成.


68.png

一个NALU单元分成两部分: NAL头和RBSP(Raw ByteSequence Payload)原始字节序列载荷.

前面提到的一帧图像(I帧, P帧, B帧)就是一个NALU单元, NALU单元除了代表图像外还能包含其他类型的数据,如PPS和SPS, 详细的内容在下节列出来.

前面提到的VCL层, 或者说VCL数据,是指视频编码生成的压缩比特流片段,被称为SODB(String of Data Bits),
SODB是RBSP的原始帧, 即RBSP包含了SODB数据

NALU

一个NALU由 固定长度的Header和RBSP组成


1720840-8f2f0d6c98874fa8.jpg

HEADER

NAL Header的结构如下:


1720840-0db292febd810304.jpg

其中比较注意的应该是以下几个:

其中SPS,PPS 需要在I帧前出现,不然解码器没法解码.而SPS,PPS出现的频率也跟不同应用场景有关,对于一个本地h264流,可能只要在第一个I帧前面出现一次就可以,但对于直播流,每个I帧前面都应该插入sps或pps,因为直播时客户端进入的时间是不确定的.

RBSP

RBSP的结构如下:

1720840-7a3721b879284848.jpg

这部分还没研究,似乎目前解析时ffmpeg都给实现了.

每个NALU前有一个起始码 0x00 00 01(或者0x00 00 00 01), 作为NALU的分割符

下面是一个H264码流:


SouthEast.jpg

分析其中比较有代表性的3帧:

H264 更详细的分层结构

71.png

关于多slice这块目前还没弄清楚,后面弄清楚了再修改.

参考:
https://www.jianshu.com/p/82cc851df834

上一篇 下一篇

猜你喜欢

热点阅读