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 。
- 高质量的图像:H.264能提供连续、流畅的高质量图像 。
- 容错能力强:H.264提供了解决在不稳定网络环境下容易发生的丢包等错误的必要工具。
- 网络适应性强:H.264提供了网络抽象层(Network Abstraction Layer),使得H.264的文件能容易地在不同网络上传输(例如互联网,CDMA,GPRS,WCDMA,CDMA2000等)。
- 高压缩率,H.264的压缩比达到惊人的102∶1。这一条是最重要的,因为其压缩比之高,它能够实时编码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
版权声明:本文内容转自互联网,本文观点仅代表作者本人。本站仅提供信息存储空间服务,所有权归原作者所有。如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至1393616908@qq.com 举报,一经查实,本站将立刻删除。