2024年1月26日发(作者:)

TCC8900 VPU分析——常见视频编解码格式及RGB和YUV存储格式预研一、常见视频编解码格式1视频文件类别

  目前,很多视频数据要求通过Internet来进行实时传输,前面我们曾提及到,视频文件的体积往往比较大,而现有的网络带宽却往往比较“狭窄”,千军万马要过独木桥,其结果当然可想而知。客观因素限制了视频数据的实时传输和实时播放,于是一种新型的流式视频(Streaming Video)格式应运而生了。这种流式视频采用一种“边传边播”的方法,即先从服务器上下载一部分视频文件,形成视频流缓冲区后实时播放,同时继续下载,为接下来的播放做好准备。这种“边传边播”的方法避免了用户必须等待整个文件从Internet上全部下载完毕才能观看的缺点。到目前为止,Internet上使用较多的流式视频格式主要是以下三种:1)RM(Real Media)格式  RM格式是RealNetworks公司开发的一种新型流式视频文件格式,它麾下共有三员大将:RealAudio、RealVideo和RealFlash。RealAudio用来传输接近CD音质的音频数据,RealVideo用来传输连续视频数据,而RealFlash则是RealNetworks公司与Macromedia公司新近合作推出的一种高压缩比的动画格式。RealMedia可以根据网络数据传输速率的不同制定了不同的压缩比率,从而实现在低速率的广域网上进行影像数据的实时传送和实时播放。这里我们主要介绍RealVideo,它除了可以以普通的视频文件形式播放之外,还可以与RealServer服务器相配合,首先由RealEncoder负责将已有的视频文件实时转换成

1.2流式视频格式

  日常生活中接触较多的VCD、多媒体CD光盘中的动画……这些都是影像文件。影像文件不仅包含了大量图像信息,同时还容纳大量音频信息。所以,影像文件的“身材”往往不可小觑。1)AVI格式2)MOV格式3)MPEG/MPG/DAT格式

1.1影像格式

常言道:物以类聚,人以群分。视频文件也不例外,细细算起来,视频文件可以分成两大类:其一是影像文件,比如说常见的VCD便是一例。其二是流式视频文件,这是随着国际互联网的发展而诞生的后起视频之秀,比如说在线实况转播,就是构架在流式视频技术之上的。

2.1常见视频编码格式

下图为常见编码格式的logo:

常见的编码格式有H.264、H.263、MPEG-1、MPEG-2、MPEG、4、Sorenson

Spark、VC-1、JPEG、RV、DivX、On2 True Motion VP6。对于高清视频来说,主流的编码技术目前主要有 MPEG-2、DivX、XVID、H264/AVC、VC-1、RMVB 和

WMV-HD 等等。其中,H264/AVC、VC-1、MPEG-2 是蓝光(Blu-ray Disc)所选择的编码格式,也是目前最流行的高清视频编码格式。另外就是高清视频的封装格式,封装格式和编码格式是互相区别的,许多人会把它们混淆。

2常见的视频的编码及封装格式

RealMedia格式,RealServer则负责广播RealMedia视频文件。在数据传输过程中可以边下载边由RealPlayer播放视频影像,而不必像大多数视频文件那样,必须先下载然后才能播放。目前,Internet上已有不少网站利用RealVideo技术进行重大事件的实况转播。2)MOV文件格式(QuickTime)  MOV也可以作为一种流文件格式。QuickTime能够通过Internet提供实时的数字化信息流、工作流与文件回放功能,为了适应这一网络多媒体应用,QuickTime为多种流行的浏览器软件提供了相应的QuickTime Viewer插件(Plug-in),能够在浏览器中实现多媒体数据的实时回放。该插件的“快速启动(Fast Start)”功能,可以令用户几乎能在发出请求的同时便收看到第一帧视频画面,而且,该插件可以在视频数据下载的同时就开始播放视频图像,用户不需要等到全部下载完毕就能进行欣赏。此外,QuickTime还提供了自动速率选择功能,当用户通过调用插件来播放QuickTime多媒体文件时,能够自己选择不同的连接速率下载并播放影像,当然,不同的速率对应着不同的图像质量。此外,QuickTime还采用了一种称为QuickTime VR的虚拟现实(VR,Virtual

Reality)技术,用户只需通过鼠标或键盘,就可以观察某一地点周围360度的景象,或者从空间任何角度观察某一物体。3)ASF(Advanced Streaming Format)格式  Microsoft公司推出的Advanced Streaming Format (ASF,高级流格式),也是一个在Internet上实时传播多媒体的技术标准,Microsoft公司的野心很大,希图用ASF取代QuickTime之类的技术标准。ASF的主要优点包括:本地或网络回放、可扩充的媒体类型、部件下载、以及扩展性等。ASF应用的主要部件是NetShow服务器和NetShow播放器。有独立的编码器将媒体信息编译成ASF流,然后发送到NetShow服务器,再由NetShow服务器将ASF流发送给网络上的所有NetShow播放器,从而实现单路广播或多路广播。这和Real系统的实时转播则是大同小异。

图1.1常见编码格式logo2)H.263编码格式

于1990年定义完成。1992年底,MPEG-1正式被批准成为国际标准。MPEG-1是为CD光碟介质定制的的视频和音频压缩格式。一张70分钟的CD光碟传输速率大约在1.4Mbps。而MPEG-1采用了块方式的运动补偿、离散馀弦变换(DCT)、量化等技术,并为1.2Mbps传输速率进行了优化。MPEG-1随后被Video CD采e

a3)MPEG-1 编码格式MPEG-1是MPEG组织制定的第一个视频和音频有损压缩标准。视频压缩算法ndH.263是国际电联ITU-T的一个标准草案,是为低码流通信而设计的。但实际上这个标准可用在很宽的码流范围,而非只用于低码流应用,它在许多应用中可以认为被用于取代H.261。H.263的编码算法与H.261一样,但做了一些改善和改变,以提高性能和纠错能力。1998年IUT-T推出的H.263+是H.263建议的第2版,它提供了12个新的可协商模式和其他特征,进一步提高了压缩编码性能。如H.263只有5种视频源格式,H.263+允许使用更多的源格式,图像时钟频率也有多种选择,拓宽应用范围;另一重要的改进是可扩展性,它允许多显示率、多速率及多分辨率,增强了视频信息在易误码、易丢包异构网络环境下的传输。另外,H.263+对H.263中的不受限运动矢量模式进行了改进,加上12个新增的可选模式,不仅提高了编码性能,而且增强了应用的灵活性。H.263已经基本上取代了H.261

All

things

in

their

be绝大多数视听玩家对于 H264 编码都不会感到陌生,H264 编码的身世显赫,是 ITU-T(国际电信联盟视频编码专家组)与 ISO/IEC(国际标准化组织动态图像专家组)合作组成的 JVT(联合视频组)推动的新一代数字视频编码标准,也称为 MPEG-4/AVC 编码。H264 编码依托雄厚的背景,在技术上独树一帜,大幅领先于其它编码算法。X264 编码,是 H264 编码的一个开源分支,它符合 H264 标准,其功能在于编码,而不作为解码器使用,X264 编码最大的特点在于注重实用,它在不明显降低编码性能的前提下,努力降低编码的计算复杂度,X264 对于 H264 编码中的一些复杂编码特性做了折衷处理,其压缩视频体积小于XVID(MPEG-4)编码视频,以小体积、高画质的特点得到了广泛认可。ing

are

goo1)H264/X264/AVC 编码格式d

for

so

用作为核心技术。MPEG-1的输出质量大约和传统录像机VCR,信号质量相当,这也许是Video CD在发达国家未获成功的原因。4)MPEG-2 编码格式5)MPEG-4 编码格式MPEG4不仅是针对一定比特率下的视频、音频编码,更加注重多媒体系统的交件(Video Email)和电子新闻(Electronic News)等,其传输速率要求较低,在帧重建技术,压缩和传输数据,以求以最少的数据获得最佳的图像质量。6)Sorensen Spark编码格式Sorenson编解码器可以指三个专有的视频编解码器:Sorenson视频,编解码器,Sorenson视频量化或SVQ。Sorenson Spark也被称为H.263或式名称命名)。这两种编解码器的设计由Sorenson媒体公司。Sorenson视频是用在苹果的QuickTime和Sorenson Spark在用在Adobe Flash容器中。7)VC-1 编码格式

WMV(Windows Media Video)作为经久不衰的一种视频编码,一直在不断改进,2003 年,微软基于 WMV 第九版(WMV9)编码技术,正式提出了 VC-1

编码标准,并于 2006 年正式成为国际标准。VC-1 编码作为较晚推出的高清编码算法,自然吸收了 MPEG-2 与 H264 编码的优点,其压缩比介于 MPEG2 和

H264 之间,编解码复杂性仅有 H264 的一半,即压缩时间更短、解码计算更小,在微软的大力推动下,VC-1 编码已经得到了 BD 蓝光光盘、电影及电视学会(SMPTE)的支持。近几年来,为了更好的推广 WMV9/VC-1 编码标准,微软不遗余力的建立了

WMV-HD 高清资源站点,大量发布采用 VC-1 编码压制的 720P、1080P 宣传片及演示片(WMV-HD 视频格式) ,试图营造声势,吸引用户关注。不过,中庸的技术(与 H264 相比无明显编码优势)、封闭的平台(限于 Windows 系统)、

e

and

All

thingsFLV1Sorenson(而且有时误为Flash视频(FLV),这是以Adobe Flash容器格

inSorenson视频3或Sorenson Spark。 Sorenson视频也被称为Sorenson视频

their

be4800-64000bits/sec之间,分辨率为176X144。MPEG-4利用很窄的带宽,通过ing互性和灵活性。MPEG-4标准主要应用于视像电话(Video Phone),视像电子邮

arMPEG4于1998 年11 月公布,原预计1999 年1月投入使用的国际标准e

gooMPEG-2 编码标准是由 MPEG(Moving Picture Experts Group)工作组发布的视频与音频压缩国际标准。MPEG-2 编码于 1994 年发布,常用于广播信号(卫星电视、有线电视)的视频和音频编码,经过后期不断修改,不仅成为

DVD 的核心技术,还应用于 HDTV 高清电视传输。d

for

som

后发的劣势(2006 年通过成为国际标准)仍然给微软 VC-1 编码的应用前景带来了较大的不确定性。8)JPEG编码格式写。JPEG的压缩方式通常是破坏性资料压缩(lossy compression),意即在Progressive JPEG是采用无失真的压缩方式,但Progressive JPEG并没有受RealVideo格式文件包括后缀名为RA、RM、RAM、RMVB的四种视频格式。

Real Video是一种高压缩比的视频格式,可以使用任何一种常用于多媒体及Web上制作视频的方法来创建RealVideo文件。例如Premiere、 VideoShop以及AfterEffects等,对于文件的播放可用realplayer和暴风影音播放。们通常所说的DVDrip格式,它采用了MPEG4的压缩算法同时又综合了MPEG-4行高质量压缩,同时用MP3或AC3对音频进行压缩,然后再将视频与音频合成并加上相应的外挂字幕文件而形成的视频格式。其画质直逼DVD并且体积只有说是一种对DVD造成威胁最大的新生视频压缩格式,号称DVD杀手或DVD终结者。11)Lite™ 3的一些标准,数以百计的网络门户,用户自己制作的内容,以及社交

2.2视频的封装格式  封装格式其实是一个“容器”,它不同于编码格式,封装就相当于捆绑打包,将已经编码好的视频文件和音轨文件打包在一起,并按照一定规则建立排序和索引,便于播放器或播放软件来索引播放。常见的封装格式有

网络普遍采用基于Flash的VP6格式。On2 TrueMotion VP6是主要的移动视频标准,他采用了Adobe Flash

On2 TrueMotion VP6编码格式

DVD的数分之一。这种编码对机器的要求也不高,所以DivX视频编码技术可以

与MP3各方面的技术,说白了就是使用DivX压缩技术对DVD盘片的视频图像进

DivX格式,这是由MPEG-4衍生出的另一种视频编码(压缩)标准,也即我10)DivX编码格式

9)RV编码格式

到广泛的支援。压缩过程中图像的品质会遭受到可见的破坏,有一种以JPEG为基础的标准

JPEG 是Joint Photographic Experts Group(联合图像专家小组))的缩

MKV、AVI、MOV、TS、PS 等等,高清媒体文件的后缀名(扩展文件名)一般都是媒体的封装格式。  视频文件的解码过程如下依次需要用到的组件有“分离器”、“解码器”、“渲染器”,它们统称为“滤镜”。3.1分离器(Splitter)  要正确地播放多媒体文件,播放器首先要正确地调用分离器,把视频流和(或)音频流正确地分离出来,然后交给解码器进行解码,这就是分离器的使命。上文中说到有不少的封装格式,每一种封装格式都必须有相对应一种分离器,才能正确的把视频和音频分离出来以供解码器解码。常用的分离器有:Gabest MPEG Splitter(Media Player Classic 作者编写的分离器)、

KMP Splitter(KMPlayer 原配的分离器)

All

thin3视频的播放组件及调用流程gs  (1)MOV 格式:MOV 多见于 Apple QuickTime 网站上的电影预告片。MOV

类似于 RMVB,过于封闭自守,民间制作组没有人会用这个不方便的形式。  (2)AVI 格式:AVI 封装是微软在上世纪 90 年代初创立的封装标准,是当时为对抗 QuickTime 的 MOV 格式而推出的,因为当时还没有流式播放需要,AVI 的将索引布置在打包文件的尾部,这就使得AVI封装不能做到流式播放(流媒体)。AVI 封装只能支持有限的几种视频音频编码形式,且AVI不能支持音频的 VBR 动态比特率编码。  (3)TS 格式:TS(Transport Stream)是一种比较先进的封装形式,蓝光原盘中,就采用了 TS 封装。TS 封装支持几乎所有编码的高清视频和音轨文件。PS(Program Stream)封装的技术基本和 TS 相同,但 PS 封装和 AVI 一样,都不是流媒体,不能够支持流式播放,PS 封装使用在原先的 HDDVD 中。在高清标准下,MPEG-2 编码的视频文件主要采用 TS 封装格式。  (4)MKV 格式:MKV(Matroska)是一种新兴的多媒体封装格式,可以将各类视频编码、16 条或以上不同格式的音频和语言不同的字幕封装在一个文件内,它具有开放源代码、音视频编码丰富、网络亲和性好等优势,已经得到众多视频压制组和玩家的支持,正逐渐成为高清视频的主流视频格式。H264 编码与 X264 编码目前大多采用 MKV 封装格式。

in

their

being

are

good

for

3.3渲染器(Renderer)  渲染器与解码器一样,分为视频渲染器和音频渲染器,解码后的视频数据经过视频渲染器的渲染后呈现到显示设备上,解码后的音频经过音频渲染器的渲染后从声卡输出。渲染在视频播放的过程中是很重要的,因为它会影响到视频最终的效果,不同的渲染器有不同的技术特性,对电脑的配置(主要是 CPU

和显卡)的要求也不一样。视频渲染器主要有以下几种:1)旧式视频渲染器(Video Renderer):

  解码器在整个视频的播放中占据了最主要的位置,它的作用是对由分离器分离出来的音频流和视频流分别进行解码。解码器又分为视频解码器和音频解码器。常见的视频解码器有: 1)MPEG-2 视频解码器InterVideo Video Decoder(WinDVD 的解码器)CyberLink DTV Video/SP Filter

CyberLink Video/SP Filter(PowerDVD 的解码器)Moonlight-Elecard MPEG2 Video DecodernVIDIA Video Decoder(nVIDIA PureVideo 的解码器)Sonic CinemasterVideo、Gabest Video Decoder

2)H264/X264/AVC 视频解码器CyberLink H.264/AVC Decoder(PowerDVD 的解码器)、CoreAVC DirectShow Video DecoderMoonlight H264 Video Decoderffdshow MPEG-4 Video Decoder

3)VC-1 视频解码器CyberLink VC-1 Deocder(PowerDVD 的解码器)、Media Player Classic

Video Decoder、WMVideo Decoder DMO(微软的解码器)等等。常见的音频解码器有:CyberLink Audio Decoder(PowerDVD 的解码器)AC3 FilterInterVideo Audio DecodernVIDIA Audio Decoder

3.2解码器(Decoder)

Haili Media Splitter

这三种分离器能够支持较多的封装格式,其它的分离器还有Moonlight-Elecard MPEG2 Demultiplexer(月光分离器)、

nVIDIA Transport Demux(nVIDIA 公司的分离器,配合 PureVideo

使用)、CyberLink Demux(PowerDVD 软件中的分离器)

二、RGB和YUV视频存储格式1 RGB视频存储格式1.1 RGB概述

1.2常见的RGB格式RGB的GUID (globally unique identifier全球唯一标识符)格式描述描述如下表

计算机彩色显示器显示色彩的原理与彩色电视机一样,都是采用R(Red)、G(Green)、B(Blue)相加混色的原理:通过发射出三种不同强度的电子束,使屏幕内侧覆盖的红、绿、蓝磷光材料发光而产生色彩。这种色彩的表示方法称为RGB色彩空间表示。根据三基色原理,任意一种色光F都可以用不同分量的R、G、B三色相加混合而成。F = r [ R ] + g [ G ] + b [ B ]其中,r、g、b分别为三基色参与混合的系数。当三基色分量都为0(最弱)时混合为黑色光;而当三基色分量都为k(最强)时混合为白色光。调整r、g、b三个系数的值,可以混合出介于黑色光和白色光之间的各种各样的色光。

视频数据,图像数据在存储中的存储格式主要有RGB和YUV。RGB是多媒体数据进行数据存储采用的主流格式;YUV格式所需存储空间一般是RGB格式存储空间的一半,所以YUV格式主要用于多媒体数据传输中。

这种是最原始的渲染器,它接收到来自解码器解码后的数据流,在显示设备上显示。这种渲染器基本上不能调用到显卡硬件特性,全靠 CPU 来完成渲染任务。2)覆盖合成器(Overlay Mixer):覆盖合成器能够将若干路视频流合并输出到显示设备上,并且它能够很好地调用显卡硬件的拉伸,颜色空间变换等硬件功能,以减少对 CPU 资源的占用率。视频覆盖的画面质量事实上取决于显卡硬件。通常在使用覆盖合成器的时候无法直接对正在播放的视频截图。3)VMR 渲染器(Video Mixing Renderer):VMR 对覆盖合成器进行了改进,它是基于 DirectX 的视频渲染器,能够支持 16 路的视频流混合。VMR 根据 DirectX 版本的不同,可以分为 VMR7 和

VMR9,其中 VMR7 基于 DirectDraw7(2D),而 VMR9 基于 Direct3D9(3D),VMR9 可以支持视频特效(Video Effects)和视频变换(Video Transitions)。VMR 根据渲染模式的不同又分为“窗口化”(Windowed)、“无窗口”(Windowless)、“未渲染”(Renderless)模式。4)EVR 增强型视频渲染器(Enhanced Video Renderer)微软在 Windows Vista 系统就开始引入的新视频渲染器,当然也包含在新的操作系统 Windows 7 中。它与 VMR 最大的区别就是能够支持 DXVA 2.0。

所示:表2.1 RGB的GUID描述

RGB1、RGB4、RGB8都是调色板类型的RGB格式,在描述这些媒体类型的格式细节时,通常会在BITMAPINFOHEADER数据结构后面跟着一个调色板(定义一系列颜色)。它们的图像数据并不是真正的颜色值,而是当前像素颜色值在调色板中的索引。1)RGB1以RGB1(2色位图)为例,比如它的调色板中定义的两种颜色值依次为0x000000(黑色)和0xFFFFFF(白色),那么图像数据…(每个像素用1位表示)表示对应各像素的颜色为:黑黑白白黑白黑白黑白白白…2)RGB565RGB565使用16位表示一个像素,这16位中的5位用于R,6位用于G,5位用于B。程序中通常使用一个字(WORD,一个字等于两个字节)来操作一个像素。当读出一个像素后,这个字的各个位意义如下:高字节低字节R R R R R G G G G G G B B B B B可以组合使用屏蔽字和移位操作来得到RGB各分量的值:#define RGB565_MASK_RED 0xF800#define RGB565_MASK_GREEN 0x07E0#define RGB565_MASK_BLUE 0x001FR = (wPixel & RGB565_MASK_RED) >> 11; // 取值范围0-31G = (wPixel & RGB565_MASK_GREEN) >> 5; // 取值范围0-63B = wPixel & RGB565_MASK_BLUE; // 取值范围0-313)RGB555RGB555是另一种16位的RGB格式,RGB分量都用5位表示(剩下的1位

1.3各种RGB格式介绍

每个像素用16位表示,RGB分量分别使用5位、6位、5位MEDIASUBTYPE_RGB555每个像素用16位表示,RGB分量都使用5位(剩下的1位不用)MEDIASUBTYPE_RGB24每个像素用24位表示,RGB分量各使用8位MEDIASUBTYPE_RGB32每个像素用32位表示,RGB分量各使用8位(剩下的8位不用)MEDIASUBTYPE_ARGB32每个像素用32位表示,RGB分量各使用8位(剩下的8位用于表示Alpha通道值)

RGB的GUID描述符MEDIASUBTYPE_RGB1 2MEDIASUBTYPE_RGB4

16MEDIASUBTYPE_RGB8

256MEDIASUBTYPE_RGB565每个像素用8位表示,需要调色板

描述符说明每个像素用1位表示,需要调色板每个像素用4位表示,需要调色板

2 YUV视频存储格式2.1 YUV概述

在现代彩色电视系统中,通常采用三管彩色摄像机或彩色CCD摄像机进行摄像,然后把摄得的彩色图像信号经分色、分别放大校正后得到 RGB,再经过矩阵变换电路得到亮度信号Y和两个色差信号R-Y(即U)、B-Y(即V),最后发送端将亮度和色差三个信号分别进行编码,用同一信道发送出去。这种色彩的表示方法就是所谓的YUV色彩空间表示。采用YUV色彩空间的重要性是它的亮度信号Y和色度信号U、V是分离的。如果只有Y信号分量而没有U、V分量,那么这样表示的图像就是黑白灰度图像。彩色电视采用YUV空间正是为了用亮度信号Y解决彩色电视机与黑白电视

不用)。使用一个字读出一个像素后,这个字的各个位意义如下:高字节低字节X R R R R G G G G G B B B B B (X表示不用,可以忽略)可以组合使用屏蔽字和移位操作来得到RGB各分量的值:#define RGB555_MASK_RED 0x7C00#define RGB555_MASK_GREEN 0x03E0#define RGB555_MASK_BLUE 0x001FR = (wPixel & RGB555_MASK_RED) >> 10; // 取值范围0-31G = (wPixel & RGB555_MASK_GREEN) >> 5; // 取值范围0-31B = wPixel & RGB555_MASK_BLUE; // 取值范围0-314)RGB24RGB24使用24位来表示一个像素,RGB分量都用8位表示,取值范围为0-255。注意在内存中RGB各分量的排列顺序为:BGR BGR BGR…。通常可以使用RGBTRIPLE数据结构来操作一个像素,它的定义为:typedef struct tagRGBTRIPLE {

BYTE rgbtBlue; // 蓝色分量BYTE rgbtGreen; // 绿色分量BYTE rgbtRed; // 红色分量} RGBTRIPLE;5)RGB32RGB32使用32位来表示一个像素,RGB分量各用去8位,剩下的8位用作Alpha通道或者不用。(ARGB32就是带Alpha通道的 RGB32。)注意在内存中RGB各分量的排列顺序为:BGRA BGRA BGRA…。通常可以使用RGBQUAD数据结构来操作一个像素,它的定义为:typedef struct tagRGBQUAD {BYTE rgbBlue; // 蓝色分量BYTE rgbGreen; // 绿色分量BYTE rgbRed; // 红色分量BYTE rgbReserved; // 保留字节(用作Alpha通道或忽略)} RGBQUAD;

表2.2 YUV的GUID描述2.3 YUV主要采样格式  主要的采样格式有YCbCr 4:2:0、YCbCr 4:2:2、YCbCr 4:1:1和 YCbCr 4:4:4。其中YCbCr 4:1:1 比较常用,其含义为:每个点保存一个 8bit 的亮度值(也就是Y值),每 2x2 个点保存一个 Cr 和Cb 值, 图像在肉眼中的感觉不会起太大的变化。所以,原来用 RGB(R,G,B 都是 8bit unsigned) 模型, 1个点需要

8x3=24 bits,若4:4:4按采样后,YUV仍各占8bit。按4:1:1采样后,而现在一个点平均仅需要 8+(8/4)+(8/4)=12bits。这样就把图像的数据压缩了一半。YUV 的优点之一是,色度频道的采样率可比 Y 频道低,同时不会明显降低视觉质量。有一种表示法可用来描述 U 和 V 与 Y 的采样频率比例,这个表示法称为 A:B:C 表示法:

YUV的GUID描述符MEDIASUBTYPE_YUY2 YUY2MEDIASUBTYPE_YUYV YUYVMEDIASUBTYPE_YVYU YVYUMEDIASUBTYPE_UYVY UYVYMEDIASUBTYPE_AYUV AYUVMEDIASUBTYPE_Y41P Y41PMEDIASUBTYPE_Y411 Y411MEDIASUBTYPE_Y211 Y211MEDIASUBTYPE_IF09 IF09格式MEDIASUBTYPE_IYUV IYUV格式MEDIASUBTYPE_YV12 YV12格式MEDIASUBTYPE_YVU9 YVU9格式

描述符说明以4:2:2方式打包实际格式与YUY2相同以4:2:2方式打包以4:2:2方式打包Alpha通道的4:4:4 YUV格式以4:1:1方式打包实际格式与Y41P相同

在DirectShow 中,常见的YUV格式有

YUY2、YUYV、YVYU、UYVY、AYUV、Y41P、Y411、Y211、IF09、IYUV、YV12、YVU9、YUV411、 YUV420等。作为视频媒体类型的辅助说明类型(Subtype),它们对应的GUID(Globally Unique Identifier)如下表所示。

2.2常见YUV的格式

机的兼容问题,使黑白电视机也能接收彩色电视信号。本文讲述的格式全部使用每个像素位置 8 位的方式来编码 Y 频道(也称为灯光频道),并使用每样例 8 位的方式来编码每个 U 或 V 色度样例。但是,大多数 YUV 格式平均使用的每像素位数都少于 24 位,这是因为它们包含的

U 和 V 样例比 Y 样例要少。注在本文中,U 一词相当于 Cb,V 一词相当于 Cr。



3)YUV 4:2:0 采样4:2:0 采样有两种常见的变化形式。其中一种形式用于 MPEG-2 视频,另一种形式用于 MPEG-1 以及 ITU-T recommendations H.261 和 H.263。图2.3

显示了 MPEG-1 方案中使用的采样网格,图2.4显示了 MPEG-2 方案中使用的采样网格。

图 2. 2 YUV 4:2:2 样例位置

in2)YUV 4:2:2 采样4:2:2 采样的这种主要形式在 ITU-R Recommendation BT.601 中进行了定义。图2.1显示了此标准定义的采样网格。

th图2.1 YUV 4:4:4 样例位置eir

being

a

1)YUV 4:4:4 采样下图显示了 4:4:4 图片中使用的采样网格。灯光样例用叉来表示,色度样例则用圈表示。2.3.1 YUV采样格式图示

4:4:4:表示色度频道没有下采样。4:2:2:表示 2:1 的水平下采样,没有垂直下采样。对于每两个 U 样例或 V 样例,每个扫描行都包含四个 Y 样例。4:2:0:表示 2:1 的水平下采样,2:1 的垂直下采样。4:1:1:表示 4:1 的水平下采样,没有垂直下采样。对于每个 U 样例或

V 样例,每个扫描行都包含四个 Y 样例。

图2.3 YUV 4:2:0 样例位置(MPEG-1 方案)图2.4 YUV 4:2:0 样例位置(MPEG-2 方案)2.3.2YUV存储方式

本文讲述推荐用于视频呈现的 8 位 YUV 格式。这些格式可以分为几个类别:4:4:4 格式,每像素 32 位4:2:2 格式,每像素 16 位4:2:0 格式,每像素 16 位4:2:0 格式,每像素 12 位首先,理解下列概念,这样才能理解接下来的内容:表面原点:对于本文讲述的 YUV 格式,原点 (0,0) 总是位于表面的左上角。跨距:表面的跨距,有时也称为间距,指的是表面的宽度,以字节数表示。对于一个表面原点位于左上角的表面来说,跨距总是正数。对齐:表面的对齐是根据图形显示驱动程序的不同而定的。表面始终应该 DWORD 对齐,就是说,表面中的各个行肯定都是从 32 位 (DWORD)

边界开始的。对齐可以大于 32 位,但具体取决于硬件的需求。打包格式与平面格式:YUV 格式可以分为打包格式和平面格式。在打包格式中,Y、U 和 V 组件存储在一个数组中。像素被组织到了一些巨像素组中,巨像素组的布局取决于格式。在平面格式中,Y、U 和 V 组件作为三个单独的平面进行存储。

in

th与 MPEG-1 方案相比,在 MPEG-2 方案与为 4:2:2 和 4:4:4 格式定义的采样网格之间进行转换更简单一些。因此,在 Windows 中首选 MPEG-2 方案,应该考虑将其作为 4:2:0 格式的默认转换方案。eir

being

are

good

for

so

1)4:4:4 格式,每像素 32 位推荐一个 4:4:4 格式,FOURCC 码为 AYUV。这是一个打包格式,其中每个像素都被编码为四个连续字节,其组织顺序如下所示。图2.5 AYUV 内存布局图2.6 YUY2 内存布局

如果该图像被看作由两个 little-endian WORD值组成的数组,则第一个WORD在最低有效位 (LSB) 中包含 Y0,在最高有效位 (MSB) 中包含 U。第二个WORD在 LSB 中包含 Y1,在 MSB 中包含 V。YUY2 是用于 Microsoft DirectX® Video Acceleration (DirectX VA) 的首选

4:2:2 像素格式。预期它会成为支持 4:2:2 视频的 DirectX VA 加速器的中期要求。UYVY此格式与 YUY2 相同,只是字节顺序是与之相反的 — 就是说,色度字节和灯光字节是翻转的(图 7)。如果该图像被看作由两个 little-endian WORD值组成的数组,则第一个WORD在 LSB 中包含 U,在 MSB 中包含 Y0,第二个WORD在 LSB 中包含 V,在 MSB 中包含 Y1。

All

thin

3)4:2:0 格式,每像素 16 位推荐两个 4:2:0 每像素 16 位格式,FOURCC 码如下:IMC1

IMC3

两个 FOURCC 码都是平面格式。色度频道在水平方向和垂直方向上都要以系数

gs

in图2.7 UYVY 内存布局

their

be标记了 A 的字节包含 alpha 的值。2)4:2:2 格式,每像素 16 位支持两个 4:2:2 格式,FOURCC 码如下:YUY2

UYVY

两个都是打包格式,其中每个巨像素都是编码为四个连续字节的两个像素。这样会使得色度水平下采样乘以系数 2。YUY2在 YUY2 格式中,数据可被视为一个不带正负号的char值组成的数组,其中第一个字节包含第一个 Y 样例,第二个字节包含第一个 U (Cb) 样例,第三个字节包含第二个 Y 样例,第四个字节包含第一个 V (Cr) 样例,如图2.6 所示。ing

are

good

for

图2.8 IMC1 内存布局

hin

4)4:2:0 格式,每像素 12 位推荐四个 4:2:0 每像素 12 位格式,FOURCC 码如下:IMC2

IMC4

YV12

NV12

在所有这些格式中,色度频道在水平方向和垂直方向上都要以系数 2 来进行再次采样。IMC2此格式与 IMC1 相同,只是 V (Cr) 和 U (Cb) 行在半跨距边界处进行了交错。换句话说,就是色度区域中的每个完整跨距行都以一行 V 样例开始,然后是一行在下一个半跨距边界处开始的 U 样例。此布局与 IMC1 相比,能够更加高效地利用地址空间。它的色度地址空间缩小了一半,因此整体地址空间缩

gs

in图 9. IMC3 内存布局

their

beIMC3此格式与 IMC1 相同,只是 U 和 V 平面进行了交换:ing

are

good

f2 来进行再次采样。IMC1所有 Y 样例都会作为不带正负号的char值组成的数组首先显示在内存中。后面跟着所有 V (Cr) 样例,然后是所有 U (Cb) 样例。V 和 U 平面与 Y 平面具有相同的跨距,从而生成如图2.8 所示的内存的未使用区域。

小了 25%。在各个 4:2:0 格式中,IMC2 是第二首选格式,排在 NV12 之后。图2.10 IMC2 内存布局图2.11 IMC4 内存布局

hin

NV12所有 Y 样例都会作为由不带正负号的char值组成的数组首先显示在内存中,并且行数为偶数。Y 平面后面紧接着一个由不带正负号的char值组成的数组,其中包含了打包的 U (Cb) 和 V (Cr) 样例,如图2.13 所示。当组合的 U-V 数gsYV12所有 Y 样例都会作为不带正负号的char值组成的数组首先显示在内存中。此数组后面紧接着所有 V (Cr) 样例。V 平面的跨距为 Y 平面跨距的一半,V

平面包含的行为 Y 平面包含行的一半。V 平面后面紧接着所有 U (Cb) 样例,它的跨距和行数与 V 平面相同(图 12)。

in图2.12 YV12 内存布局

their

being

arIMC4此格式与 IMC2 相同,只是 U (Cb) 和 V (Cr) 行进行了交换:e

good

for

so

组被视为一个由 little-endian WORD值组成的数组时,LSB 包含 U 值,MSB

包含 V 值。NV12 是用于 DirectX VA 的首选 4:2:0 像素格式。预期它会成为支持 4:2:0 视频的 DirectX VA 加速器的中期要求。3 YCbCr视频存储格式4 YUV与YCbCr的对比4.1两者与rgb之间换算公式的差异yuv<-->rgbY'= 0.299*R' + 0.587*G' + 0.114*B'U'= -0.147*R' - 0.289*G' + 0.436*B' = 0.492*(B'- Y')V'= 0.615*R' - 0.515*G' - 0.100*B' = 0.877*(R'- Y')R' = Y' + 1.140*V'G' = Y' - 0.394*U' - 0.581*V'B' = Y' + 2.032*U'yCbCr<-->rgbY’ = 0.257*R' + 0.504*G' + 0.098*B' + 16Cb' = -0.148*R' - 0.291*G' + 0.439*B' + 128Cr' = 0.439*R' - 0.368*G' - 0.071*B' + 128

hingsYCbCr其中Y是指亮度分量,Cb指蓝色色度分量,而Cr指红色色度分量。人的肉眼对视频的Y分量更敏感,因此在通过对色度分量进行子采样来减少色度分量后,肉眼将察觉不到的图像质量的变化。主要的子采样格式有 YCbCr 4:2:0、YCbCr 4:2:2 和 YCbCr

4:4:4。  4:2:0表示每4个像素有4个亮度分量,2个色度分量 (YYYYCbCr),仅采样奇数扫描线,是便携式视频设备(MPEG-4)以及电视会议(H.263)最常用格式。4:2:2表示每4个像素有4个亮度分量,4个色度分量(YYYYCbCrCbCr),是DVD、数字电视、HDTV 以及其它消费类视频设备的最常用格式。4:4:4表示全像素点阵(YYYYCbCrCbCrCbCrCbCr),用于高质量视频应用、演播室以及专业视频产品。

in

their

being

ar图2.13 NV12 内存布局e

good

for

R' = 1.164*(Y’-16) + 1.596*(Cr'-128)4.2两者来源上的差异5颜色空间和色度采样率转换

我们首先讲述 RGB 和 4:4:4 YUV 之间的转换。要将 4:2:0 或 4:2:2 YUV 转换为 RGB,我们建议首先将 YUV 数据转换为 4:4:4 YUV,然后再将 4:4:4 YUV

转换为 RGB。AYUV 格式是一个 4:4:4 格式,它对于每个 Y、U 和 V 样例都使用 8 位。对于某些应用,还可以使用每样例多于8位的位数定义YUV。对于数字视频,定义了从 RGB 到两个主要 YUV 的转换。这两个转换都基于称为 ITU-R Recommendation BT.709 的规范。第一个转换是 BT.709 中定义用于 50-Hz 的较早的YUV格式。它与在 ITU-R Recommendation BT.601 中指定的关系相同, ITU-R Recommendation BT.601 也被称为它的旧名称 CCIR 601。这种格式应该被视为用于标准定义 TV 分辨率 (720 x 576) 和更低分辨率视频的首选 YUV 格式。它的特征由下面两个常量 Kr 和 Kb 的值来定义:

5.1 RGB 和YUV之间的转换

本节提供了在 YUV 和 RGB 之间进行转换的指南,以及在某些不同 YUV

格式之间进行转换的指南。在本节中,我们会以两个 RGB 编码方案为例:8

位计算机 RGB 和 studio 视频 RGB,前者也称为 sRGB 或“全范围”RGB,后者也称为“带有头空间和脚空间的RGB”。这两个方案的定义如下:计算机 RGB 对于每个红色、绿色和蓝色样例都使用8位。黑色表示为

R = G = B = 0,白色则表示为 R = G = B = 255。Studio 视频 RGB 对于每个红色、绿色和蓝色样例使用一定的位数,即N 位,其中 N 为 8 或更大的数字。Studio 视频 RGB 使用的缩放系数与计算机 RGB 使用的缩放系数不同,它具有一个偏移量。黑色表示为

R = G = B = 16*2N-8,白色则表示为 R = G = B = 235*2N-8。但是,实际的值可能不在此范围之内。Studio 视频 RGB 是 Windows 中视频的首选 RGB 定义,而计算机 RGB

则是非视频应用的首选 RGB 定义。在这两种形式的 RGB 中,色度座标都与在

RGB 原色定义的 ITU-R BT.709 中指定的一样。R、G 和 B 的 (x,y) 座标分别为

(0.64, 0.33)、(0.30, 0.60) 和 (0.15, 0.06)。基准白色为 D65,座标为 (0.3127,

0.3290)。标称灰度系数为 1/0.45(大约为 2.2),精确的灰度系数在 ITU-R

BT.709 中进行了详细定义。

YUV色彩模型来源于RGB模型。该模型的特点是将亮度和色度分离开,从而适合于图像处理领域。颜色模型用于模拟彩色电视广播。YCbCr模型来源于YUV模型。YCbCr是一个的YUV色彩空间缩放和偏移的版本应用:数字视频,ITU-R BT.601T推荐标准。

Kr = 0.299Kb = 0.114第二个转换为 BT.709 中定义用于 60-Hz 的较新 YUV 格式,应该被视为用于高于SDTV 的视频分辨率的首选格式。它的特征由下面两个不同的常量值来定义:Kr = 0.2126Kb = 0.0722从 RGB 到 YUV 转换的定义以下列内容开始:L = Kr * R + Kb * B + (1 – Kr – Kb) * G然后,按照下列方式获得 YUV 值:Y =floor(2^(M-8) * (219*(L–Z)/S + 16) + 0.5)U = clip3(0, 2^M-1, floor(2^(M-8) * (112*(B-L) / ((1-Kb)*S) + 128) + 0.5))V = clip3(0, 2^M-1, floor(2^(M-8) * (112*(R-L) / ((1-Kr)*S) + 128) + 0.5))其中M 为每个 YUV 样例的位数 (M >= 8)。Z 为黑电平变量。对于计算机 RGB,Z 等于 0。对于 studio 视频

RGB,Z 等于 16*2N-8,其中 N 为每个 RGB 样例的位数 (N >= 8)。S 为缩放变量。对于计算机 RGB,S 等于 255。对于 studio 视频

RGB,S 等于 219*2N-8。函数 floor(x) 返回大于或等于 x 的最大整数。函数 clip3(x, y, z) 的定义如下所示:clip3(x, y, z) = ((z < x) ? x : ((z > y) ? y : z))Y 样例表示亮度,U 和 V 样例分别表示偏向蓝色和红色的颜色偏差。Y 的标称范围为 16*2M-8到 235*2M-8。黑色表示为 16*2M-8,白色表示为 235*2M-8。U 和 V 的标称范围为 16*2M-8到 240*2M-8,值 128*2M-8表示中性色度。但是,实际的值可能不在这些范围之内。对于 studio 视频 RGB 形式的输入数据,要使得 U 和 V 值保持在 0 到

2M-1 范围之内,必需进行剪辑操作。如果输入为计算机 RGB,则不需要剪辑操作,这是因为转换公式不会生成超出此范围的值。这些都是精确的公式,没有近似值。本文后面的所有内容均派生自这些公式。示例:将 RGB888 转换为 YUV 4:4:4

示例:将 8 位 YUV 转换为 RGB888

将 4:2:0 YUV 转换为 4:2:2 YUV

将 4:2:2 YUV 转换为 4:4:4 YUV

将 4:2:0 YUV 转换为 4:4:4 YUV

示例:将RGB888 转换为 YUV 4:4:4

在输入为计算机 RGB,输出为 8 位 BT.601 YUV 的情况下,我们相信前面一节中给出的公式可以按照下列公式进行合理近似计算:Y = ( ( 66 * R + 129 * G + 25 * B + 128) >> 8) + 16U = ( ( -38 * R - 74 * G + 112 * B + 128) >> 8) + 128V = ( ( 112 * R - 94 * G - 18 * B + 128) >> 8) + 128这些公式使用精确度不大于 8 位(不带正负号)的系数计算出 8 位结果。中间结果需要最多 16 位的精确度。

5.2 YUV空间内的转换

1)将4:2:0 YUV 转换为 4:2:2 YUV将 4:2:0 YUV 转换为 4:2:2 YUV 需要系数为 2 的垂直上转换。本节讲述了一个执行上转换的方法示例。该方法假设视频图片为逐行扫描。注 4:2:0 到 4:2:2 隔行扫描转换过程会出现不常见的问题,难以实现。本文不会对转换从 4:2:0 到 4:2:2 的隔行扫描时出现的问题进行解决。让输入色度样例的每个垂直行都成为一个数组 Cin[],其范围为从 0 到 N - 1。输出图像上相应的垂直行则会成为数组 Cout[],其范围为从 0 到 2N - 1。要转换每个垂直行,请执行下列过程:Cout[0]= Cin[0];Cout[1]= clip((9 * (Cin[0] + Cin[1]) – (Cin[0] + Cin[2]) + 8) >> 4);Cout[2]= Cin[1];Cout[3]= clip((9 * (Cin[1] + Cin[2]) - (Cin[0] + Cin[3]) + 8) >> 4);Cout[4]= Cin[2]Cout[5]= clip((9 * (Cin[2] + Cin[3]) - (Cin[1] + Cin[4]) + 8) >> 4);...Cout[2*i]= Cin[i]Cout[2*i+1] = clip((9 * (Cin[i] + Cin[i+1]) - (Cin[i-1] + Cin[i+2]) + 8) >> 4);...Cout[2*N-3] = clip((9 * (Cin[N-2] + Cin[N-1]) - (Cin[N-3] + Cin[N-1]) + 8) >> 4);Cout[2*N-2] = Cin[N-1];

示例:将8 位 YUV 转换为 RGB888从原始的 RGB 到 YUV 公式,您可以为 YUV 的 8 位 BT.601 定义派生出下列关系:Y = round( 0.256788 * R + 0.504129 * G + 0.097906 * B) + 16

U = round(-0.148223 * R - 0.290993 * G + 0.439216 * B) + 128V = round( 0.439216 * R - 0.367788 * G - 0.071427 * B) + 128因此,假设:C = Y - 16D = U - 128E = V - 128将 YUV 转换为计算机 RGB 的公式可以按照下列方式进行派生:R = clip( round( 1.164383 * C + 1.596027 * E ) )G = clip( round( 1.164383 * C - (0.391762 * D) - (0.812968 * E) ) )B = clip( round( 1.164383 * C + 2.017232 * D ) )其中 clip() 表示剪辑为范围 [0..255]。这些公式可以由下列公式进行合理近似计算:R = clip(( 298 * C + 409 * E + 128) >> 8)G = clip(( 298 * C - 100 * D - 208 * E + 128) >> 8)B = clip(( 298 * C + 516 * D + 128) >> 8)这些公式使用精确度必需大于 8 位的一些系数计算出每个 8 位结果,中间结果需要多于 16 位的精确度。

图2.14. 4:2:0 到 4:2:2 上采样对于信号处理过程,理想情况下,垂直上转换应该包括一个相移补偿,以将 4:2:0 样例行位置和每隔一个 4:2:2 样例行位置之间的半像素垂直偏移量(与输出 4:2:2 采样网格相比较)考虑在内。但是,引入此偏移量会提高生成样例所需的处理量,并且会导致无法从上采样 4:2:2 图像重新构造原始的

4:2:0 样例。引入此偏移量还会导致无法将视频直接解码到 4:2:2 表面,也就无法将这些表面用作解码流中后续图片的参考图片。因此,此处提供的这种方

things

in

their

being

are

goCout[2*N-1] = clip((9 * (Cin[N-1] + Cin[N-1]) - (Cin[N-2] + Cin[N-1]) + 8) >> 4);其中 clip() 表示剪辑范围为 [0..255]。注用于处理边缘的等式在计算上可以进行简化。这些等式以这种形式显示,是为了说明图片边缘的附着效果。实际上,这种方法会通过在四个相邻像素上插入曲线,并趋向两个最近的像素值进行加权,来计算每个缺少的值(图2.14)。此示例中使用的这个特定插入方法使用一个众所周知的方法来计算半整数位置缺少的样例,这个方法称为

Catmull-Rom 插入,也称为立方回旋插入。

法不会考虑样例的精确垂直对齐。这样做在合理的高图片分辨率下可能不会影响视觉效果。如果您首先从一个 4:2:0 视频开始,并且该视频使用在 H.261、H.263 和

MPEG-1 视频中定义的采样网格,输出 4:2:2 色度样例的相也会相对于灯光采样网格间隔而产生半个像素的水平偏移量(相对于 4:2:2 色度采样网格间隔则为四分之一像素偏移量)。但是,4:2:0 视频的 MPEG-2 形式在 PC 上可能更经常使用,不会出现上述问题。而且,这种偏差在合理的高图片分辨率下可能不会影响视觉效果。尝试更正此问题会产生与垂直相偏移相同种类的问题。2)将4:2:2 YUV 转换为 4:4:4 YUV将 4:2:2 YUV 转换为 4:4:4 YUV 需要系数为 2 的水平上转换。前面讲述的用于垂直上转换的方法也适用于水平上转换。对于 MPEG-2 和 ITU-R BT.601 视频,此方法会生成带有正确相对齐的样例。3)将4:2:0 YUV 转换为 4:4:4 YUV要将 4:2:0 YUV 转换为 4:4:4 YUV,按照前面讲述的两个方法进行操作即可。首先将 4:2:0 图像转换为 4:2:2,然后将 4:2:2 图像转换为 4:4:4。您还可以切换两个上转换过程的顺序,因为操作顺序对于结果的视觉质量不会产生真正的影响。