最新消息: USBMI致力于为网友们分享Windows、安卓、IOS等主流手机系统相关的资讯以及评测、同时提供相关教程、应用、软件下载等服务。

常见视频编码格式与RGB、YUV视频存储格式

IT圈 admin 36浏览 0评论

2024年9月10日发(作者:钦新荣)

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常见编码格式logo

2)H.263编码格式

于1990年定义完成。1992年底,MPEG-1正式被批准成为国际标准。MPEG-1是

为CD光碟介质定制的的视频和音频压缩格式。一张70分钟的CD光碟传输速率

大约在1.4Mbps。而MPEG-1采用了块方式的运动补偿、离散馀弦变换(DCT)、

量化等技术,并为1.2Mbps传输速率进行了优化。MPEG-1随后被Video CD采

e

a

3)MPEG-1 编码格式

MPEG-1是MPEG组织制定的第一个视频和音频有损压缩标准。视频压缩算法

n

d

H.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

A

l

l

t

h

i

n

g

s

i

n

t

h

e

i

r

b

e

绝大多数视听玩家对于 H264 编码都不会感到陌生,H264 编码的身世显赫,

是 ITU-T(国际电信联盟视频编码专家组)与 ISO/IEC(国际标准化组织动态

图像专家组)合作组成的 JVT(联合视频组)推动的新一代数字视频编码标准,

也称为 MPEG-4/AVC 编码。H264 编码依托雄厚的背景,在技术上独树一帜,大

幅领先于其它编码算法。

X264 编码,是 H264 编码的一个开源分支,它符合 H264 标准,其功能在

于编码,而不作为解码器使用,X264 编码最大的特点在于注重实用,它在不明

显降低编码性能的前提下,努力降低编码的计算复杂度,X264 对于 H264 编码

中的一些复杂编码特性做了折衷处理,其压缩视频体积小于XVID(MPEG-4)编

码视频,以小体积、高画质的特点得到了广泛认可。

i

n

g

a

r

e

g

o

o

1)H264/X264/AVC 编码格式

d

f

o

r

s

o

用作为核心技术。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

a

n

d

A

l

l

t

h

i

n

g

s

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

i

n

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

t

h

e

i

r

b

e

4800-64000bits/sec之间,分辨率为176X144。MPEG-4利用很窄的带宽,通过

i

n

g

互性和灵活性。MPEG-4标准主要应用于视像电话(Video Phone),视像电子邮

a

r

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

e

g

o

o

MPEG-2 编码标准是由 MPEG(Moving Picture Experts Group)工作组发

布的视频与音频压缩国际标准。MPEG-2 编码于 1994 年发布,常用于广播信号

(卫星电视、有线电视)的视频和音频编码,经过后期不断修改,不仅成为

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

d

f

o

r

s

o

m

后发的劣势(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 原配的分离器)

A

l

l

t

h

i

n

3视频的播放组件及调用流程

g

s

  (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 封装格式。

i

n

t

h

e

i

r

b

e

i

n

g

a

r

e

g

o

o

d

f

o

r

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)RGB565

RGB565使用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 0x001F

R = (wPixel & RGB565_MASK_RED) >> 11; // 取值范围0-31

G = (wPixel & RGB565_MASK_GREEN) >> 5; // 取值范围0-63

B = wPixel & RGB565_MASK_BLUE; // 取值范围0-31

3)RGB555

RGB555是另一种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 2

MEDIASUBTYPE_RGB4

16

MEDIASUBTYPE_RGB8

256

MEDIASUBTYPE_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 0x001F

R = (wPixel & RGB555_MASK_RED) >> 10; // 取值范围0-31

G = (wPixel & RGB555_MASK_GREEN) >> 5; // 取值范围0-31

B = wPixel & RGB555_MASK_BLUE; // 取值范围0-31

4)RGB24

RGB24使用24位来表示一个像素,RGB分量都用8位表示,取值范围为0-

255。注意在内存中RGB各分量的排列顺序为:BGR BGR BGR…。通常可以使用

RGBTRIPLE数据结构来操作一个像素,它的定义为:

typedef struct tagRGBTRIPLE {

BYTE rgbtBlue; // 蓝色分量

BYTE rgbtGreen; // 绿色分量

BYTE rgbtRed; // 红色分量

} RGBTRIPLE;

5)RGB32

RGB32使用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 YUY2

MEDIASUBTYPE_YUYV YUYV

MEDIASUBTYPE_YVYU YVYU

MEDIASUBTYPE_UYVY UYVY

MEDIASUBTYPE_AYUV AYUV

MEDIASUBTYPE_Y41P Y41P

MEDIASUBTYPE_Y411 Y411

MEDIASUBTYPE_Y211 Y211

MEDIASUBTYPE_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、Y

VU9、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 样例位置

i

n

2)YUV 4:2:2 采样

4:2:2 采样的这种主要形式在 ITU-R Recommendation BT.601 中进行了定义。

图2.1显示了此标准定义的采样网格。

t

h

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

e

i

r

b

e

i

n

g

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 组件

作为三个单独的平面进行存储。

i

n

t

h

与 MPEG-1 方案相比,在 MPEG-2 方案与为 4:2:2 和 4:4:4 格式定义的采

样网格之间进行转换更简单一些。因此,在 Windows 中首选 MPEG-2 方案,

应该考虑将其作为 4:2:0 格式的默认转换方案。

e

i

r

b

e

i

n

g

a

r

e

g

o

o

d

f

o

r

s

o

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。

A

l

l

t

h

i

n

3)4:2:0 格式,每像素 16 位

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

IMC1

IMC3

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

g

s

i

n

图2.7 UYVY 内存布局

t

h

e

i

r

b

e

标记了 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 所

示。

i

n

g

a

r

e

g

o

o

d

f

o

r

图2.8 IMC1 内存布局

h

i

n

4)4:2:0 格式,每像素 12 位

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

IMC2

IMC4

YV12

NV12

在所有这些格式中,色度频道在水平方向和垂直方向上都要以系数 2 来进

行再次采样。

IMC2

此格式与 IMC1 相同,只是 V (Cr) 和 U (Cb) 行在半跨距边界处进行了交

错。换句话说,就是色度区域中的每个完整跨距行都以一行 V 样例开始,然后

是一行在下一个半跨距边界处开始的 U 样例。此布局与 IMC1 相比,能够更

加高效地利用地址空间。它的色度地址空间缩小了一半,因此整体地址空间缩

g

s

i

n

图 9. IMC3 内存布局

t

h

e

i

r

b

e

IMC3

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

i

n

g

a

r

e

g

o

o

d

f

2 来进行再次采样。

IMC1

所有 Y 样例都会作为不带正负号的char值组成的数组首先显示在内存中。

后面跟着所有 V (Cr) 样例,然后是所有 U (Cb) 样例。V 和 U 平面与 Y 平面

具有相同的跨距,从而生成如图2.8 所示的内存的未使用区域。

小了 25%。在各个 4:2:0 格式中,IMC2 是第二首选格式,排在 NV12 之后。

图2.10 IMC2 内存布局

图2.11 IMC4 内存布局

h

i

n

NV12

所有 Y 样例都会作为由不带正负号的char值组成的数组首先显示在内存中,

并且行数为偶数。Y 平面后面紧接着一个由不带正负号的char值组成的数组,

其中包含了打包的 U (Cb) 和 V (Cr) 样例,如图2.13 所示。当组合的 U-V 数

g

s

YV12

所有 Y 样例都会作为不带正负号的char值组成的数组首先显示在内存中。

此数组后面紧接着所有 V (Cr) 样例。V 平面的跨距为 Y 平面跨距的一半,V

平面包含的行为 Y 平面包含行的一半。V 平面后面紧接着所有 U (Cb) 样例,

它的跨距和行数与 V 平面相同(图 12)。

i

n

图2.12 YV12 内存布局

t

h

e

i

r

b

e

i

n

g

a

r

IMC4

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

e

g

o

o

d

f

o

r

s

o

组被视为一个由 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<-->rgb

Y'= 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<-->rgb

Y’ = 0.257*R' + 0.504*G' + 0.098*B' + 16

Cb' = -0.148*R' - 0.291*G' + 0.439*B' + 128

Cr' = 0.439*R' - 0.368*G' - 0.071*B' + 128

h

i

n

g

s

YCbCr其中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),用于高质量视频应用、演播室

以及专业视频产品。

i

n

t

h

e

i

r

b

e

i

n

g

a

r

图2.13 NV12 内存布局

e

g

o

o

d

f

o

r

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*2

N-8

,白色则表示为 R = G = B = 235*2

N-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.6

01T推荐标准。

Kr = 0.299

Kb = 0.114

第二个转换为 BT.709 中定义用于 60-Hz 的较新 YUV 格式,应该被视为用

于高于SDTV 的视频分辨率的首选格式。它的特征由下面两个不同的常量值来

定义:

Kr = 0.2126

Kb = 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*2

N-8

,其中 N 为每个 RGB 样例的位数 (N >= 8)。

S 为缩放变量。对于计算机 RGB,S 等于 255。对于 studio 视频

RGB,S 等于 219*2

N-8

函数 floor(x) 返回大于或等于 x 的最大整数。函数 clip3(x, y, z) 的定义如

下所示:

clip3(x, y, z) = ((z < x) ? x : ((z > y) ? y : z))

Y 样例表示亮度,U 和 V 样例分别表示偏向蓝色和红色的颜色偏差。Y 的

标称范围为 16*2

M-8

到 235*2

M-8

。黑色表示为 16*2

M-8

,白色表示为 235*2

M-

8

。U 和 V 的标称范围为 16*2

M-8

到 240*2

M-8

,值 128*2

M-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) + 16

U = ( ( -38 * R - 74 * G + 112 * B + 128) >> 8) + 128

V = ( ( 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) + 128

V = round( 0.439216 * R - 0.367788 * G - 0.071427 * B) + 128

因此,假设:

C = Y - 16

D = U - 128

E = 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 表面,也就

无法将这些表面用作解码流中后续图片的参考图片。因此,此处提供的这种方

t

h

i

n

g

s

i

n

t

h

e

i

r

b

e

i

n

g

a

r

e

g

o

Cout[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。您还可以切

换两个上转换过程的顺序,因为操作顺序对于结果的视觉质量不会产生真正的

影响。

2024年9月10日发(作者:钦新荣)

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常见编码格式logo

2)H.263编码格式

于1990年定义完成。1992年底,MPEG-1正式被批准成为国际标准。MPEG-1是

为CD光碟介质定制的的视频和音频压缩格式。一张70分钟的CD光碟传输速率

大约在1.4Mbps。而MPEG-1采用了块方式的运动补偿、离散馀弦变换(DCT)、

量化等技术,并为1.2Mbps传输速率进行了优化。MPEG-1随后被Video CD采

e

a

3)MPEG-1 编码格式

MPEG-1是MPEG组织制定的第一个视频和音频有损压缩标准。视频压缩算法

n

d

H.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

A

l

l

t

h

i

n

g

s

i

n

t

h

e

i

r

b

e

绝大多数视听玩家对于 H264 编码都不会感到陌生,H264 编码的身世显赫,

是 ITU-T(国际电信联盟视频编码专家组)与 ISO/IEC(国际标准化组织动态

图像专家组)合作组成的 JVT(联合视频组)推动的新一代数字视频编码标准,

也称为 MPEG-4/AVC 编码。H264 编码依托雄厚的背景,在技术上独树一帜,大

幅领先于其它编码算法。

X264 编码,是 H264 编码的一个开源分支,它符合 H264 标准,其功能在

于编码,而不作为解码器使用,X264 编码最大的特点在于注重实用,它在不明

显降低编码性能的前提下,努力降低编码的计算复杂度,X264 对于 H264 编码

中的一些复杂编码特性做了折衷处理,其压缩视频体积小于XVID(MPEG-4)编

码视频,以小体积、高画质的特点得到了广泛认可。

i

n

g

a

r

e

g

o

o

1)H264/X264/AVC 编码格式

d

f

o

r

s

o

用作为核心技术。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

a

n

d

A

l

l

t

h

i

n

g

s

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

i

n

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

t

h

e

i

r

b

e

4800-64000bits/sec之间,分辨率为176X144。MPEG-4利用很窄的带宽,通过

i

n

g

互性和灵活性。MPEG-4标准主要应用于视像电话(Video Phone),视像电子邮

a

r

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

e

g

o

o

MPEG-2 编码标准是由 MPEG(Moving Picture Experts Group)工作组发

布的视频与音频压缩国际标准。MPEG-2 编码于 1994 年发布,常用于广播信号

(卫星电视、有线电视)的视频和音频编码,经过后期不断修改,不仅成为

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

d

f

o

r

s

o

m

后发的劣势(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 原配的分离器)

A

l

l

t

h

i

n

3视频的播放组件及调用流程

g

s

  (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 封装格式。

i

n

t

h

e

i

r

b

e

i

n

g

a

r

e

g

o

o

d

f

o

r

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)RGB565

RGB565使用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 0x001F

R = (wPixel & RGB565_MASK_RED) >> 11; // 取值范围0-31

G = (wPixel & RGB565_MASK_GREEN) >> 5; // 取值范围0-63

B = wPixel & RGB565_MASK_BLUE; // 取值范围0-31

3)RGB555

RGB555是另一种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 2

MEDIASUBTYPE_RGB4

16

MEDIASUBTYPE_RGB8

256

MEDIASUBTYPE_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 0x001F

R = (wPixel & RGB555_MASK_RED) >> 10; // 取值范围0-31

G = (wPixel & RGB555_MASK_GREEN) >> 5; // 取值范围0-31

B = wPixel & RGB555_MASK_BLUE; // 取值范围0-31

4)RGB24

RGB24使用24位来表示一个像素,RGB分量都用8位表示,取值范围为0-

255。注意在内存中RGB各分量的排列顺序为:BGR BGR BGR…。通常可以使用

RGBTRIPLE数据结构来操作一个像素,它的定义为:

typedef struct tagRGBTRIPLE {

BYTE rgbtBlue; // 蓝色分量

BYTE rgbtGreen; // 绿色分量

BYTE rgbtRed; // 红色分量

} RGBTRIPLE;

5)RGB32

RGB32使用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 YUY2

MEDIASUBTYPE_YUYV YUYV

MEDIASUBTYPE_YVYU YVYU

MEDIASUBTYPE_UYVY UYVY

MEDIASUBTYPE_AYUV AYUV

MEDIASUBTYPE_Y41P Y41P

MEDIASUBTYPE_Y411 Y411

MEDIASUBTYPE_Y211 Y211

MEDIASUBTYPE_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、Y

VU9、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 样例位置

i

n

2)YUV 4:2:2 采样

4:2:2 采样的这种主要形式在 ITU-R Recommendation BT.601 中进行了定义。

图2.1显示了此标准定义的采样网格。

t

h

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

e

i

r

b

e

i

n

g

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 组件

作为三个单独的平面进行存储。

i

n

t

h

与 MPEG-1 方案相比,在 MPEG-2 方案与为 4:2:2 和 4:4:4 格式定义的采

样网格之间进行转换更简单一些。因此,在 Windows 中首选 MPEG-2 方案,

应该考虑将其作为 4:2:0 格式的默认转换方案。

e

i

r

b

e

i

n

g

a

r

e

g

o

o

d

f

o

r

s

o

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。

A

l

l

t

h

i

n

3)4:2:0 格式,每像素 16 位

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

IMC1

IMC3

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

g

s

i

n

图2.7 UYVY 内存布局

t

h

e

i

r

b

e

标记了 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 所

示。

i

n

g

a

r

e

g

o

o

d

f

o

r

图2.8 IMC1 内存布局

h

i

n

4)4:2:0 格式,每像素 12 位

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

IMC2

IMC4

YV12

NV12

在所有这些格式中,色度频道在水平方向和垂直方向上都要以系数 2 来进

行再次采样。

IMC2

此格式与 IMC1 相同,只是 V (Cr) 和 U (Cb) 行在半跨距边界处进行了交

错。换句话说,就是色度区域中的每个完整跨距行都以一行 V 样例开始,然后

是一行在下一个半跨距边界处开始的 U 样例。此布局与 IMC1 相比,能够更

加高效地利用地址空间。它的色度地址空间缩小了一半,因此整体地址空间缩

g

s

i

n

图 9. IMC3 内存布局

t

h

e

i

r

b

e

IMC3

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

i

n

g

a

r

e

g

o

o

d

f

2 来进行再次采样。

IMC1

所有 Y 样例都会作为不带正负号的char值组成的数组首先显示在内存中。

后面跟着所有 V (Cr) 样例,然后是所有 U (Cb) 样例。V 和 U 平面与 Y 平面

具有相同的跨距,从而生成如图2.8 所示的内存的未使用区域。

小了 25%。在各个 4:2:0 格式中,IMC2 是第二首选格式,排在 NV12 之后。

图2.10 IMC2 内存布局

图2.11 IMC4 内存布局

h

i

n

NV12

所有 Y 样例都会作为由不带正负号的char值组成的数组首先显示在内存中,

并且行数为偶数。Y 平面后面紧接着一个由不带正负号的char值组成的数组,

其中包含了打包的 U (Cb) 和 V (Cr) 样例,如图2.13 所示。当组合的 U-V 数

g

s

YV12

所有 Y 样例都会作为不带正负号的char值组成的数组首先显示在内存中。

此数组后面紧接着所有 V (Cr) 样例。V 平面的跨距为 Y 平面跨距的一半,V

平面包含的行为 Y 平面包含行的一半。V 平面后面紧接着所有 U (Cb) 样例,

它的跨距和行数与 V 平面相同(图 12)。

i

n

图2.12 YV12 内存布局

t

h

e

i

r

b

e

i

n

g

a

r

IMC4

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

e

g

o

o

d

f

o

r

s

o

组被视为一个由 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<-->rgb

Y'= 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<-->rgb

Y’ = 0.257*R' + 0.504*G' + 0.098*B' + 16

Cb' = -0.148*R' - 0.291*G' + 0.439*B' + 128

Cr' = 0.439*R' - 0.368*G' - 0.071*B' + 128

h

i

n

g

s

YCbCr其中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),用于高质量视频应用、演播室

以及专业视频产品。

i

n

t

h

e

i

r

b

e

i

n

g

a

r

图2.13 NV12 内存布局

e

g

o

o

d

f

o

r

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*2

N-8

,白色则表示为 R = G = B = 235*2

N-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.6

01T推荐标准。

Kr = 0.299

Kb = 0.114

第二个转换为 BT.709 中定义用于 60-Hz 的较新 YUV 格式,应该被视为用

于高于SDTV 的视频分辨率的首选格式。它的特征由下面两个不同的常量值来

定义:

Kr = 0.2126

Kb = 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*2

N-8

,其中 N 为每个 RGB 样例的位数 (N >= 8)。

S 为缩放变量。对于计算机 RGB,S 等于 255。对于 studio 视频

RGB,S 等于 219*2

N-8

函数 floor(x) 返回大于或等于 x 的最大整数。函数 clip3(x, y, z) 的定义如

下所示:

clip3(x, y, z) = ((z < x) ? x : ((z > y) ? y : z))

Y 样例表示亮度,U 和 V 样例分别表示偏向蓝色和红色的颜色偏差。Y 的

标称范围为 16*2

M-8

到 235*2

M-8

。黑色表示为 16*2

M-8

,白色表示为 235*2

M-

8

。U 和 V 的标称范围为 16*2

M-8

到 240*2

M-8

,值 128*2

M-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) + 16

U = ( ( -38 * R - 74 * G + 112 * B + 128) >> 8) + 128

V = ( ( 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) + 128

V = round( 0.439216 * R - 0.367788 * G - 0.071427 * B) + 128

因此,假设:

C = Y - 16

D = U - 128

E = 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 表面,也就

无法将这些表面用作解码流中后续图片的参考图片。因此,此处提供的这种方

t

h

i

n

g

s

i

n

t

h

e

i

r

b

e

i

n

g

a

r

e

g

o

Cout[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。您还可以切

换两个上转换过程的顺序,因为操作顺序对于结果的视觉质量不会产生真正的

影响。

发布评论

评论列表 (0)

  1. 暂无评论