H.264/svc入门
来源:互联网 发布:淘宝硅硼钙铝石 编辑:程序博客网 时间:2024/05/16 09:11
时间分级就是给序列的视频帧分配不同的重要等级,以便于在实际应用中按重要程度显示帧(或在恶劣网络条件下主动放弃低等级的帧)。其实现方式是采用如下图所示的hierarchical B结构。可以按照具体应用来设计分等级的B帧结构,然后组织起一个个GOP,再架构成整个编码序列。由于H.264/AVC中允许进行参考帧管理,使得时间分级可以直接利用这一特性得以实现。
这种预测方式的宏块信息完全由层间参考帧(一般是低分辨率的重建帧)通过上采样预测得到,在H.262/MPEG-2 Video, H.263, 和 MPEG-4等编码模式中也经常被用到,但是这种方式缺乏消除时间相关性所得到的码率削减。
ii. 层间宏块模式与运动预测(Inter-layer macroblock mode and motion prediction)
iii. 层间残差预测(Inter-layer residual prediction)
质量分级往往可以被认为是一种特殊(解析度相同)的空间分级编码,因此传统的coarse-grain quality scalable coding (CGS,粗粒度质量分级编码)很容易被想到,而在实际应用中,还发展了medium-grain quality scalability (MGS,中等粒度质量分级编码),下面将分别描述他们:
i. CGS
CGS有类似空间分级中层间预测,但是无需有上采样的过程,为了更好的视频质量需要呈现更多的图像纹理,因此,在质量分层的层间预测中,对纹理的提纯通常通过采用更小量化步长的重新量化。为了减少计算复杂性,用于层间intra预测的参考帧deblocking被忽略,而且层间intra预测和层间残差预测将在DCT系数阶段被直接处理。
ii. MGS
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系统基本可以达到实时。
- H.264/svc入门
- SVC H.264
- H.264 SVC
- NS2中H.264/SVC评估(框架)
- H.264 SVC 与H.264 AVC 有什么区别?
- Tutorial: The H.264 Scalable Video Codec (SVC)
- H.264 SVC的三种Inter Layer Prediction模式
- 理解H.264 SVC的MGS 之 结构篇
- H.264 SVC标准流程图--来自中华视频网
- SVC入门(1)
- 关于问号文章“理解H.264 SVC的MGS 之 结构篇”中的一点问题
- NS2上如何利用无线网络组播H.264/SVC视频
- NS2上如何在有线网络中组播H.264/SVC视频
- SVC入门(2)- Temporal Scalability of SVC
- SVC学习小结-SVC入门知识和JSVM基础实验
- svc
- svc
- H.264入门
- Kle增加参数的方法
- @synthesize obj=_obj的意义详解 @property和@synthesize
- 趋势科技移动客户端病毒报告
- Android入门第十三篇之Gallery + ImageSwitcher .
- exploded archive(development mode) 和Packaged Archive(production mode)
- H.264/svc入门
- C/C++项目通用Makefile
- [centos5.8] centos5.8 安装配置smokeping 2.4.2
- 基于数据挖掘的客户细分在差异化营销中的作用
- 编译安装lamp详解
- 淘宝开源Web服务器Tengine基本安装步骤
- 在Flex组件外观实施中使用Scale9 九宫格
- 简明H.264率失真分析概念
- Win7下抓包工具安装坎坷