《Android 音视频开发》笔记 - H.264编码

    视频编码方式,是通过特定的压缩技术,将某个视频格式的文件转换成另一种视频格式的文件的形式。
    H.264创造了多参考帧、多块类型、整数变换、帧内预测等新的压缩技术,使用了更精细的分像素运动矢量(1/4、1/8)和新一代的环路滤波器,使得压缩性能大大提升,系统更加完善。
H.264 == MPEG-4 - AVC

H.264编码框架

    H.264码流文件分为两层,VCL 和 NAL 。

1)VCL(Video Coding Layer,视频编码层)

    负责高效的视频内容表示,VCL数据即编码处理的输出,它表示被压缩编码后的视频数据序列。
    在VCL数据被封装到NAL单元中之后,才可以用于传输或存储。
    NAL单元,即NALU,Network Abstraction Layer Unit。

2)NAL(Network Abstraction Layer,网络抽象层)

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

H.264编码原理

    AVC即Advanced Video Coding,高级视频编码。
1)H.264/AVC并未明确表述一个编解码器如何实现,而是规定了一个编码的视频比特流的句法和该比特流的解码方法。H.264编解码器的功能组成如图:
在这里插入图片描述
2)H.264/AVC编解码器的工作原理。
H.264编解码器采用变换和预测混合编码方式。
编码时,首先输入的帧或场Fn以宏块为单位被编码器处理。
宏块有帧内和帧间两种模式。
帧内模式使用当前帧内已编码的宏块进行预测。
帧间模式使用以往一个或多个帧作为参考进行运动预测。
然后对预测值和原始值的差值进行变换、量化、重新排序和熵编码,对量化系统X进行逆量化、逆变换后,与预测系统进行相加,得到未经滤波的uF帧,对于uF帧进行块间滤波,得到当前重构帧Fn*。
解码过程相对简单,对于编码器的各部分进行逆向操作,结果经逆向量化、逆向变换后通过滤波器得到重构输出图像。
在这里插入图片描述

H.264码流分析

1) H.264编码格式

     在 VCL 数据传输或存储之前,这些编码的 VCL 数据先被映射或封装进 NAL 单元中。
     每个NAL单元包括一个 RBSP 和 一组对应于视频编码的NAL头信息。

     SODB(String Of Data Bits) 原始数据比特流,长度不一定是 8 的倍数,故需要补齐,它是由 VCL 层产生的。
     RBSP(Raw Byte Sequence Payload) 原始字节序列负载,SODB + trailing bits,如果SODB 最后一个字节不对齐,则补 1 和多个 0 。
     RBSP的基本结构:在原始编码数据的后面添加结尾标记,一个比特“1”和若干比特“0”,以便字节对齐。
     NALU(Network Abstraction Layer Unit) 网络抽象层单元, NAL Header(1B) + RBSP

    H.264码流结构:
在这里插入图片描述

    起始码startcode,为0x00000001 或 0x000001,因为NALU需要进行分隔操作,以便识别帧;
    0x00000001起始码代表:一个NALU单元里面有很多片;
    0x000001起始码代表:一个NALU单元里面一个片。

    H.264码流NAL单元(NALU)序列:
在这里插入图片描述

    H.264码流NAL单元(NALU)序列:
在这里插入图片描述

2) NAL Header

    NAL头由一个字节(8位)组成:禁止位(1位)、重要性指示位(2位)、NALU类型(5位)。

    NAL头信息的每一位说明:
在这里插入图片描述
    NAL类型:
在这里插入图片描述

3) H.264的传输

H.264的编码视频序列包括一系列的NAL单元,每个NAL单元包含一个RBSP。
每个单元按独立的NAL单元传送。
NAL单元的信息头(1字节)定义了RBSP单元的类型,NAL单元的其余部分为RBSP数据。
RBSP单元序列:
在这里插入图片描述
SPS,即Sequence Parameter Set序列参数集,作用于一串连续的视频图像,即视频序列
PPS,即Picture Parameter Set图像参数集,作用于视频序列中的一个或多个图像
SEI,视频序列解码的增强信息

SPS:
H264 Profile :对视频压缩特性的描述,Profile 越高,就说明采用了越高级的压缩特性。
H264 Level : 是对视频的描述,Level越高,视频的码率、分辨率、fps越高。

4) H.264码流结构

    SPS、PPS参数集,是一个独立的数据单元,不依赖于参数集外的其他语法元素。
    一个参数集不对应某一个特定的图像或序列;
    同一个序列参数集可以被一个或多个图像参数集引用。
    同一个图像参数集可以被一个或多个图像引用。

    H.264中图像以序列为单位进行组织,一个序列是一段图像编码后的数据流,以I帧开始,到下一个I帧结束,中间部分被称为一个GOP。
    一个序列的第一个图像叫做IDR图像(立即刷新图像),IDR图像都是I帧图像。
    H.264引入IDR图像是为了解码的重新同步,当解码器解码到IDR图像时,立即将参考帧对象清空,将已解码的数据全部输出或者抛弃,重新查找下一个参数集,开始解码一个新的序列。这样如果前一个序列出现重大错误,在这里可以获得重新同步的机会。
    IDR图像之后的图像永远不会使用IDR之前的图像的数据来解码。
    一个序列就是一段内容差异不太大的图像编码后生成的一串数据流。当运动变化比较少时,一个序列可以很长,因为运动变化少就代表图像画面的内容变动很小,所以就可以是一个I帧,然后一直是P帧、B帧。当运动变化多时,一个序列可能会比较短,比如只包含一个I帧和几个P帧、B帧。

    GOP,即Group Of Picture图像组,两个I帧之间的帧的数目。
    POC,即Picture Order Count图像顺序号,主要用于标识图像的播放顺序,同时还用于在对帧间预测片解码时,标记图像的初始图像序号。
    IDR帧,属于I帧,但I帧不一定是IDR帧,只有IDR帧才有SPS和PPS。解码器收到IDR帧时,将reference buffer清空,而收到I帧不一定会清空reference buffer;对于IDR帧之后的帧,解码器不会参考这个IDR帧之前的任何帧做解码。对于某个I帧之后的帧,解码器可能会参考这个I帧之前的帧做解码。

5) DTS 和 PTS

    DTS,即Decode Time Stamp,主要用于标示读入内存中的比特流在什么时候送入解码器中进行解码。
    PTS,即Presentation Time Stamp,主要用于度量解码后的视频帧什么时候被显示出来。
    在没有B帧的情况下,DTS和PTS是一样的顺序,因为B帧会打乱解码和显示的顺序(要解码B帧需要先解码后面的P帧),所以一旦存在B帧,PTS和DTS就会不同。
在这里插入图片描述

流分析

1) 查找startcode

在这里插入图片描述

2) 分析 NAL头

前三个:
在这里插入图片描述
第四个:
在这里插入图片描述
第五个:
在这里插入图片描述

第一个 startcode + NAL头 (16进制的)
00 00 00 01 67, 即 NAL头0x67 对应的二进制为 0110 0111
即:
禁止位为0
重要性指示位为11,最重要
NALU类型为00111,即7,为序列参数集SPS(记录有多少I帧、B帧、P帧,帧如何排列)


第二个 startcode + NAL头 (16进制的)
00 00 01 68, 即 NAL头0x68 对应的二进制为 0110 1000
即:
禁止位为0
重要性指示位为11,最重要
NALU类型为01000,即8,为图像参数集PPS (图像宽高等信息)


第三个 startcode + NAL头 (16进制的)
00 00 01 06, 即 NAL头0x6 对应的二进制为 0000 0110
即:
禁止位为0
重要性指示位为00
NALU类型为00110,即6,为SEI


第四个 startcode + NAL头 (16进制的)
00 00 01 65, 即 NAL头0x65 对应的二进制为 0110 0101
即:
禁止位为0
重要性指示位为11 最重要
NALU类型为00101,即5,为I帧


第五个 startcode + NAL头 (16进制的)
00 00 00 01 41, 即 NAL头0x41 对应的二进制为 0100 0001
即:
禁止位为0
重要性指示位为10
NALU类型为00001,即1,P帧/B帧

NALU类型为1,即为普通P帧/重要P帧/B帧

分析工具

Elecard Stream Eye
CodecVisa
VideoEye

相关文档:

    I帧、B帧、P帧参考:相关介绍

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值