音视频基础(3):h264码流结构

2022-11-28 16:55:30 浏览数 (1)

一.什么是H264压缩格式?

H.264,同时也是MPEG-4第十部分,是由ITU-T视频编码专家组(VCEG)和ISO/IEC动态图像专家组(MPEG)联合组成的联合视频组(JVT,Joint Video Team)提出的高度压缩数字视频编解码器标准。这个标准通常被称之为H.264/AVC(或者AVC/H.264或者H.264/MPEG-4 AVC或MPEG-4/H.264 AVC)而明确的说明它两方面的开发者。

二.H264有什么强大的地方:

低码率(Low Bit Rate):在同等图像质量下,采用H.264技术压缩后的数据量只有MPEG2的1/8,MPEG4的1/3 2.2.高质量的图像:H.264能提供连续、流畅的高质量图像 2.3.容错能力强:H.264提供了解决在不稳定网络环境下容易发生的丢包等错误的必要工具 2.4.网络适应性强:H.264提供了网络抽象层(Network Abstraction Layer),使得H.264的文件能容易地在不同网络上传输(例如互联网,CDMA,GPRS,WCDMA,CDMA2000等)。2.5.高压缩率,H.264的压缩比达到惊人的102∶1

其中2.5这一条是最重要的,因为其压缩比之高,它能够实时编码1920 * 1080 60FPS以上的视频。

三.H264码流组成部分

H264分层能够分成两层,一层是VCL层(视频编码层),另外一层是NAL层(网络提取层)。其中VCL层包含的是具体的H264视频内容,NALU的工作则是负责把网络视频流进行打包和传送。下面我们来重点看看NALU的结构(一般对于我们开发来说,VCL层不怎么需要去关心)。

SODB(String ofData Bits)数据比特串:最原始的编码数据,即VCL数据,没有任何附加数据。

RBSP(Raw ByteSequence Payload)原始字节序列载荷:在SODB的后面填加了结尾比特(RBSP trailing bits),一个bit“1”,若干bit “0”,以便字节对齐;

EBSP(EncapsulationByte Sequence Packets)扩展字节序列载荷:在RBSP基础上填加了仿校验字节(0X03)。它的原因是:在NALU加到Annexb上时,需要添加每组NALU之前的开始码StartCodePrefix,如果该NALU对应的slice为一帧的开始则用4位字节表示,ox00000001,否则用3位字节表示ox000001(是一帧的一部分)。解码器检测每个起始码,作为一个NAL的起始标识,当检测到下一个起始码时,当前NAL结束。对于NAL中数据出现0x000001或0x000000时,H.264引入了防止竞争机制,如果编码器遇到两个字节连续为0,就插入一个字节的0x03。解码时将0x03去掉,也称为脱壳操作。

通常来说,一个原始的H.264 NALU 单元常由 [StartCode] [NALU Header] [NALU Payload]。三部分组成,其中 Start Code 用于标示这是一个NALU 单元的开始,必须是"00 00 00 01" 或"00 00 01",具体的如下图:

如这张图所示,划红线的都是每一帧的NALU单元,如:00 00 00 01 06 05、00 00 00 01 67等都是NALU数据。

那H264的NALU数据有什么特殊的意义呢?我们来重点介绍一下:

00 00 00 01 06 05 SEI数据:是视频的附加增强信息,它包含了一些用户自定义的数据,如时间戳,字幕,弹幕等信息。SEI信息一般放在编码图像之前,很多时候SEI可以被忽略。

00 00 00 01 67 SPS数据:指的是序列参数集,它保存了一组编码视频序列的全局参数。编码视频序列指的是原始数据经过编码后组成的一系列序号集。

00 00 00 01 68 PPS数据:指的是图像参数集,主要用于保存图像序列集中一个或者多个独立的图像。一般情况下,配合SPS和PPS都是H264开头的两个NALU头。

00 00 00 01 65 IDR数据:IDR指的是H264的一帧完整的图像数据,也就是我们经常说的关键帧。

所以一个标准的H264码流结构:SEI SPS PPS IDR

0 人点赞