基础之一 yuv格式
其中“Y”表示明亮度(Luminance或Luma),也就是灰阶值;而“U”和“V”表示的则是色度(Chrominance或Chroma),作用是描述影像色彩及饱和度,用于指定像素的颜色。“亮度”是透过RGB输入信号来建立的,方法是将RGB信号的特定部分叠加到一起。“色度”则定义了颜色的两个方面─色调与饱和度,分别用Cr和Cb来表示。其中,Cr反映了RGB输入信号红色部分与RGB信号亮度值之间的差异。而Cb反映的是RGB输入信号蓝色部分与RGB信号亮度值之间的差异。
采用YUV色彩空间的重要性是它的亮度信号Y和色度信号U、V是分离的。如果只有Y信号分量而没有U、V分量,那么这样表示的图像就是黑白灰度图像。彩色电视采用YUV空间正是为了用亮度信号Y解决彩色电视机与黑白电视机的兼容问题,使黑白电视机也能接收彩色电视信号。
1. SVC基础知识
1.Scalable Video Coding – 可分级视频编码
-为什么需要可分级视频编码技术(SVC)
实际应用中,存在不同的网络和不同的用户终端,各种情况下对视频质量的需求不一样。例如,在利用网络传输视频信息时,由于网络带宽限制了数据传输,因此要求当网络带宽较小的时候,只传输基本的视频信号,并根据实际网络的状况决定是否传输增强的视频信息,使视频的质量得到加强。
在这样的背景下,利用可分级视频编码技术实现一次性编码产生具有不同帧率、分辨率的视频压缩码流,然后根据不同网络带宽、不同的显示屏幕和终端解码能力选择需要传输的视频信息量,以此实现视频质量的自适应调整。
-可分级视频编码(SVC)是什么
为了能够实现从单一码流中解码得到不同帧率(时间可分级)、分辨率(空间可分级)和图像质量(SNR可分级)的视频数据的编码技术。
H.264 SVC以H.264 AVC视频编解码器标准为基础,利用了AVC编解码器的各种高效算法工具,在编码产生的编码视频时间上(帧率)、空间上(分辨率)可扩展,并且是在视频质量方面可扩展的,可产生不同帧速率、分辨率或质量等级的解码视频。
2.H264 Scalable Video Coding Extension
H.264 SVC(H.264可分级编码)作为H.264标准的一个扩展最初由JVT在2004年开始制定,并于2007年7月获得ITU批准。
H264可分级视频编码是H264/AVC标准的扩展 (Annex G , 2007),它是以H264/AVC标准为基础,通过各种编码工具,形成分层编码(multi-layercoding)方式,以提供时间(Temporal)上,空间(Spatial)上和图像质量(Quality)上的可调整特性,可产生不同帧率、图像分辨率或图像质量等级的解码视频。
-H264 SVC结构
H264可分级视频编码采用分层编码方式实现,由一个基本层(Base Layer)和多个增强层(Enhancement Layer)组成,增强层依赖基本层的数据来解码。其中,基本层(base layer)编码了基本的视频信息,实现了最低图像分辨率、帧率,并且基本层的编码是兼容H264/AVC编码标准的,能够采用H264/AVC解码器进行解码。
H264 SVC以不同分辨率的图像为基础形成分层结构(inter-layer prediction),并在此基础上每一层用Hierarchical B-picture来实现TemporalScalablity,用MGS编码来实现Quility Scalability (SNR Scalability)
每一层内的编码都使用了H264/AVC中帧内和帧间预测编码工具,而相邻层之间使用了SVC独有的层间预测编码工具。
EL(Enhancement Layer)的参考,可以是来源于同一层的其他帧,也可以是低层上采样的帧。但是不可以是更高层的帧,那样的话丢弃高层的nalu会导致低层无法解码。
SVC(scalable video coding)的可分级
视频编码概念,简而言之,就是把视频序列分成不同的部分并赋予不同的等级,这样的思想已经渊源流传,并非H.264/SVC所独创。2007年由ITU推出的H.264/SVC标准,继承了H.264的高效压缩性,随着网络应用的普及,SVC的灵活码流适应性和对不同终端产品的匹配性,显得尤为重要。
SVC对分级的策略是从时间,空间和质量上,对视频序列进行分级编码(如下图)
下面,将详细描述一下SVC怎么在这些方向进行分级的:
(1)时间分级(TemporalScalability)
时间分级就是给序列的视频帧分配不同的重要等级,以便于在实际应用中按重要程度显示帧(或在恶劣网络条件下主动放弃低等级的帧)。其实现方式是采用如下图所示的hierarchicalB结构。可以按照具体应用来设计分等级的B帧结构,然后组织起一个个GOP,再架构成整个编码序列。由于H.264/AVC中允许进行参考帧管理,使得时间分级可以直接利用这一特性得以实现。
(2)空间分级(SpatialScalability)
空间分级的用于形成不同的图像(帧)分辨率,在实际应用中可以给不同显示屏幕的终端设备提供适配的画面,以达到提高带宽使用率的目的。具体的变现如上面的图,是在不同的分辨率序列层中进行预测,利用去相关性节省码流。在SVC中,除了提供传统的层间intra预测(Inter-layerintra prediction),还提供层间宏块模式与运动预测(Inter-layer macroblock mode andmotion prediction)和层间残差预测(Inter-layer residualprediction),这三种模式可以充分利用图像的时间和空间相关性进行分级编码,
i.层间intra预测(Inter-layer intra prediction)
这种预测方式的宏块信息完全由层间参考帧(一般是低分辨率的重建帧)通过上采样预测得到,在H.262/MPEG-2 Video,H.263,
和MPEG-4等编码模式中也经常被用到,但是这种方式缺乏消除时间相关性所得到的码率削减。
ii.层间宏块模式与运动预测(Inter-layer macroblock mode and motionprediction)
宏块使用类似AVC的帧间预测进行编码,其宏块模式采用层间参考帧相应块的模式,其对应的运动矢量也利用层间参考帧相应块的运动信息进行预测编码。这就是所谓的层间运动预测(inter-layermotion prediction)。
iii.层间残差预测(Inter-layer residual prediction)
利用残差的层间相关性,可以对于帧间预测的图像继续进行层间预测,以进一步削减码流。
三种层间预测的概要图示如下:
在【1】中提到一个SVC设计的重要特性,每个空间增强层可以在单一的运动补偿环中解码。在对一个目标帧的解码中,其空间参考帧需要重建自己层间预测相关的intra-coded宏块和残差块,并对自己的运动矢量进行解码,运动补偿和对帧间预测的去方块滤波仅在目标帧中进行。
(3)质量分级(QualityScalability)
质量分级往往可以被认为是一种特殊(解析度相同)的空间分级编码,因此传统的coarse-grain quality scalablecoding (CGS,粗粒度质量分级编码)很容易被想到,而在实际应用中,还发展了medium-grain qualityscalability (MGS,中等粒度质量分级编码),下面将分别描述他们:
i. CGS
CGS有类似空间分级中层间预测,但是无需有上采样的过程,为了更好的视频质量需要呈现更多的图像纹理,因此,在质量分层的层间预测中,对纹理的提纯通常通过采用更小量化步长的重新量化。为了减少计算复杂性,用于层间intra预测的参考帧deblocking被忽略,而且层间intra预测和层间残差预测将在DCT系数阶段被直接处理。
ii. MGS
由于CGS对码率控制不能灵活处理,一种叫MGS的衍生方式被提出采用,MGS可以灵活的权衡漂移(draft,运动补偿预测循环中的编解码不同步)和层次预测的编码效率。下面的图,蓝色的表示用于基础质量序列,红色表示较好质量的序列,可以根据策略灵活组合他们之间的参考关系。
其中上图(c)(d)就是MGS的灵活方式。以(d)来说,就是对
有黑色标注的Keypicture,用基础质量图像做参考,而对非Key picture使用较好质量的图像做参考,
一旦增强层丢包,则可能造成drift,drift被控制在两个Keypicture之间。
对于质量分级,
SVC还支持两个特性,Partitioningof transform coefficients和SVC-to-AVCrewriting,前者提供用slice来分散增强层变换系数的方法,以便于同一增强层数据被分散到几个包中,后者提供了SVC-》AVC的转码便利。
至此,SVC的基础入门概念就描述完了,下面将要开始看看怎么使用JSVM来做分层编解码实验。
2.JSVM基础实验
(1)编码实验
jsvm的实验可以从编码开始,编译完JSVM代码后,可以运行H264AVCEncoderLibTestSta
ticd.exe来进行SVC编码,在这里的基础实现中首先关注spatialscalability的编码,通常可以结合temporary scalability一起进行。用以下命令运行编码:
H264AVCEncoderLibTestSta
ticd -pfencoder.cfg
这里仅仅使用最简单的参数:
文件encoder.cfg
******************************************************************
# Scalable H.264/AVC Extension Configuration File
OutputFile
D:\workspace\264\svctest.264
# Bitstream file
FrameRate
25
# Maximum frame rate [Hz]
FramesToBeEncoded
32
# Number of frames (at input frame rate)
GOPSize
8
# GOP Size (at maximum frame rate)
BaseLayerMode
2
# Base layer mode (0: AVC w larger DPB,
#
1:AVC compatible, 2:AVC wsubseq SEI)
SearchMode
4
# Search mode (0:BlockSearch, 4:FastSearch)
SearchRange
32
# Search range (Full Pel)
#=================== LAYERDEFINITION ==================
NumLayers
2
# Number of layers
LayerCfg
layer0.cfg
# Layer configuration file
LayerCfg
layer1.cfg
# Layer configuration file
******************************************************************
文件
layer0.cfg
******************************************************************
# Layer Configuration File
#================= INPUT / OUTPUT ====================
SourceWidth
176
# Input
frame width
SourceHeight
144
# Input
frame height
FrameRateIn
25
# Input
frame rate [Hz]
FrameRateOut
25
# Output frame rate [Hz]
InputFile
D:\workspace\264\mobile_qcif.yuv
# Input
file
ReconFile
rec_layer0.yuv
# Reconstructed file
SymbolMode
0
# 0=CAVLC, 1=CABAC
******************************************************************
文件
layer1.cfg
******************************************************************
# Layer ConfigurationFile
#============================== INPUT / OUTPUT===============
SourceWidth
352
# Input
frame width
SourceHeight
288
# Input
frame height
FrameRateIn
25
# Input
frame rate [Hz]
FrameRateOut
25
# Output frame rate [Hz]
InputFile
D:\workspace\264\mobile_cif.yuv
# Input
file
ReconFile
rec_layer1.yuv
# Reconstructed file
SymbolMode
0
# 0=CAVLC, 1=CABAC
InterLayerPred
2
# Inter-layer Prediction (0: no, 1: yes, 2:adaptive)
UseESS
1
# ESS
ESSCropWidth
352
# cropping width
ESSCropHeight
288
# cropping height
ESSOriginX
0
# cropping origin X
ESSOriginY
0
# cropping origin Y
ESSChromaPhaseX0
# chroma phase x 0 or -1, default = -1
ESSChromaPhaseY0
# chroma phase y -1 to +1, default = 0
ESSBaseChromaPhaseX0
# base chroma phase x 0 or -1, default = -1
ESSBaseChromaPhaseY0
# base chroma phase y -1 to +1, default = 0 0
******************************************************************
本实验将编码双层的SVC文件,分别包含352x288和176x144两个分辨率,需要注意的是这里需要输入的是两个分辨率对应的YUV文件,在开发实际应用中,将是对输入的高分辨率视频按需求进行下采样得到相应低分辨率的输入码流。理解上面的配置文件可以阅读JSVM的“SoftwareManual.doc”。
以下是实验结果
*****************************初始实验结果********************
JSVM 9.15 Encoder
profile & levelinfo:
=====================
DQ=
0:
Main @ Level1.1
DQ= 16:
Scalable High @ Level 2.1
AU
0: I
T0 L0Q0
QP28
Y 35.0921
U 36.6779
V36.4204
66768 bit
0: I
T0 L1Q0
QP28
Y 35.4271
U 37.4696
V37.2485
206872 bit
AU
8: P
T0 L0Q0
QP28
Y 34.7829
U 37.1181
V36.7810
26280 bit
8: P
T0 L1Q0
QP28
Y 35.4518
U 37.6578
V37.4747
101464 bit
AU
4: B
T1 L0Q0
QP31
Y 32.5973
U 36.1283
V35.5269
4264 bit
4: B
T1 L1Q0
QP31
Y 32.8378
U 36.9262
V36.4150
21624 bit
AU
2: B
T2 L0Q0
QP33
Y 31.7760
U 35.9120
V35.3318
2272 bit
2: B
T2 L1Q0
QP33
Y 32.1271
U 36.4808
V35.9225
11352 bit
AU
1: B
T3 L0Q0
QP34
Y 31.9559
U 36.2816
V35.7872
1136 bit
1: B
T3 L1Q0
QP34
Y 31.4860
U 36.5493
V36.0923
5672 bit
AU
3: B
T3 L0Q0
QP34
Y 31.1236
U 35.5697
V34.9500
1136 bit
3: B
T3 L1Q0
QP34
Y 31.2954
U 36.0335
V35.5473
6056 bit
AU
6: B
T2 L0Q0
QP33
Y 31.6214
U 35.7877
V35.3442
2368 bit
6: B