Android 音视频开发实践系列-06-初步了解H.264视频编解码技术标准

本文来自笔者本人的语雀博客,由于语雀升级后不再满足笔者的需求,因此之后笔者会陆续将一些之前已经发布但尚有价值的文章搬家到CSDN。

1. 前言

作为音视频行业从业者,怎么能不理解H.264视频编解码技术标准?本篇文章主要记录笔者学习过程中对众多优秀博客内容的摘抄整理,方便广大读者通过一篇文章即可入门了解H.264。文章可能有理解不当或书写错误的地方,欢迎指正错误和讨论学习,感谢阅读本文。

2. 什么是H.264

H.264是国际标准化组织(ISO)和国际电信联盟(ITU)共同提出的继MPEG4之后的新一代数字视频压缩格式。H.264是ITU-T以H.26x系列为名称命名的视频编解码技术标准之一。H.264是ITU-T的VCEG(视频编码专家组)和ISO/IEC的MPEG(活动图像编码专家组)的联合视频组(JVT:joint video team)开发的一个数字视频编码标准。该标准最早来自于ITU-T的称之为H.26L的项目的开发。H.26L这个名称虽然不太常见,但是一直被使用着。H.264是ITU-T以H.26x系列为名称命名的标准之一,AVC是ISO/IEC MPEG一方的称呼。

国际上制定视频编解码技术的组织有两个,一个是“国际电联(ITU-T)”,它制定的标准有H.261、H.263、H.263+等,另一个是“国际标准化组织(ISO)”它制定的标准有MPEG-1、MPEG-2、MPEG-4等。而H.264则是由两个组织联合组建的联合视频组(JVT)共同制定的新数字视频编码标准,所以它既是ITU-T的H.264,又是ISO/IEC的MPEG-4高级视频编码(Advanced Video Coding,AVC)的第10 部分。因此,不论是MPEG-4 AVC、MPEG-4 Part 10,还是ISO/IEC 14496-10,都是指H.264。

以上内容来自与百度百科:H.264

T-REC-H.264-200503-S!!PDF-E中文翻译版本.pdf

T-REC-H.264-200503-S!!PDF-E的中文翻译版本,如果需要英文原版,可以到以下官方地址下载:
https://www.itu.int/rec/T-REC-H.264-200503-S/en

3. 什么是视频

视频(Video)泛指将一系列静态影像以电信号的方式加以捕捉、记录、处理、储存、传送与重现的各种技术。连续的图像变化每秒超过24帧(frame)画面以上时,根据视觉暂留原理,人眼无法辨别单幅的静态画面;看上去是平滑连续的视觉效果,这样连续的画面叫做视频。视频技术最早是为了电视系统而发展,但现在已经发展为各种不同的格式以利消费者将视频记录下来。网络技术的发达也促使视频的纪录片段以串流媒体的形式存在于因特网之上并可被电脑接收与播放。视频与电影属于不同的技术,后者是利用照相术将动态的影像捕捉为一系列的静态照片。

以上内容摘抄自百度百科:视频


(图3 逐帧动画演示)

git来自:手绘图秒变动画片,比小猪佩奇还好看!咋做的?

3.1 视频文件封装格式

封装格式(也叫容器),就是将已经编码压缩好的视频轨和音频轨按照一定的格式放到一个文件中,也就是说仅仅是一个外壳,或者把它当成一个放视频轨和音频轨的文件夹也可以。说得通俗点,视频轨相当于饭,而音频轨相当于菜,封装格式就是一个碗,或者一个锅,用来盛放饭菜的容器。 下面是几种常用的视频文件后缀类型与其相对应的封装格式。

视频文件格式 视频封装格式
.avi AVI(Audio Video Interleaved)
.wmv、.asf WMV(Windows Media Video)
.mpg、.mpeg、.vob、.dat、.3gp、.mp4 MPEG(Moving Picture Experts Group)
.mkv Matroska
.rm、.rmvb Real Video
.mov QuickTime File Format
.flv Flash Video

3.2 视频编码方式

视频编码的作用: 将视频像素数据(RGB,YUV 等)压缩成视频码流,从而降低视频的数据量。常用的频编码方式有以下几种:

名称 推出机构 推出时间 目前使用领域
HEVC(H.265) MPEG/ITU-T 2013 研发中
H.264 MPEG/ITU-T 2003 各个领域
MPEG4 MPEG 2001 不温不火
MPEG2 MPEG 1994 数字电视
VP9 Google 2013 研发中
VP8 Google 2008 不普及
VC-1 Microsoft Inc. 2006 微软平台

4. 什么是视频编解码技术

从信息论的观点来看,描述信源的数据是信息和数据冗余之和,即:数据=信息+数据冗余。数据冗余有许多种,如空间冗余、时间冗余、视觉冗余、统计冗余等。将图像作为一个信源,视频压缩编码的实质是减少图像中的冗余。

视频压缩编码技术可以分为两大类:无损压缩有损压缩

无损压缩也称为可逆编码,指使用压缩后的数据进行重构(即:解压缩)时,重构后的数据与原来的数据完全相同。也就是说,解码图像和原始图像严格相同,压缩是完全可恢复的或无偏差的,没有失真。无损压缩用于要求重构的信号与原始信号完全一致的场合,例如磁盘文件的压缩。

有损压缩也称为不可逆编码,指使用压缩后的数据进行重构(即:解压缩)时,重构后的数据与原来的数据有差异,但不影响人们对原始资料所表达的信息造成误解。也就是说,解码图像和原始图像是有差别的,允许有一定的失真,但视觉效果一般是可以接受的。有损压缩的应用范围广泛,例如视频会议、可视电话、视频广播、视频监控等。

视频编解码技术的主要作用,是在可用的计算资源内,追求尽可能高的视频重建质量和尽可能高的压缩比,以达到带宽和存储容量的要求。为何突出“重建质量”?因为视频编码是个有损的过程,用户只能从收到的视频流中解析出“重建”画面,它与原始的画面已经不同,例如观看低质量视频时经常会碰到的“块”效应。如何在一定的带宽占用下,尽可能地保持视频的质量,或者在保持质量情况下,尽可能地减少带宽利用率,是视频编码的基本目标。用专业术语来说,即视频编解码标准的**“率失真”性能**。“率”是指码率或者带宽占用;“失真”是用来描述重建视频的质量。与编码相对应的是解码或者解压缩过程,是将接收到的或者已经存储在介质上的压缩码流重建成视频信号,然后在各种设备上进行显示。

视频编解码标准,通常只定义上述的解码过程。例如 H.264 / AVC 标准,它定义了什么是符合标准的视频流,对每一个比特的顺序和意义都进行了严格地定义,对如何使用每个比特或者几个比特表达的信息也有精确的定义。正是这样的严格和精确,保证了不同厂商的视频相关服务,可以很方便地兼容在一起,例如用 iPhone、Android Phone 或者 windows PC 都可以观看同一在线视频网站的同一视频。世界上有多个组织进行视频编码标准的制定工作,国际标准组织 ISO 的 MPEG 小组、国际电信联盟 ITU-T 的 VCEG 小组、中国的 AVS 工作组、Google 及各大厂商组成的开放媒体联盟等。
Android 音视频开发实践系列-06-初步了解H.264视频编解码技术标准_第1张图片
(图1 视频编码标准及发展历史)

自 VCEG 制定 H.120标准开始,视频编码技术不断发展,先后成功地制定了一系列满足不同应用场景的视频编码标准,如图1所示。VCEG 组织先后制定了H.120、H.261、H.262(MPEG-2 Part 2)、H.263、H.263+、H.263++。MPEG也先后制定了MPEG-1、MPEG-2、MPEG-4 Part 2。以及两个国际组织合作制定的H.264/AVC、H.265/HEVC、H.266/VVC;中国自主知识产权的 AVS、AVS2、AVS3 视频编码标准;Google 制定的 VP8、VP9;Google、思科、微软、苹果等公司组成的开放媒体联盟(AOM)制定的 AV1。

H.264/AVC虽有近20年历史,但它优秀的压缩性能、适当的运算复杂度、优秀的开源社区支持、友好的专利政策、强大的生态圈等多个方面的因素,依旧让它保持着强大的生命力,特别是在实时通信领域。像 ZOOM、思科 Webex 等视频会议产品和基于 WebRTC SDK 的视频服务,大多数主流场景都采用 H.264/AVC。

5. H.264视频编解码技术的意义

H.264或称为MPEG-4第十部分(高级视频编码部分)是由ITU-T和ISO/IEC再次联手开发的最新一代视频编码标准。由于它比以前的标准在设计结构、实现功能上作了进一步改进,使得在同等视频质量条件下,能够节省50%的码率,且提高了视频传输质量的可控性,并具有较强的差错处理能力,适用范围更广。在低码率情况下,32kbps的H.264图像质量相当于128kbps的MPEG-4图像质量。H.264可应用于网络电视、广播电视、数字影院、远程教育、会议电视等多个行业。

H.264最大的优势是具有很高的数据压缩比率,在同等图像质量的条件下,H.264的压缩比是MPEG-2的2倍以上,是MPEG-4的1.5~2倍。举个例子,原始文件的大小如果为88GB,采用MPEG-2压缩标准压缩后变成3.5GB,压缩比为25∶1,而采用H.264压缩标准压缩后变为879MB,从88GB到879MB,H.264的压缩比达到惊人的102∶1。低码率(Low Bit Rate)对H.264的高的压缩比起到了重要的作用,和MPEG-2和MPEG-4 ASP等压缩技术相比,H.264压缩技术将大大节省用户的下载时间和数据流量收费。尤其值得一提的是,H.264在具有高压缩比的同时还拥有高质量流畅的图像,正因为如此,经过H.264压缩的视频数据,在网络传输过程中所需要的带宽更少,也更加经济。

因此,H.264的出现就是为了创建比以前的视频压缩标准更高效的压缩标准,使用更好高效的视频压缩算法来压缩视频的占用空间,提高存储和传输的效率,在获得有效的压缩效果的同时,使得压缩过程引起的失真最小。

Android 音视频开发实践系列-06-初步了解H.264视频编解码技术标准_第2张图片
(图2 H264视频编码发展历程)

图来自音视频系列–H264编解码总结

6. 视频编解码技术在音视频处理流程中的应用

视频编解码在音视频处理流程中的应用如下图4和图5所示:

Android 音视频开发实践系列-06-初步了解H.264视频编解码技术标准_第3张图片
(图4 音视频录制)
Android 音视频开发实践系列-06-初步了解H.264视频编解码技术标准_第4张图片(图5 音视频播放)

图4和图5来自:音视频基础

音视频处理的一般流程为:数据采集→数据编码→数据传输(流媒体服务器) →解码数据→播放显示

  • 数据采集:摄像机及拾音器收集视频及音频数据,此时得到的为原始数据涉及技术或协议:摄像机:CCD、CMOS拾音器:声电转换装置(咪头)、音频放大电路。
  • 数据编码:使用相关硬件或软件对音视频原始数据进行编码处理(数字化)及加工(如音视频混合、打包封装等),得到可用的音视频数据涉及技术或协议:编码方式:CBR、VBR编码格式视频:H.265、H.264、MPEG-4等,封装容器有TS、MKV、AVI、MP4等音频:G.711μ、AAC、Opus等,封装有MP3、OGG、AAC等。
  • 数据传输:将编码完成后的音视频数据进行传输,早期的音视频通过同轴电缆之类的线缆进行传输,IP网络发展后,使用IP网络传输涉及技术或协议:传输协议:RTP与RTCP、RTSP、RTMP、HTTP、HLS(HTTPLive
    Streaming)等,控制信令:SIP和SDP、SNMP等
  • 解码数据:使用相关硬件或软件对接收到的编码后的音视频数据进行解码,得到可以直接显示的图像/声音涉及技术或协议:一般对应的编码器都会带有相应的解码器,也有一些第三方解码插件等。
  • 播放显示:在显示器(电视、监视屏等)或扬声器(耳机、喇叭等)里,显示相应的图像画面或声音涉及技术或协议:显示器、扬声器、3D眼镜等。

7. H.264基本流结构

H.264 的基本流(elementary stream,ES)的结构分为两层:
视频编码层(VCL)网络适配层(NAL)
视频编码层负责高效的视频内容表示,而网络适配层负责以网络所要求的恰当的方式对数据进行打包和传送。

引入NAL并使之与VCL分离带来的好处包括两方面:
1、使信号处理和网络传输分离,VCL 和NAL 可以在不同的处理平台上实现;
2、VCL 和NAL 分离设计,使得在不同的网络环境内,网关不需要因为网络环境不同而对VCL比特流进行重构和重编码。

VCL(Video Coding Layer):VCL是对核心算法引擎,块,宏块及片的语法级别的定义,他最终输出编码完的数据 SODB。

NAL(Net Abstraction Layer):NAL将SODB打包成RBSP然后加上NAL头,组成一个NALU(NAL单元)。

SODB(String Of Data Bits):原始数据比特流, 长度不一定是8的倍数,故需要补齐。

RBSP(Raw Byte Sequence Payload):原始数据字节流,SODB+RBSP trailing bits=RBSP,添加加trailing bits是为了使一个RBSP为整字节数。

H.264 的基本流由一系列NALU (Network Abstraction Layer Unit )组成,不同的NALU数据量各不相同。H.264 草案指出,当数据流是储存在介质上时,在每个NALU 前添加起始码:0x000001或0x00000001,用来指示一个NALU 的起始和终止位置。在这样的机制下,在码流中检测起始码,作为一个NALU得起始标识,当检测到下一个起始码时,当前NALU结束。

H.264 码流中每个帧的开头的3~4个字节是H.264 的start_code(起始码),0x00000001或0x000001。3字节的0x000001只有一种场合下使用,就是一个完整的帧被编为多个slice(片)的时候,从第二个slice开始,包含这些slice的NALU 使用3字节起始码。也就是说,如果NALU对应的slice为一帧的开始就用0x00000001,否则就用0x000001。

本段摘抄自草上爬的H.264格式分析

7.1 VCL层中的结构

常见的I、B、P帧组成图像序列sequence,这里I帧和IDR帧的区别参考:H.264—(I、P、B帧)(I帧和IDR帧)(DTS和PTS、time_base),一帧图片中可以有一个多个Slice,一个Slice有多个宏块(Macro BLock) ,一个宏块包含一个亮度块和两个色度块。

Android 音视频开发实践系列-06-初步了解H.264视频编解码技术标准_第5张图片
SODB :数据比特串 ---->最原始的编码数据,即VCL数据.

7.2 NAL层中的结构

一个典型的NALU如下图所示

3.1 NAL头介绍
占一个字节,由三部分组成forbidden_bit(1bit),nal_reference_bit(2bits)(优先级),nal_unit_type(5bits)(类型)。
forbidden_bit:
禁止位,默认为0,1为语法有错误。
nal_reference_bit:
用于在重构过程中标记一个NAL单元的重要性,值越大,越重要。值为0表示这个NAL单元没有用于预测,因此可被解码器抛弃而不会有错误扩散;值高于0表示此NAL单元要用于无漂移重构,且值越高,对此NAL单元丢失的影响越大。
nal_unit_type :NAL类型。参见下表:Android 音视频开发实践系列-06-初步了解H.264视频编解码技术标准_第6张图片

3.2 RBSP、EBSP
SODB 数据比特串:最原始的编码数据。
RBSP 原始字节序列载荷:在SODB的后面添加了结尾比特(RBSP trailing bits 一个bit“1”)若干比特“0”,以便字节对齐。
EBSP 扩展字节序列载荷:在RBSP基础上填加了仿校验字节(0X03)它的原因是: 在NALU加到Annexb上时,需要填加每组NALU之前的开始码 StartCodePrefix,如果该NALU对应的slice为一帧的开始则用4位字节表示,ox00000001,否则用3位字节表示 ox000001。为了使NALU主体中不包括与开始码相冲突的,在编码时,每遇到两个字节连续为0,就插入一个字节的0x03。解码时将0x03去掉。

附:码流分析工具

1.CodecVisa(跨平台:H264/H265…) http://www.codecian.com/downloads.html
2.H264BSAnalyzer(H264/H265) https://github.com/latelee/H264BSAnalyzer
3.GitlHEVCAnalyzer(H264) https://github.com/lheric/GitlHEVCAnalyzer
4.Elecard HEVC/AVC Analyzer(收费) https://www.elecard.com/products/video-analysis/streameye-studio 5.VideoEye(H264/RTMP…) https://github.com/leixiaohua1020/VideoEye

参考资料

深入浅出理解视频编解码技术
音视频系列–H264编解码总结
直播系统搭建:音视频处理的一般流程与推流端的四个环节
H.264—码流格式分析

你可能感兴趣的:(Android开发实践,Android音视频,音视频,h.264,视频编解码)