Android 音视频开发四 H264详解

概述

前面的章节已经详细介绍了YUV到H264的过程,那么H264究竟什么样子?本文详细介绍一下

H264定义的几种帧

  • I帧:完整编码的帧叫I帧
  • P帧:参考之前的I帧生成的只包含差异部分编码的帧叫P帧
  • B帧:参考前后的帧编码的帧叫B帧
  • IDR帧:GOP序列是在H264中图像以序列为单位进行组织,一个序列是一段图像编码后的数据流,一个序列的第一个图像叫做 IDR 图像(立即刷新图像,即刷新参考帧,将参考帧队列清空,避免上一个GOP参考出错引起的错误蔓延),IDR 图像都是 I 帧图像

Slice

  • Slice 其实是为了并行编码设计的,一般来说是为了提高编码速度的,将一帧图像划分成几个 Slice
  • Slice 之间相互独立、互不依赖、独立编码。所以帧内预测时候,不能跨Slice预测,所以一帧图像包含一或者若干个slice,一个slice包含若干个宏块
  • Slice数据包含了Slice Header、Slice payload ,Slice Header 中存放了这个 Slice 会用到的参数项,而 payload 中则存放了真正的图像信息,即具体的宏块数据。Slice header主要是当前Slice包含的宏块的一些基本的数据,例如Slice的类型,Slice属于的那一帧的信息,以及当前Slice使用的图像序列参数以及量化参数等信息
  • I Slice:仅包含I宏块
    P Slice:包含P宏块和I宏块
    B Slice:包含B宏块和I宏块
    SP Slice:包含B宏块和I宏块,用于使编码流之间容易交换
    SI Slice:包含SI宏块(一种特殊的编码宏块),用于使编码流之间容易交换

SPS(序列参数集)和PPS(图像参数集)

  • 它们虽然数据量不大可是来头可不小,没有他们,码流根本无法解码,其中,SPS 主要包含的是图像的宽、高、YUV 格式和位深等基本信息;PPS 则主要包含熵编码类型、基础 QP 和最大参考帧数量等基本编码信息。
  • 简而言之,H264 的码流主要是由 SPS、PPS、I Slice、P Slice和B Slice 组成的。

H.264分层设计

  • VCL:(Video Coding Layer)视频编码层,负责高效的内容表示。
  • NAL:(Network Abstraction Layer)网络抽象层,负责以网络所要求的恰当的方式对数据进行打包和传送,NAL设计的目的,是根据不同的网络把数据打包成相应的格式,将VCL产生的比特字符串适配到各种各样的网络和多元环境中。

NALU

  • NALU是NAL的基本单元,NAL是将一个Slice或者PPS或者SPS数据写入到一个NAL单元中,进行传输或存储的,所以一个Slice或者PPS或者SPS,统称为RBSP单元(Raw Byte Sequence Payload),都是一个NALU payload

  • NALU包含NALU Header、NALU payload,NALU Header通常为00 00 00 01、00 00 01开始,作为一个新的NALU的起始标识

  • NALU起始码

    1. 两种,3字节0x000001单帧多Slice(即单帧多个NALU)之间间隔,4字节0x00000001 帧之间,或者SPS、PPS等之前,起始码字节用来分割NALU。
    2. 问题来了,如果RBSP中也包括了起始码(0x000001或0x00000001)怎么办呢?所以,就有了防止竞争字节(0x03),具体做法:编码时,扫描RBSP,如果遇到连续两个0x00字节,就在后面添加防止竞争字节(0x03),解码时逆向操作即可
    3. 简而言之 NALU 寻找帧间隔就找0x00000001, 寻找Slice间隔就找 0x000001,帧间隔包含sps、pps
      起始码
  • NALU header

    1. 由1 bit的禁止位forbidden_zero_bit、2 bit重要性nal_ref_idc以及5 bits的nal_unit_type组成,
    2. NALU header forbidden_zero_bit 禁止位,初始为0,当网络发现NAL单元有比特错误时可设置该比特为1,以便接收方纠错或丢掉该单元。
    3. NALU header 后两位为 nal_ref_idc nal_ref_idc 代表 NALU 的重要性。值越大说明约重要。取值范围0~3,解码器在解码处理不过来的时候,可以丢掉重要性为0的NALU。当前的 NAL 是参考帧,序列集参数集或图像集重要数据时必须大于0。
    4. 最后五位为 nal_unit_type 指的是当前 NAL 的类型
  • nal_unit_type


    nal_unit_type
    1. 其中0x67的二进制码为:0110 0111
      4-8为00111,转为十进制7,参考图:7对应序列参数集SPS

    2. 其中0x68的二进制码为:0110 1000
      4-8为01000,转为十进制8,参考图:8对应图像参数集PPS

    3. 其中0x65的二进制码为:0110 0101
      4-8为00101,转为十进制5,参考图:5对应IDR图像中的片(I帧)

    4. 其中0x41的二进制码为:0100 0001
      4-8为00001,转为十进制1,参考图:1对应非IDR图像中的片(这里指的是P帧)

    5. 其中0x61的二进制码为:0110 0001
      4-8为00001,转为十进制1,参考图:1对应非IDR图像中的片(同上,为P帧,仅仅是重要性不同)

    6. 其中0x06的二进制码为:0000 0100
      4-8为00100,转为十进制6,参考图:6对应SEI

H264图例

H264结构

总结

这几个章节从下到上详细描述了H264的码流,最基础的宏块讲起,多个宏块又组成了Slice,Slice和PPS和SPS又组成了一个NALU payload,NALU payload 又和NALU header 组成了一个完整的NALU,NALU和起始码最终组成完整的码流,在网络中传输,也可以是保存在存储介质中

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

推荐阅读更多精彩内容