基础知识.md
音视频完整解码播放流程分析
音视频完整录制编码流程分析
封裝格式
我们播放的视频文件一般都是用一种封装格式封装起来的,封装格式的作用是什么呢?一般视频文件里不光有视频,还有音频,封装格式的作用就是把视频和音频打包起来。 所以我们先要解封装格式,看有哪些视频流和哪些音频流,此时的音频流和视频流都还是压缩数据,不能直接用于显示的,这就需要解码。下面是播放一个视频文件时的流程图。
视频文件封装格式
封装格式(也叫容器),就是将已经编码压缩好的视频轨和音频轨按照一定的格式放到一个文件中,也就是说仅仅是一个外壳,或者大家把它当成一个放视频轨和音频轨的文件夹也可以。说得通俗点,视频轨相当于饭,而音频轨相当于菜,封装格式就是一个碗,或者一个锅,用来盛放饭菜的容器。 下面是几种常用的 视频文件后缀类型 与其相对应的 封装格式。
视频文件格式 | 视频封装格式 |
---|---|
.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 |
音视频编码方式简介
视频编码方式
视频编码的作用: 将视频像素数据(RGB,YUV 等)压缩成视频码流,从而降低视频的数据量。
名称 | 推出机构 | 推出时间 | 目前使用领域 |
---|---|---|---|
HEVC(H.265) | MPEG/ITU-T | 2013 | 研发中 |
H.264 | MPEG/ITU-T | 2003 | 各个领域 |
MPEG4 | MPEG | 2001 | 不温不火 |
MPEG2 | MPEG | 1994 | 数字电视 |
VP9 | 2013 | 研发中 | |
VP8 | 2008 | 不普及 | |
VC-1 | Microsoft Inc. | 2006 | 微软平台 |
音频编码方式
音频编码的作用: 将音频采样数据(PCM 等)压缩成音频码流,从而降低音频的数据量。 常用的音频编码方式有以下几种:
名称 | 推出机构 | 推出时间 | 目前使用领域 |
---|---|---|---|
AAC | MPEG | 1997 | 各个领域(新) |
MP3 | MPEG | 1993 | 各个领域(旧) |
WMV | Microsoft Inc. | 1999 | 微软平台 |
AC-3 | Dolby Inc. | 1992 | 电影 |
- MP3
MP3,英文全称 MPEG-1 or MPEG-2 Audio Layer III,是曾经非常流行的一种数字音频编码和有损压缩格式,它被设计来大幅降低音频数据量。它是在 1991 年,由位于德国埃尔朗根的研究组织 Fraunhofer-Gesellschaft 的一组工程师发明和标准化的。MP3 的普及,曾对音乐产业造成极大的冲击与影响。 - AAC
AAC,英文全称 Advanced Audio Coding,是由 Fraunhofer IIS、杜比实验室、AT&T、Sony 等公司共同开发,在 1997 年推出的基于 MPEG-2 的音频编码技术。2000 年,MPEG-4 标准出现后,AAC 重新集成了其特性,加入了 SBR 技术和 PS 技术,为了区别于传统的 MPEG-2 AAC 又称为 MPEG-4 AAC。 AAC 比 MP3 有更高的压缩比,同样大小的音频文件,AAC 的音质更高。 - WMA
WMA,英文全称 Windows Media Audio,由微软公司开发的一种数字音频压缩格式,本身包括有损和无损压缩格式。
编码标准之战
一个视频标准的普及其实是商业利益博弈的结果。
想预测未来,就回顾历史。先来看看H.265前任,H.264从标准化到现在普及的过程。
H.264的发展
在20年前国际上主流制定视频编解码技术的组织有两个,一个是“国际电联(ITU-T)”,它制定的标准有H.261、H.263、H.263+、H.264等,另一个是“国际标准化组织(ISO)”它制定的标准有MPEG-1、MPEG-2、MPEG-4等。
1990世界上第一个视频压缩标准是H.261(ITU),
1993MEPG-1(ISO)
1995 H.263(ITU),
1996 MPEG-2(ISO)
1998年由VCEG发起。H.264最早的名子叫H.26L.(ITU)
1999年10月H.26L第一份草案被接收。(ITU)
2001年12月经过评估发现,H.26L编码技术基本能够满足MPEG的标准需求,因此MPEG中的成员和VCEG中的成员组成了一个新的小组,叫做Joint Video Team(JVT),来推动和管理H.26L的最后标准化开发。
2003年5月H.264发布。
2005年开发出了H.264的更高级应用标准MVC (multiple view coding) 和 SVC (scalable video coding) 版本。
到2017年,H265又名(HEVC) 发布。
H.264/MPEG-4 AVC的成功的原因之一是在于是两个标准化组织的合作或者是妥协的结果。
二 一个视频标准能普及还在于他的对手
H.264和他的朋友们
1 VP8
2 AV1
3 AVS (Audio Video Coding Standard) by China.
4 VP9
2.1 WMV
WMV(Windows Media Video)是微软推出的一种流媒体格式,它是在“同门”的ASF(Advanced Stream Format)格式升级延伸来得。在同等视频质量下,WMV格式的文件可以边下载边播放,因此很适合在网上播放和传输。
WMV(Windows Media Video)不仅仅基于微软公司的自有技术开发的。从第七版(WMV1)开始,微软公司开始使用它自己非标准MPEG-4Part2。但是,由于WMV第九版已经是SMPTE的一个独立标准(421M,也称为VC-1),所以WMV的发展已经不象MPEG-4,它是一个它自己专有的编解码技术。VC-1专利共享的企业有16家(2006年4月),微软公司也是MPEG-4AVC/H.264专利共享企业中的一家。
微软的WMV还是很有影响力的。可是由于微软本身的局限性其WMV的应用发展并不顺利。
1)WMV是微软的产品它必定要依赖着Windows,Windows意味着解码部分也要有PC,起码要有PC机的主板。这就增加了机顶盒的造价,从而影响了视频广播点播的普及。
2)WMV技术的视频传输延迟较大。
WMV-HD,基于WMV9标准,是微软开发的视频压缩技术系列中的其中一个版本,一般采用.wmv为后缀的HDTV文件就是采用的WMV-HD压缩的。VC-1从压缩比上来看,H.264的压缩比率更高一些,VC-1的熵编码采用的是自适应变长编码。
2.2 VP8
VP8来自On2 的WebM, VPX(VP6,VP7,VP8,VP9),这个编码设计用于web视频。
2010年2月,Google以1.246亿美元完成了对On2 Technologies的收购。在完成收购之后的第三个月举办的GoogleI/O开发者大会上,Google开放了其拥有的VP8视频编码技术源代码并免费提供给所有开发者使用。
Google目前在Android, Chrome浏览器、YouTube网站等服务中使用VPX技术。
WebRTC(Web Real Time Communication)。在2010年5月,Google以大约6820万美元收购了VoIP软件开发商Global IP Solutions公司,并因此获得了该公司拥有的WebRTC技术。
WebRTC集成VP8, VP9。
2.3 AV1
AOMedia Video 1(AV1)是一个开放,免专利的视频编码格式,针对互联网传输视频而设计。它目前由开放媒体联盟(AOMedia)所开发,该联盟由半导体企业、视频点播供应商和网页浏览器开发商等于2015年成立。它是互联网工程任务组(IETF)视频标准化工作组NetVC的主要竞争者。其目标是取代前身VP9,并与MPEG的HEVC/H.265竞争。AV1可以与HTML5网页视频和WebRTC未来版本的WebM容器格式的音频格式opus一起使用。
Alliance for Open Media (AOMedia)
该联盟的主要目标是创建和交付下一代技术开放视频压缩格式和编解码器,这些视频压缩格式对互联网上的流媒体媒体进行了优化,包括商业和非商业内容,包括用户生成内容。联盟目前正在开发一种名为AV1的新型视频格式。来自芯片工业(AMD,ARM,英特尔,Nvidia)的联盟成员将确保硬件友好的设计。AOMedia计划在2017年底前完成其格式(AV1)的第一个版本。关于bitstream规范的工作将在2018年继续进行。AV1是专门为实时应用程序设计的,比当前生成的视频格式(h.264)的典型使用场景更能解决问题。
该联盟的设计目标是提供下一代视频格式,包括以下的特点。
- l Interoperable and open;(可互操作和开放的)
- l Optimized for the Internet;(针对互联网做优化)
- l Scalable to any modern device at any bandwidth;(可拓展到任意带宽下的任何现代设备)
- l Designed with a low computational footprint and optimized for hardware;(计算量低,针对硬件做优化)
- l Capable of consistent, highest-quality, real-time video delivery;(能够实现持续的的高质量实时视频的传输)
- l Flexible for both commercial and non-commercial content, including user-generated content.(适用于商业的和非商业的内容,包括用户生成的内容)
联盟包括
创始成员: Amazon, Apple, ARM, Cisco, Facebook, Google, IBM, Intel, Microsoft, Mozilla, Netflix vidia
一般会员: Argon Design, Ateme, BBC Research & Development, Bitmovin,Broadcom, Chips&Media, Hulu, Ittiam, NGCodec, Polycom, Realtek, Sigma Designs, Socionext, VeriSilicon, VideoLAN, Vidyo, Xilinx
谷歌、微软、思科、Mozilla,分别有VPx、WMV/MPEG/VC-1、Thor、Daala等编码算法,这为AV1提供了直接的技术支撑。
谷歌、火狐、微软、苹果,把控着浏览器95%的市场份额,所以AV1要能在浏览器上就实现直接播放。
AMD、Intel、NVIDIA、ARM、XILINX:PC端和移动端的硬件芯片厂商齐聚,让AV1硬件加速成为可能,从X86到GPU到ARM到FPGA。
视频内容提供商有谷歌的YouTube、Netflix、亚马逊的Prime、Ateme,又提供OTT盒子,又有世界最大的IPTV运营商,另外还有音视频应用类成员Vidy、Polycom。
HEVC/H265因为版税这次有点犯众怒,组成AOMedia就是信号,大家原来各自开发的编解码器对抗不了HEVC/H265?那就联合起来。
当然,推动HEVC的组织在这一过程中并不会坐视不管。他们已经开始威胁要对AV1发起专利诉讼,而开放媒体联盟AOMedia将不遗余力地确保它不会发生。他们正在对AV1进行广泛的法律代码审查,以确保它不会侵犯MPEG LA、HEVC Advance和Velos Media,以及Technicolor等所拥有的任何专利。这种形式的代码复查对VP8和VP9非常成功,这两种方式都能在所有法律挑战中存活下来。MPEG LA对VP8和VP9的行动被认为可能没有任何法律基础,反而纯粹是反竞争。美国司法部正在调查MPEG LA的行动,直到他们同意放弃诉讼,并允许谷歌允许将MPEG LA的专利池授权给VP8或VP9的任何用户。虽然我们可能会看到类似的阻止AV1的尝试,但谷歌大幅扩大了专利池,支持codec的公司数量大幅增加(这要归功于开放媒体联盟),这两家公司都应该在很长一段时间内确保它们能得到处理。
2.6 AVS
AVS是中国具备自主知识产权的第二代信源编码标准,是《信息技术先进音视频编码》系列标准的简称,其包括系统、视频、音频、数字版权管理等四个主要技术标准和符合性测试等支撑标准。
AVS从其出生之日就不是一个简单的市场化行为,这决定了行政力量是AVS的主要推动力。2002年6月,“数字音视频编解码技术标准工作组”(简称AVS工作组)由国家信息产业部科学技术司批准成立,挂靠单位为中国科学院计算技术研究所。工作组的任务是:面向我国的信息产业需求,联合国内企业和科研机构,制(修)订数字音视频的压缩、解压缩、处理和表示等共性技术标准,为数字音视频设备与系统提供高效经济的编解码技术,服务于高分辨率数字广播、高密度激光数字存储媒体、无线宽带多媒体通讯、互联网宽带流媒体等重大信息产业应用。
2006年2月,AVS视频编码成为国家标准,获批的标准号为GB/T20090,并于2006年3月1日起实施。数字音视频编解码技术标准工作组
2019年9月16日,华为海思发布全球首颗基于AVS3.0视频标准的8K/120fps解码芯片Hi3796CV300,CPU处理能力达到4核1.6GHz,28nm工艺,助跑广电进入全8K时代。
三 版税
不同于H.264, H.265/HEVC的版税很高,虽然现在有降价但还是很高。
目前至少有四家组织或公司在收取HEVC的许可费用:老牌的专利池MPEG LA,新兴的专利池HEVC Advance和Velos Media,以及Technicolor公司。Velos Media和Technicolor暂时没有公布自己的收费政策。
MPEG LA公司是全球领先的各种标准和其他技术平台的一站式许可证提供商,从20世纪90年代开始就开创了现代专利池,上一代应用最广泛的标准H.264也是由该公司来提供许可授权的。所以对于HEVC的授权许可政策还算厚道,但也价格不菲。
l 0-10万套/年,免专利许可费
l 超过10万套的部分每套收取2美元的专利许可费
l 封顶费用为2500万美元
l 包含制造权、使用权和销售权
l 专利许可费从2013年5月1日开始计算
l 针对HEVC内容不再单独收取专利许可费
l 半导体芯片供应商或其他包含HEVC编码器/解码器的产品供应商可以以其获许可客户的名义支付专利许可费
四 一个视频标准能普及因为他解决的应该场景广
H.264的应用场景或设计目标。
1)视频广播 Broadcast:cable,satellites, and DSL.
2)视频存储 Storage:DVD, HD DVD,and Blu-ray.
3)视频会议 Video Conferencing:over different networks.
4)视频流,直播点播 Multimedia Streaming: live and on-demand.
5)短视频服务 Multimedia Messaging Services.
所谓普及只是H.264 /5 在视频应用的一个子场景,视频内容的存储和播放。
不想瞎扯了,还是回到问题吧。
现在限制H265发展的是什么?
1)商业利益
比如版权专利费等,各大厂站队分账(分脏)等。其实开源编码器也是有商业利益在背后的。
2)HEVC/H.265 的对手
编码器VP9等。 在2017年及以前,HEVC/H.265 的最大对手其实是H.264。
3)HEVC/H.265 的配套
H.265是针对大尺寸视频2K, 4K, 8K,多路视频,超高精度视频,3D视频等,如果对应的采集、播放和运算设备都没准备好,H.265也无用武之地。
根据CISCO的分析预测到2021年,从2016年到2021年数据视频还是以高清为主,超高清占30%左右。H.264是对应高清的,H.265对应超高清。
HEVC/H.265什么时候能普及开呢?
按H.264的发展推H.265, 预计2022到2025年
展望(下一代视屏编码格式)
2.4 H265(下一代视屏编码格式之一)
2.4.1 更好的压缩
与H.264编解码器相比,HEVC在压缩方面提供了重大的改进。实际上,HEVC压缩视频的效率比H.264要高出两倍。使用HEVC,相同视觉质量的视频只占用一半的空间。或者,具有相同文件大小和比特率的视频可以呈现更好的质量。
这种改进有一部分要归功于增加的宏块大小。宏块定义为用于压缩计算的图像区域,较大的宏块可以有效地压缩高分辨率的视频。H.264仅允许16×16像素的宏块,这些宏块太小,以致于无法高效地播放1080p以上的视频。HEVC则提供64 x 64像素的宏块(现在称为编码树单元或CTU),从而在更高的分辨率下实现更高的编码效率。
2.4.2 改进的帧间运动预测
视频压缩的一个主要因素是预测帧之间的运动(或其缺少)。当像素保持静止(固态背景图像)时,智能的视频编解码器可以通过引用它来节省空间,而不是再现它。通过改进的运动预测,HEVC可以提供更小的文件大小和更高的压缩质量。
2.4.3 改进的帧间预测
视频压缩其实也受益于分析单个帧内的“移动”,从而可以更有效地压缩单帧视频。这可以通过使用数学函数而不是实际像素值来描述像素布局来实现。该功能占用的空间少于像素数据,从而缩小文件大小。然而,编解码器必须支持足够高级的数学函数才能使该技术真正发挥作用。HEVC的帧间预测功能比H.264的更详细,前者支持33个方向的运动预测,而后者只支持9个方向。
2.4.4并行处理
HEVC使用可以独立解码于帧其余部分的单元和片段层。这意味着解码过程可以跨多个并行处理线程进行拆分,并充分利用现有标准多核处理器上更高效的解码机会。随着视频分辨率越来越高,这种提高效率需要在低端硬件上以可观看的速度对视频进行解码。
2.5 VP9(下一代视屏编码格式之一)
VP9 是由 Google 开发的开放式、无版权费的视频编码标准,在开发初期曾经被命名为 Next Gen Open Video,VP9 也被视为是 VP8 的下一代视频编码标准。 VP9 广泛用于音视频通话 Firefox, Chrome等主流浏览器和FFmpeg等视频播放器已经支持了VP9编码 。 它有一个优势,就是用VP9编码能比过去的VP8或H.264编码的视频节省一半带宽。 申请成为VP9编码的合作伙伴非常简单,没有那么多复杂授权问题,而且该编码技术为免费提供。但在过去用H.264的任何软硬件厂商都要向MPEG LA支付授权费,然后该费用由专利拥有者分配。
2.5.1 H.265、VP9 性能对比
编码质量
△ 编码质量测试
上图为 H.265 与 VP9 编码质量的对比测试,数值越小,则表示编码质量越好。从对比中我们发现 H.265、VP9 两者的差别并不大,整体平均分只差了 0.001,在实际应用中几乎不存在差异。
2.5.2 编码时间
△ 编码时间测试
在编码时间对比中,VP9 完胜 H.265,无论是 4K 视频还是 1920、1280 分辨率的视频,VP9 的编码耗时都比 H.265 短很多。
2.5.3 CPU 消耗
△ CPU 消耗测试
上图是 H.265 和 VP9 在 Dell Precision 390 工作站上播放 CPU 消耗测试,VP9 在 Firefox 上 CPU 解码效率比 Chrome 更高效。而 H.265 在 DivX 上远远比 VLC Player 高效。将两个编码标准的数据进行对比之后,H.265 的解码效率略高于 VP9 。
未来属于 H.265 还是 VP9
H.265 继承了 H.264 的视频编码标准体系,在商业应用中更加广泛,多使用于安防、军政、企业等场景中,但由于其专利持有者过多,导致其商用费用过高,在推广中面临较大阻力。
VP9 由 Google 研发,可以免费使用。在实际推广中,微软、苹果等公司不愿看到 VP9 一家独大,其他互联网厂商也不希望主流视频编码格式被垄断,因此目前在主要在 Google 自家的产品中得到支持,其他使用 VP9 的大厂并不多。
就目前而言,H.265 在企业、安防中使用较为广泛,而 VP9 因其简易、实用的解决方案以及开发免费的特性在互联网应用场景中使用较多。未来两者究竟谁会是主流的视频编码标准,这点还不好说。当然,随着视频应用场景的多样化,未来也有可能是两者并而行之,相辅相成。
更便捷的多媒体云处理
不论是 H.265 还是 VP9,都有着其优势领域,用户可以根据实际的应用场景选择使用的格式。
目前,又拍云的媒体处理已同时支持 H.265 和 VP9 视频编码标准。客户在进行音视频处理时,只需要把视频编码格式设置成 libx265 或 libvpx-vp9,即可实现视频编码成 H.265 或 VP9。
编码原理
为什么要编码?
一个原始的视频文件非常的大,一部电影可能就200G,而通过对它编码压缩,能够使其缩小,减少存储成本。
视频是连续的图像序列,由连续的帧构成,一帧即为一幅图像。
由于人眼的视觉暂留效应,当帧序列以一定的速率播放时,我们看到的就是动作连续的视频。这么多连续的图像数据如果不经过编码的数据量太大了。
比如一个1920x1080分辨率,32位,每秒30帧的视频,一秒钟需要1920*1080*32*30
,大小大概为237MB数据。
如何编码
大致情况就是忽略相同的,保留差异点,并使用算法来确定每一帧情况。可以参考diff算法。
编码的目的
编码的目的,就是为了压缩。各种视频编码方式,都是为了让视频变得体积更小,有利于存储和传输。编码的核心思想就是去除冗余信息。
冗余信息描述
- 空间冗余 == 相邻像素重复:图像内部相邻像素之间存在较强的相关性多造成的冗余。
- 时间冗余 == 帧之间差值:视频图像序列中的不同帧之间的相关性所造成的冗余。
- 视觉冗余 == 人类不敏感的颜色:深红色和浅红色OK,但是:红色偏一点点橘红色,你还分得清楚吗?。大概是指人眼不能感知或不敏感的那部分图像信息。
- 信息熵冗余 == 熵编码-哈夫曼算法。也称编码冗余,人们用于表达某一信息所需要的比特数总比理论上表示该信息所需要的最少比特数要大,它们之间的差距就是信息熵冗余,或称编码冗余。
- 知识冗余 == 人类(头 身体 腿),汽车,房子 不需要记录。就是指在有些图像中还包含与某些验证知识有关的信息。
I帧,P帧,B帧
I帧:帧内编码帧,关键帧,I帧可以看作一个图像经过压缩之后的产物,可以单独解码出一个完整的图像;(压缩率最低)。
P帧:前向预测/参考 编码帧,记录了本帧跟之前的一个关键帧(或P帧)的差别,解码时需要用之前缓存的画面叠加上本帧定义的差别,生成最终画面。 (压缩率比I帧高,比B帧低 属于 适中情况)。
B帧:双向预测/参考 编码帧,记录了本帧与前后帧的差别,解码需要参考前面一个I帧或者P帧,同时也需要后面的P帧才能解码一张完整的图像。 (参考前后的预测得到的,压缩率是最高,但是耗时)。
H.264进制数据分析
H264视频压缩算法现在无疑是所有视频压缩技术中使用最广泛,最流行的。随着 x264/openh264以及ffmpeg等开源库的推出,大多数使用者无需再对H264的细节做过多的研究,这大降低了人们使用H264的成本。
但为了用好H264,我们还是要对H264的基本原理弄清楚才行。今天我们就来看看H264的基本原理。
标准
视频编码就是指通过特定的压缩技术或算法,将某个视频格式文件装换成另外一种视频格式文件的方法。
视频流传输中最重要的编解码标准有:以下两个标准。
- 国际电联(ITU-T,国际电信联盟)的H.261、H.263、H.264、H.265等。
- ISO国际标准化组织与IEC国际电子委员会于1988年联合成立的MPEG系列,称为MPEG- AVC。
两者为合作关系:国际电联方面称之为H.264。但是ISO/IEC的则将这个新标准归纳为MPEG系列,称为MPEG-4 AVC。
而H.265则被视为是ITU-T H.264/MPEG-4 AVC标准的继任者,又称为高效率视频编码(High Efficiency Video Coding,称为H.265/HEVC)。
H.264概括
H264压缩技术主要采用了以下几种方法对视频数据进行压缩。包括:
- 帧内预测压缩,解决的是空域数据冗余问题。
- 帧间预测压缩(运动估计与补偿),解决的是时域数据冗徐问题。
- 整数离散余弦变换(DCT),将空间上的相关性变为频域上无关的数据然后进行量化。
- CABAC压缩。
经过压缩后的帧分为:I帧,P帧和B帧:
- I帧:关键帧,采用帧内压缩技术。
- P帧:向前参考帧,在压缩时,只参考前面已经处理的帧。采用帧音压缩技术。
- B帧:双向参考帧,在压缩时,它即参考前而的帧,又参考它后面的帧。采用帧间压缩技术。
除了I/P/B帧外,还有图像序列GOP。
- GOP:两个I帧之间是一个图像序列,在一个图像序列中只有一个I帧。如下图所示:
下面我们就来详细描述一下H264压缩技术。
H264压缩技术
H264的基本原理其实非常简单,下我们就简单的描述一下H264压缩数据的过程。通过摄像头采集到的视频帧(按每秒 30 帧算),被送到 H264 编码器的缓冲区中。编码器先要为每一幅图片划分宏块。
以下面这张图为例:
划分宏块
H264默认是使用 16X16 大小的区域作为一个宏块,也可以划分成 8X8 大小。
划分好宏块后,计算宏块的像素值。
以此类推,计算一幅图像中每个宏块的像素值,所有宏块都处理完后如下面的样子。
划分子块
H264对比较平坦的图像使用 16X16 大小的宏块。但为了更高的压缩率,还可以在 16X16 的宏块上更划分出更小的子块。子块的大小可以是 8X16、 16X8、 8X8、 4X8、 8X4、 4X4非常的灵活。
上幅图中,红框内的 16X16 宏块中大部分是蓝色背景,而三只鹰的部分图像被划在了该宏块内,为了更好的处理三只鹰的部分图像,H264就在 16X16 的宏块内又划分出了多个子块。
这样再经过帧内压缩,可以得到更高效的数据。下图是分别使用mpeg-2和H264对上面宏块进行压缩后的结果。其中左半部分为MPEG-2子块划分后压缩的结果,右半部分为H264的子块划压缩后的结果,可以看出H264的划分方法更具优势。
宏块划分好后,就可以对H264编码器缓存中的所有图片进行分组了。
帧分组
对于视频数据主要有两类数据冗余,一类是时间上的数据冗余,另一类是空间上的数据冗余。其中时间上的数据冗余是最大的。下面我们就先来说说视频数据时间上的冗余问题。
为什么说时间上的冗余是最大的呢?假设摄像头每秒抓取30帧,这30帧的数据大部分情况下都是相关联的。也有可能不止30帧的的数据,可能几十帧,上百帧的数据都是关联特别密切的。
对于这些关联特别密切的帧,其实我们只需要保存一帧的数据,其它帧都可以通过这一帧再按某种规则预测出来,所以说视频数据在时间上的冗余是最多的。
为了达到相关帧通过预测的方法来压缩数据,就需要将视频帧进行分组。那么如何判定某些帧关系密切,可以划为一组呢?我们来看一下例子,下面是捕获的一组运动的台球的视频帧,台球从右上角滚到了左下角。
H264编码器会按顺序,每次取出两幅相邻的帧进行宏块比较,计算两帧的相似度。如下图:
通过宏块扫描与宏块搜索可以发现这两个帧的关联度是非常高的。进而发现这一组帧的关联度都是非常高的。因此,上面这几帧就可以划分为一组。其算法是:在相邻几幅图像画面中,一般有差别的像素只有10%以内的点,亮度差值变化不超过2%,而色度差值的变化只有1%以内,我们认为这样的图可以分到一组。
在这样一组帧中,经过编码后,我们只保留第一帖的完整数据,其它帧都通过参考上一帧计算出来。我们称第一帧为IDR/I帧,其它帧我们称为P/B帧,这样编码后的数据帧组我们称为GOP。
运动估计与补偿
在H264编码器中将帧分组后,就要计算帧组内物体的运动矢量了。还以上面运动的台球视频帧为例,我们来看一下它是如何计算运动矢量的。
H264编码器首先按顺序从缓冲区头部取出两帧视频数据,然后进行宏块扫描。当发现其中一幅图片中有物体时,就在另一幅图的邻近位置(搜索窗口中)进行搜索。如果此时在另一幅图中找到该物体,那么就可以计算出物体的运动矢量了。下面这幅图就是搜索后的台球移动的位置。
通过上图中台球位置相差,就可以计算出台图运行的方向和距离。H264依次把每一帧中球移动的距离和方向都记录下来就成了下面的样子。
运动矢量计算出来后,将相同部分(也就是绿色部分)减去,就得到了补偿数据。我们最终只需要将补偿数据进行压缩保存,以后在解码时就可以恢复原图了。压缩补偿后的数据只需要记录很少的一点数据。如下所示:
我们把运动矢量与补偿称为帧间压缩技术,它解决的是视频帧在时间上的数据冗余。除了帧间压缩,帧内也要进行数据压缩,帧内数据压缩解决的是空间上的数据冗余。下面我们就来介绍一下帧内压缩技术。
帧内预测
人眼对图象都有一个识别度,对低频的亮度很敏感,对高频的亮度不太敏感。所以基于一些研究,可以将一幅图像中人眼不敏感的数据去除掉。这样就提出了帧内预测技术。
H264的帧内压缩与JPEG很相似。一幅图像被划分好宏块后,对每个宏块可以进行 9 种模式的预测。找出与原图最接近的一种预测模式。
下面这幅图是对整幅图中的每个宏块进行预测的过程。
然后,将原始图像与帧内预测后的图像相减得残差值。
再将我们之前得到的预测模式信息一起保存起来,这样我们就可以在解码时恢复原图了。效果如下:
经过帧内与帧间的压缩后,虽然数据有大幅减少,但还有优化的空间。
对残差数据做DCT
可以将残差数据做整数离散余弦变换,去掉数据的相关性,进一步压缩数据。如下图所示,左侧为原数据的宏块,右侧为计算出的残差数据的宏块。
将残差数据宏块数字化后如下图所示:
将残差数据宏块进行 DCT 转换。
去掉相关联的数据后,我们可以看出数据被进一步压缩了。
做完 DCT 后,还不够,还要进行 CABAC 进行无损压缩。
DCT原理大白话
这是第一帧画面:P1(我们的参考帧)
这是第二帧画面:P2(需要编码的帧)
从视频中截取的两张间隔1-2秒的画面,和实际情况类似,下面我们进行几次运动搜索:
这是一个演示程序,鼠标选中P2上任意16x16的Block,即可搜索出P1上的 BestMatch 宏块。虽然车辆在运动,从远到近,但是依然找到了最接近的宏块坐标。
这是一个演示程序,鼠标选中P2上任意16x16的Block,即可搜索出P1上的 BestMatch 宏块。虽然车辆在运动,从远到近,但是依然找到了最接近的宏块坐标。
搜索演示2:空中电线交叉位置(上图P1,下图P2)
搜索演示3:报刊停的广告海报
同样顺利在P1中找到最接近P2里海报的宏块位置。
图片全搜索:根据P1和运动矢量数据(在P2中搜索到每一个宏块在P1中最相似的位置集合)还原出来的P2’,即完全用P1各个位置的宏块拼凑出来最像P2的图片P2’,效果如下:
仔细观察,有些支离破碎对吧?肯定啊,拼凑出来的东西就是这样,现在我们用P2`和P2像素相减,得到差分图 D2 = (P2’ - P2) / 2 + 0x80:
这就是之前支离破碎的 P2` 加上误差 D2之后变成了清晰可见的样子,基本还原了原图P2。
由于D2仅仅占5KB,加上压缩过后的运动矢量不过7KB,所以参考P1我们只需要额外 7KB的数据量就可以完整表示P2了,而如果独立将P2用质量尚可的有损压缩方式独立压缩,则至少要去到50-60KB,这一下节省了差不多8倍的空间,正就是所谓运动编码的基本原理。
实际在使用中,参考帧并不一定是前面一帧,也不一定是同一个GOP的I帧,因为GOP间隔较长时,后面的图片离I帧变化可能已经很大了,因此常见做法是最近15帧中选择一帧误差最小的作为参考帧,虽然彩色画面有YUV三个分量,但是大量的预测工作和最有选择通常是根据Y分量的灰度帧进行判断的。
再者误差我们保存的是(P2-P2’)/2 + 0x80,实际使用时我们会用更有效率的方式,比如让[-64,64]之间的色差精度为1,[-255,-64], [64, 255] 之间的色差精度为2-3,这样会更加真实一些。
同时上文很多地方用的是直接lzma2进行简单存储,实际使用时一般会引入熵编码,对数据进行一定层次的整理然后再压缩,性能会好不少。
CABAC
上面的帧内压缩是属于有损压缩技术。也就是说图像被压缩后,无法完全复原。而CABAC属于无损压缩技术。
无损压缩技术大家最熟悉的可能就是哈夫曼编码了,给高频的词一个短码,给低频词一个长码从而达到数据压缩的目的。MPEG-2中使用的VLC就是这种算法,我们以 A-Z 作为例子,A属于高频数据,Z属于低频数据。看看它是如何做的。
CABAC也是给高频数据短码,给低频数据长码。同时还会根据上下文相关性进行压缩,这种方式又比VLC高效很多。其效果如下:
现在将 A-Z 换成视频帧,它就成了下面的样子。
从上面这张图中明显可以看出采用 CACBA 的无损压缩方案要比 VLC 高效的多。
H.264分层结构(VCL与NAL)
VCL(Video Coding Layer,视频编码层):负责高效的视频内容表示,VCL数据即编码处理的输出,它表示被压缩编码后的视频数据序列。
NAL(Network Abstraction Layer,网络提取层):负责以网络所要求的恰当的方式对数据进行打包和传送,是传输层。不管在本地播放还是网络播放,都要通过这一层来传输。
VCL就是被压缩编码后原始数据,在VCL数据封装到NAL单元中之后,才可以用于传输或存储。
NAL( 片 (宏块) )
一帧图片经过 H.264 编码器之后,NAL单元就是装载着这些片(被编码为一个或多个片 slice), 每片包含整数个宏块(至少一个宏块,最多包含整个图像宏块)。
1 | 一般H.264编码器的默认输出为:起始码+NALU(Nal单元)。起始码为:0x00000001或者0x000001。 |
NAL 类型查表
真正开发中:只分析:SPS序列参数集,PPS图像参数集,I帧
为什么区低五位?
- 一个字节8位。
0 1 1 0 0 1 1 1
- SPS 序列参数集(记录有多少I帧,多少B帧,多少P帧,帧是如何排列) == 7
00 00 00 01 67,0x67 —> 2进制01100111 —> 取低五位 00000111 —> 十六进制 0x07 - PPS 图像参数集(图像宽高信息等) == 8
00 00 00 01 68, 0x68 —> 2进制01101000—> 取低五位 00001000 —> 十六进制 0x08 - SEI补充信息单元(可以记录坐标信息,人员信息, 后面解码的时候,可以通过代码获取此信息)
https://blog.csdn.net/y601500359/article/details/80943990
00 00 01 06 , 0x06 —> 2进制00000110—> 取低五位00000110 —> 十六进制 0x06 - 00 00 00 65, 0x65 —> 2进制01100101—> 取低五位00000101 —> —> 十六进制 0x06
最终是 5 I帧完整画面出来
0x01 == 普通P帧 和 重要P帧 ,还有B帧
00 00 00 01 61 重要的P帧
00 00 00 01 61 —> 2进制01100001—> 取低五位00000001 —> —> 十六进制 0x01
00 00 00 01 41 —> 2进制01000001—> 取低五位00000001 —> —> 十六进制 0x01
B帧:
00 00 00 01 01 —> 2进制00000001—> 取低五位00000001 —> —> 十六进制 0x01
PTS与DTS
DTS表示解码时间戳,在什么时候解码这一帧的数据 ;
PTS表示显示时间戳 ,在什么时候显示这一帧。
在没有B帧的情况下,DTS和PTS的输出顺序是一样的。
因为B帧打乱了解码和显示的顺序(要解码B帧需要先解码后面的P帧),所以一旦存在B帧,PTS和DTS就会不
同。
I帧 p b p b p b b p I帧 == GOP
I帧之间分为一组
I P B P B P B P B I 一组
i帧=GOP是什么理解的?
SPS PPS I P B P B P B P B I 一组 SPS PPS I P B P B P B P B I 二组
短视频中 i帧越少越好 B帧越多越好
视频直播中 I帧越多越好 B帧越少越好(I帧一定是有间隔的,一般是两秒一个I帧)