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。您还可以切
换两个上转换过程的顺序,因为操作顺序对于结果的视觉质量不会产生真正的
影响。