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

Android FFmpeg专题结构

H264码流结构

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

直观理解的角度

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

66.png

码流功能的角度

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

  • 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
  • forbidden_zero_bit
    在网络传输中发生错误时,会被置为1,告诉接收方丢掉该单元;否则为0
  • nal_ref_idc
    用于表示当前NALU的重要性,值越大,越重要.
    解码器在解码处理不过来的时候,可以丢掉重要性为0的NALU.
  • nal_unit_type
    表示NALU数据的类型,有以下几种:


    72.png

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

  • 1-4:I/P/B帧,如果nal_ref_idc 为0 则表示I帧,不为0则为P/B帧
  • 5:IDR帧,I帧的一种,告诉解码器,之前依赖的解码参数集合(接下来要出现的SPS\PPS等)可以被刷新了。
  • 6:SEI,英文全称Supplemental Enhancement Information,翻译为“补充增强信息”,提供了向视频码流中加入额外信息的方法。
  • 7:SPS,全称Sequence Paramater Set,翻译为“序列参数集”。SPS中保存了一组编码视频序列(Coded Video Sequence)的全局参数。因此该类型保存的是和编码序列相关的参数。
  • 8: PPS,全称Picture Paramater Set,翻译为“图像参数集”。该类型保存了整体图像相关的参数。
  • 9:AU分隔符,AU全称Access Unit,它是一个或者多个NALU的集合,代表了一个完整的帧。

其中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帧:

  • 00 00 00 01 67
    00 00 00 01是一个NALU 开始,67 是Header, 二进制为0110 0111, nal_unit_type 为00111, 即7为SPS帧
  • 00 00 00 01 68
    68 二进制为0110 1000, nal_unit_type 为00111, 即8为SPS帧
  • 00 00 00 01 65
    65 二进制为0110 0101,nal_unit_type 为00101, 即5为IDR帧

H264 更详细的分层结构

71.png

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

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

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 220,137评论 6 511
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 93,824评论 3 396
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 166,465评论 0 357
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 59,131评论 1 295
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 68,140评论 6 397
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,895评论 1 308
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,535评论 3 420
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,435评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,952评论 1 319
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 38,081评论 3 340
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 40,210评论 1 352
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,896评论 5 347
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,552评论 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 32,089评论 0 23
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 33,198评论 1 272
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,531评论 3 375
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 45,209评论 2 357

推荐阅读更多精彩内容