对SVC的学习已近开展了一段时间,一直没有进行系统记录,而且探索SVC解码的开源项目也需要有更多的知识积累。所以,从现在开始陆续开展有记录的SVC探索,这次行动不再以周为学习单位,而要求更为灵活高效的安排擦略,基本要考察JSVM和SVC各重要方向的实验和论文,为SVC解码开源项目的后续发展做准备。
1. SVC基础知识
关于SVC的基本意义,可以参看【1】【2】【3】中的论述。SVC(scalable video coding)的可分级
视频编码概念,简而言之,就是把视频序列分成不同的部分并赋予不同的等级,这样的思想已经渊源流传,并非H.264/SVC所独创。2007年由ITU推出的H.264/SVC标准,继承了H.264的高效压缩性,随着网络应用的普及,SVC的灵活码流适应性和对不同终端产品的匹配性,显得尤为重要。
SVC对分级的策略是从时间,空间和质量上,对视频序列进行分级编码(如下图)
下面,将详细描述一下SVC怎么在这些方向进行分级的:
(1)时间分级(Temporal Scalability)
时间分级就是给序列的视频帧分配不同的重要等级,以便于在实际应用中按重要程度显示帧(或在恶劣网络条件下主动放弃低等级的帧)。其实现方式是采用如下图所示的hierarchical B结构。可以按照具体应用来设计分等级的B帧结构,然后组织起一个个GOP,再架构成整个编码序列。由于H.264/AVC中允许进行参考帧管理,使得时间分级可以直接利用这一特性得以实现。
(2)空间分级(Spatial Scalability)
空间分级的用于形成不同的图像(帧)分辨率,在实际应用中可以给不同显示屏幕的终端设备提供适配的画面,以达到提高带宽使用率的目的。具体的变现如上面的图,是在不同的分辨率序列层中进行预测,利用去相关性节省码流。在SVC中,除了提供传统的层间intra预测(Inter-layer intra prediction),还提供层间宏块模式与运动预测(Inter-layer macroblock mode and motion prediction)和层间残差预测(Inter-layer residual prediction),这三种模式可以充分利用图像的时间和空间相关性进行分级编码,
i. 层间intra预测(Inter-layer intra prediction)
这种预测方式的宏块信息完全由层间参考帧(一般是低分辨率的重建帧)通过上采样预测得到,在H.262/MPEG-2 Video, H.263, 和 MPEG-4等编码模式中也经常被用到,但是这种方式缺乏消除时间相关性所得到的码率削减。 ii. 层间宏块模式与运动预测(Inter-layer macroblock mode and motion prediction)
宏块使用类似AVC的帧间预测进行编码,其宏块模式采用层间参考帧相应块的模式,其对应的运动矢量也利用层间参考帧相应块的运动信息进行预测编码。这就是所谓的层间运动预测(inter-layer motion prediction)。
iii. 层间残差预测(Inter-layer residual prediction)
利用残差的层间相关性,可以对于帧间预测的图像继续进行层间预测,以进一步削减码流。
三种层间预测的概要图示如下:
在【1】中提到一个SVC设计的重要特性,每个空间增强层可以在单一的运动补偿环中解码。在对一个目标帧的解码中,其空间参考帧需要重建自己层间预测相关的intra-coded宏块和残差块,并对自己的运动矢量进行解码,运动补偿和对帧间预测的去方块滤波仅在目标帧中进行。
(3)质量分级(Quality Scalability)
质量分级往往可以被认为是一种特殊(解析度相同)的空间分级编码,因此传统的coarse-grain quality scalable coding (CGS,粗粒度质量分级编码)很容易被想到,而在实际应用中,还发展了medium-grain quality scalability (MGS,中等粒度质量分级编码),下面将分别描述他们: i. CGS CGS有类似空间分级中层间预测,但是无需有上采样的过程,为了更好的视频质量需要呈现更多的图像纹理,因此,在质量分层的层间预测中,对纹理的提纯通常通过采用更小量化步长的重新量化。为了减少计算复杂性,用于层间intra预测的参考帧deblocking被忽略,而且层间intra预测和层间残差预测将在DCT系数阶段被直接处理。 ii. MGS
由于CGS对码率控制不能灵活处理,一种叫MGS的衍生方式被提出采用,MGS可以灵活的权衡漂移(draft,运动补偿预测循环中的编解码不同步)和层次预测的编码效率。下面的图,蓝色的表示用于基础质量序列,红色表示较好质量的序列,可以根据策略灵活组合他们之间的参考关系。
其中上图(c)(d)就是MGS的灵活方式。以(d)来说,就是对
有黑色标注的Key picture,用基础质量图像做参考,而对非Key picture使用较好质量的图像做参考,
一旦增强层丢包,则可能造成drift,drift被控制在两个Key picture之间。
对于质量分级,
SVC还支持两个特性,Partitioning of transform coefficients和SVC-to-AVC rewriting,前者提供用slice来分散增强层变换系数的方法,以便于同一增强层数据被分散到几个包中,后者提供了SVC-》AVC的转码便利。
至此,SVC的基础入门概念就描述完了,下面将要开始看看怎么使用JSVM来做分层编解码实验。
2. JSVM基础实验
(1)编码实验
jsvm的实验可以从编码开始,编译完JSVM代码后,可以运行H264AVCEncoderLibTestStaticd.exe来进行SVC编码,在这里的基础实现中首先关注spatial scalability的编码,通常可以结合temporary scalability一起进行。用以下命令运行编码:
H264AVCEncoderLibTestStaticd -pf encoder.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 w subseq SEI) SearchMode 4 # Search mode (0:BlockSearch, 4:FastSearch) SearchRange 32 # Search range (Full Pel)
#=================== LAYER DEFINITION ==================
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 Configuration File
#============================== 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 ESSChromaPhaseX 0 # chroma phase x 0 or -1, default = -1 ESSChromaPhaseY 0 # chroma phase y -1 to +1, default = 0 ESSBaseChromaPhaseX 0 # base chroma phase x 0 or -1, default = -1 ESSBaseChromaPhaseY 0 # base chroma phase y -1 to +1, default = 0 0
******************************************************************
本实验将编码双层的SVC文件,分别包含352x288和176x144两个分辨率,需要注意的是这里需要输入的是两个分辨率对应的YUV文件,在开发实际应用中,将是对输入的高分辨率视频按需求进行下采样得到相应低分辨率的输入码流。理解上面的配置文件可以阅读JSVM的“SoftwareManual.doc”。
以下是实验结果
*****************************初始实验结果********************
JSVM 9.15 Encoder
profile & level info:
===================== DQ= 0: Main @ Level 1.1 DQ= 16: Scalable High @ Level 2.1 AU 0: I T0 L0 Q0 QP 28 Y 35.0921 U 36.6779 V 36.4204 66768 bit 0: I T0 L1 Q0 QP 28 Y 35.4271 U 37.4696 V 37.2485 206872 bit AU 8: P T0 L0 Q0 QP 28 Y 34.7829 U 37.1181 V 36.7810 26280 bit 8: P T0 L1 Q0 QP 28 Y 35.4518 U 37.6578 V 37.4747 101464 bit AU 4: B T1 L0 Q0 QP 31 Y 32.5973 U 36.1283 V 35.5269 4264 bit 4: B T1 L1 Q0 QP 31 Y 32.8378 U 36.9262 V 36.4150 21624 bit AU 2: B T2 L0 Q0 QP 33 Y 31.7760 U 35.9120 V 35.3318 2272 bit 2: B T2 L1 Q0 QP 33 Y 32.1271 U 36.4808 V 35.9225 11352 bit AU 1: B T3 L0 Q0 QP 34 Y 31.9559 U 36.2816 V 35.7872 1136 bit 1: B T3 L1 Q0 QP 34 Y 31.4860 U 36.5493 V 36.0923 5672 bit AU 3: B T3 L0 Q0 QP 34 Y 31.1236 U 35.5697 V 34.9500 1136 bit 3: B T3 L1 Q0 QP 34 Y 31.2954 U 36.0335 V 35.5473 6056 bit AU 6: B T2 L0 Q0 QP 33 Y 31.6214 U 35.7877 V 35.3442 2368 bit 6: B T2 L1 Q0 QP 33 Y 32.0268 U 36.4989 V 36.0755 11080 bit AU 5: B T3 L0 Q0 QP 34 Y 31.2529 U 35.3809 V 34.8735 1296 bit 5: B T3 L1 Q0 QP 34 Y 31.4222 U 36.0127 V 35.4764 6200 bit AU 7: B T3 L0 Q0 QP 34 Y 31.8522 U 35.9385 V 35.6081 1064 bit 7: B T3 L1 Q0 QP 34 Y 31.7233 U 36.4942 V 36.0999 6768 bit
.
.
.
SUMMARY:
bitrate Min-bitr Y-PSNR U-PSNR V-PSNR --------- ---------- -------- -------- -------- 176x144 @ 3.1250 115.5750 115.5750 34.9069 37.0066 36.5668 176x144 @ 6.2500 132.4000 132.4000 33.6463 36.5663 35.8824 176x144 @ 12.5000 149.7562 149.7562 32.6071 36.1343 35.3446 176x144 @ 25.0000 164.7937 164.7937 31.9890 35.8764 35.0516 352x288 @ 3.1250 514.3438 514.3438 35.4914 37.5844 37.4000 352x288 @ 6.2500 606.0562 606.0562 34.0656 37.1580 36.8032 352x288 @ 12.5000 706.5750 706.5750 33.0123 36.7826 36.3039 352x288 @ 25.0000 809.1812 809.1812 32.2313 36.4422 35.9078
******************************************************************
从实验结果可以看到,以8帧为一个GOP,实验就像上面hierarchical B结构图(a)那样分了4个时间层次,并且分别列出两种分辨率。从最后的统计结果可以看到,作为GOP的关键帧,无论是空间基础层还是增强层都占可主要的码流量。
(2)解码实验
解码实验将采用H264AVCDecoderLibTestStatic,解码输出自能得到最好的流,也就是基础层结合增强层得到的最高层次的流,本实验中是352x288的25帧序列。解码过程显示如下:
D:\workspace\project\jsvm\bin>H264AVCDecoderLibTestStaticd D:\workspace\264\svct
est.264 D:\workspace\264\rec_svc JSVM 9.15 Decoder ---------- new ACCESS UNIT ---------- NON-VCL: SEI NAL UNIT NON-VCL: SEQUENCE PARAMETER SET (ID=0) NON-VCL: SUBSET SEQUENCE PARAMETER SET (ID=0) NON-VCL: PICTURE PARAMETER SET (ID=0) NON-VCL: PICTURE PARAMETER SET (ID=1) NON-VCL: PICTURE PARAMETER SET (ID=2) NON-VCL: SEI NAL UNIT Frame 0 ( LId 0, TL 0, QL 0, AVC-I, BId-1, AP 0, QP 28 ) Frame 0 ( LId 1, TL 0, QL 0, SVC-I, BId 0, AP 1, QP 28 ) ---------- new ACCESS UNIT ---------- NON-VCL: SEI NAL UNIT Frame 8 ( LId 0, TL 0, QL 0, AVC-P, BId-1, AP 0, QP 28 ) Frame 8 ( LId 1, TL 0, QL 0, SVC-P, BId 0, AP 1, QP 28 ) ---------- new ACCESS UNIT ---------- NON-VCL: SEI NAL UNIT Frame 4 ( LId 0, TL 1, QL 0, AVC-B, BId-1, AP 0, QP 31 ) Frame 4 ( LId 1, TL 1, QL 0, SVC-B, BId 0, AP 1, QP 31 ) ---------- new ACCESS UNIT ---------- NON-VCL: SEI NAL UNIT Frame 2 ( LId 0, TL 2, QL 0, AVC-B, BId-1, AP 0, QP 33 ) Frame 2 ( LId 1, TL 2, QL 0, SVC-B, BId 0, AP 1, QP 33 ) ---------- new ACCESS UNIT ---------- NON-VCL: SEI NAL UNIT Frame 1 ( LId 0, TL 3, QL 0, AVC-B, BId-1, AP 0, QP 34 ) Frame 1 ( LId 1, TL 3, QL 0, SVC-B, BId 0, AP 1, QP 34 ) ---------- new ACCESS UNIT ---------- NON-VCL: SEI NAL UNIT Frame 3 ( LId 0, TL 3, QL 0, AVC-B, BId-1, AP 0, QP 34 ) Frame 3 ( LId 1, TL 3, QL 0, SVC-B, BId 0, AP 1, QP 34 ) ---------- new ACCESS UNIT ---------- NON-VCL: SEI NAL UNIT Frame 6 ( LId 0, TL 2, QL 0, AVC-B, BId-1, AP 0, QP 33 ) Frame 6 ( LId 1, TL 2, QL 0, SVC-B, BId 0, AP 1, QP 33 ) ---------- new ACCESS UNIT ---------- NON-VCL: SEI NAL UNIT Frame 5 ( LId 0, TL 3, QL 0, AVC-B, BId-1, AP 0, QP 34 ) Frame 5 ( LId 1, TL 3, QL 0, SVC-B, BId 0, AP 1, QP 34 ) ---------- new ACCESS UNIT ---------- NON-VCL: SEI NAL UNIT Frame 7 ( LId 0, TL 3, QL 0, AVC-B, BId-1, AP 0, QP 34 ) Frame 7 ( LId 1, TL 3, QL 0, SVC-B, BId 0, AP 1, QP 34 )
从上面的过程中可以看到所有的基础层和增强层原始都被使用到了,那么要想仅仅解码基础层的序列该如何操作呢?就要用到下面介绍的流提取工具BitStreamExtractorStatic。
(3)流提取实验
用BitStreamExtractorStatic提取svc文件里的相应子流,在输入的参数不足时,会列出svc文件中可以提取的各层:
D:\workspace\project\jsvm\bin>BitStreamExtractorStaticd D:\workspace\264\svctest
.264 JSVM 9.15 BitStream Extractor Contained Layers: ====================
Layer Resolution Framerate Bitrate MinBitrate DTQ
0 176x144 3.1250 115.60 115.60 (0,0,0) 1 176x144 6.2500 132.40 132.40 (0,1,0) 2 176x144 12.5000 149.80 149.80 (0,2,0) 3 176x144 25.0000 164.80 164.80 (0,3,0) 4 352x288 3.1250 514.30 514.30 (1,0,0) 5 352x288 6.2500 606.10 606.10 (1,1,0) 6 352x288 12.5000 706.60 706.60 (1,2,0) 7 352x288 25.0000 809.20 809.20 (1,3,0)
下面是一个成取176x144的25帧率序列的实验:
D:\workspace\project\jsvm\bin>BitStreamExtractorStaticd D:\workspace\264\svctest
.264 D:\workspace\264\ext_svc.264 -e 176x144@25:164.8 JSVM 9.15 BitStream Extractor Contained Layers: ====================
Layer Resolution Framerate Bitrate MinBitrate DTQ
0 176x144 3.1250 115.60 115.60 (0,0,0) 1 176x144 6.2500 132.40 132.40 (0,1,0) 2 176x144 12.5000 149.80 149.80 (0,2,0) 3 176x144 25.0000 164.80 164.80 (0,3,0) 4 352x288 3.1250 514.30 514.30 (1,0,0) 5 352x288 6.2500 606.10 606.10 (1,1,0) 6 352x288 12.5000 706.60 706.60 (1,2,0) 7 352x288 25.0000 809.20 809.20 (1,3,0)
WARNING: Bit-rate underflow for extraction/inclusion point
============Extraction Information====== Extracted spatail layer : 176x144 Extracted temporal rate : 25f/s
quality_id statistics for dependency_id 0
=========================================== quality_id 0 - total: 16 retained: 16
Number of input packets: 134
Number of output packets: 99
可以对输出的ext_svc.264文件用H264AVCDecoderLibTestStatic解码,得到176x144的yuv。
至此,本文作为入门介绍已经完成,JSVM还有许多辅助工具可以参照
JSVM Software Manual,本章的实验结果可以体会到,使用JSVM编码的好速度很慢,还没具体统计,大约每分钟两三帧,而解码在当前一般配置的双核PC系统基本可以达到实时。
|
SVC学习小结-SVC入门知识和JSVM基础实验
最新推荐文章于 2024-06-06 09:38:27 发布