close
文章转载自:罗索实验室 [http://www.rosoo.net/a/201001/8436.html]
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),这三种模式可以充分利用图像的时间和空间相关性进行分级编码, 层间intra预测(Inter-layer intra prediction) 这种预测方式的宏块信息完全由层间参考帧(一般是低分辨率的重建帧)通过上采样预测得到,在H.262/MPEG-2 Video, H.263, MPEG-4等编码模式中也经常被用到,但是这种方式缺乏消除时间相关性所得到的码率削减。 层间宏块模式与运动预测(Inter-layer macroblock mode and motion prediction) motion prediction)。 层间残差预测(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)编码实验 scalability的编码,通常可以结合temporary scalability一起进行。用以下命令运行编码: 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, # 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 ****************************************************************** 文件 ****************************************************************** # Layer Configuration File #================= INPUT / OUTPUT ==================== SourceWidth 176 # Input SourceHeight 144 # Input FrameRateIn 25 # Input FrameRateOut 25 # Output frame rate [Hz] InputFile D:\workspace\264\mobile_qcif.yuv # Input ReconFile rec_layer0.yuv # Reconstructed file SymbolMode 0 # 0=CAVLC, 1=CABAC ****************************************************************** 文件 ****************************************************************** # Layer Configuration File #============================== INPUT / OUTPUT =============== SourceWidth 352 # Input SourceHeight 288 # Input FrameRateIn 25 # Input FrameRateOut 25 # Output frame rate [Hz] InputFile D:\workspace\264\mobile_cif.yuv # Input 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= 1.1 DQ= 16: AU 0: I Q0 28 U 36.6779 36.4204 66768 bit 0: I Q0 28 U 37.4696 37.2485 206872 bit AU 8: P Q0 28 U 37.1181 36.7810 26280 bit 8: P Q0 28 U 37.6578 37.4747 101464 bit AU 4: B Q0 31 U 36.1283 35.5269 4264 bit 4: B Q0 31 U 36.9262 36.4150 21624 bit AU 2: B Q0 33 U 35.9120 35.3318 2272 bit 2: B Q0 33 U 36.4808 35.9225 11352 bit AU 1: B Q0 34 U 36.2816 35.7872 1136 bit 1: B Q0 34 U 36.5493 36.0923 5672 bit AU 3: B Q0 34 U 35.5697 34.9500 1136 bit 3: B Q0 34 U 36.0335 35.5473 6056 bit AU 6: B Q0 33 U 35.7877 35.3442 2368 bit 6: B Q0 33 U 36.4989 36.0755 11080 bit AU 5: B Q0 34 U 35.3809 34.8735 1296 bit 5: B Q0 34 U 36.0127 35.4764 6200 bit AU 7: B Q0 34 U 35.9385 35.6081 1064 bit 7: B Q0 34 U 36.4942 36.0999 6768 bit . . . SUMMARY: bitrate Min-bitr Y-PSNR U-PSNR --------- ---------- -------- -------- -------- 3.1250 115.5750 115.5750 37.0066 6.2500 132.4000 132.4000 36.5663 12.5000 149.7562 149.7562 36.1343 25.0000 164.7937 164.7937 35.8764 3.1250 514.3438 514.3438 37.5844 6.2500 606.0562 606.0562 37.1580 12.5000 706.5750 706.5750 36.7826 25.0000 809.1812 809.1812 36.4422 ****************************************************************** 从实验结果可以看到,以8帧为一个GOP,实验就像上面hierarchical B结构图(a)那样分了4个时间层次,并且分别列出两种分辨率。从最后的统计结果可以看到,作为GOP的关键帧,无论是空间基础层还是增强层都占可主要的码流量。 (2)解码实验 解码实验将采用H264AVCDecoderLibTestSta D:\workspace\project\jsvm\bin>H264AVCDecoderLibTestSta D:\workspace\264\svct est.264 D:\workspace\264\rec_svc JSVM 9.15 Decoder ---------- new ACCESS UNIT ---------- (ID=0) Frame 0, TL 0, QL 0, AVC-I, BId-1, AP 0, QP 28 ) Frame 1, TL 0, QL 0, SVC-I, BId 0, AP 1, QP 28 ) ---------- new ACCESS UNIT ---------- Frame 0, TL 0, QL 0, AVC-P, BId-1, AP 0, QP 28 ) Frame 1, TL 0, QL 0, SVC-P, BId 0, AP 1, QP 28 ) ---------- new ACCESS UNIT ---------- Frame 0, TL 1, QL 0, AVC-B, BId-1, AP 0, QP 31 ) Frame 1, TL 1, QL 0, SVC-B, BId 0, AP 1, QP 31 ) ---------- new ACCESS UNIT ---------- Frame 0, TL 2, QL 0, AVC-B, BId-1, AP 0, QP 33 ) Frame 1, TL 2, QL 0, SVC-B, BId 0, AP 1, QP 33 ) ---------- new ACCESS UNIT ---------- Frame 0, TL 3, QL 0, AVC-B, BId-1, AP 0, QP 34 ) Frame 1, TL 3, QL 0, SVC-B, BId 0, AP 1, QP 34 ) ---------- new ACCESS UNIT ---------- Frame 0, TL 3, QL 0, AVC-B, BId-1, AP 0, QP 34 ) Frame 1, TL 3, QL 0, SVC-B, BId 0, AP 1, QP 34 ) ---------- new ACCESS UNIT ---------- Frame 0, TL 2, QL 0, AVC-B, BId-1, AP 0, QP 33 ) Frame 1, TL 2, QL 0, SVC-B, BId 0, AP 1, QP 33 ) ---------- new ACCESS UNIT ---------- Frame 0, TL 3, QL 0, AVC-B, BId-1, AP 0, QP 34 ) Frame 1, TL 3, QL 0, SVC-B, BId 0, AP 1, QP 34 ) ---------- new ACCESS UNIT ---------- Frame 0, TL 3, QL 0, AVC-B, BId-1, AP 0, QP 34 ) Frame 1, TL 3, QL 0, SVC-B, BId 0, AP 1, QP 34 ) 从上面的过程中可以看到所有的基础层和增强层原始都被使用到了,那么要想仅仅解码基础层的序列该如何操作呢?就要用到下面介绍的流提取工具BitStreamExtractorStatic (3)流提取实验 用BitStreamExtractorStatic D:\workspace\project\jsvm\bin>BitStreamExtractorStatic D:\workspace\264\svctest .264 JSVM 9.15 BitStream Extractor Contained Layers: ==================== Layer Resolution Framerate MinBitrate DTQ 0 176x144 3.1250 115.60 115.60 1 176x144 6.2500 132.40 132.40 2 176x144 12.5000 149.80 149.80 3 176x144 25.0000 164.80 164.80 4 352x288 3.1250 514.30 514.30 5 352x288 6.2500 606.10 606.10 6 352x288 12.5000 706.60 706.60 7 352x288 25.0000 809.20 809.20 下面是一个成取176x144的25帧率序列的实验: D:\workspace\project\jsvm\bin>BitStreamExtractorStatic 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 MinBitrate DTQ 0 176x144 3.1250 115.60 115.60 1 176x144 6.2500 132.40 132.40 2 176x144 12.5000 149.80 149.80 3 176x144 25.0000 164.80 164.80 4 352x288 3.1250 514.30 514.30 5 352x288 6.2500 606.10 606.10 6 352x288 12.5000 706.60 706.60 7 352x288 25.0000 809.20 809.20 WARNING: Bit-rate underflow for extraction/inclusion point ============Extraction Information====== Extracted spatail layer Extracted temporal rate quality_id statistics for dependency_id 0 =========================================== quality_id 0 - total: retained: 16 Number of input packets: 134 Number of output packets: 99 可以对输出的ext_svc.264文件用H264AVCDecoderLibTestSta 至此,本文作为入门介绍已经完成,JSVM还有许多辅助工具可以参照JSVM Software Manual,本章的实验结果可以体会到,使用JSVM编码的好速度很慢,还没具体统计,大约每分钟两三帧,而解码在当前一般配置的双核PC系统基本可以达到实时。下一篇文章将进入JSVM的代码分析。 【参考文献】 1. HHI,“The Scalable Video Coding Amendment of the H.264/AVC Standard” 2. Heiko Schwarz, Detlev Marpe,, and Thomas Wiegand, "Overview of the Scalable Video Coding Extension of the H.264/AVC Standard" 3. 不屈号的航海长,“video in future” |
全站熱搜
留言列表