目录
任务一、将两个.264文件进行解码,得到相应的YUV文件
1.1 Decoder Syntax
参考JM使用手册,解码语法如下:
ldecod [-s] [-h] {[defdec.cfg] | {[-p pocScale][-i bitstream.264]…[-o output.yuv][-r reference.yuv] [-uv]}}
参数 | 含义 |
---|---|
-h | 打印参数使用方法 |
[defdec.cfg] | 可选解码器配置文件,其中包含所有解码器信息 |
-s | 无声解码 |
-i | 设置解码文件<bitstream.264> 。默认值设定为test.264 |
-o | 设置重建文件 <output.yuv>。默认值设定为test_dec.yuv |
-r | 用于PSNR计算的参考序列文件被设置为<reference.yuv>。默认为test_rec.yuv |
-p | 设置Poc量表,默认值为2 |
-uv | 输出灰度分量以,允许在420 YUV播放器上观看输出 |
Examples:
ldecod.exe
ldecod.exe -h
ldecod.exe default.cfg
ldecod.exe –s –i bitstream.264
ldecod.exe –i bitstream.264 –o output.yuv –r reference.yuv
ldecod.exe –i bitstream420.264 -uv
1.2 解码
将JM18.6下的ldecod.exe、decoder.cfg与要处理的.264文件放在同一目录下,利用cmd指令指定解码文件与解码得到的yuv文件名,完成解码;
ldecod.exe -i a.264 -o a.yuv
或者在文件decoder.cfg中对以下参数作出修改:
InputFile = "a.264" # H.264/AVC coded bitstream
OutputFile = "a.yuv" # Output file, YUV/RGB
再使用cmd指令完成解码。
ldecod.exe -d decoder.cfg
任务二:将上述两个视频序列编码为.264文件
2.1 Encoder Syntax
参考JM使用手册,编码语法如下:
lencod [-h] [-d defenc.cfg] {[-f curenc1.cfg]…[-f curencN.cfg]}
{[-p EncParam1=EncValue1]…[-p EncParamM=EncValueM]}
参数 | 含义 |
---|---|
-h | 打印参数使用方法 |
-d | 使用<defenc.cfg>作为参数初始化的默认文件。否则文件默认为本地目录中的“coder.cfg“ |
-f | 读取<curencM.cfg>以重置选定的编码器参数。 可以使用设置不同参数的多个文件 |
-p | 将参数设置为。 的条目不区分大小写 |
Examples:
lencod.exe
lencod.exe -h
lencod.exe -d default.cfg
lencod.exe -f curenc1.cfg
lencod.exe -f curenc1.cfg –p InputFile=“e:\data\container_qcif_30.yuv”\ -p SourceWidth=176 -p SourceHeight=144
lencod.exe -f curenc1.cfg -p FramesToBeEncoded=30 \ -p QPFirstFrame=28 -p QPRemainingFrame=28 -p QPBPicture=30
2.2 编码
2.2.1 固定码率,以不同的GOP长度及形状编码
GOP=15,2B帧;GOP=12,2B帧,GOP=9,2B帧
GOP=4,1B帧;GOP=12,无B帧;GOP=1,全I帧
将JM18.6下的lencod.exe、encoder.cfg与刚生成的yuv文件放在同一目录下。
以编码规格GOP15/2B,1000kbps为例,对文件encoder.cfg中的如下参数进行修改:
InputFile = "a.yuv" # Input sequence
FramesToBeEncoded = 30 # Number of frames to be coded
SourceWidth = 560 # Source frame width
SourceHeight = 314 # Source frame height
OutputWidth = 560 # Output frame width
OutputHeight = 314 # Output frame height
ReconFile = "a11_rec.yuv" # Reconstruction YUV file
OutputFile = "a11.264" # Bitstream
IntraPeriod = 15 # Period of I-pictures (0=only first)
NumberBFrames = 2 # Number of B coded frames inserted (0=not used)
HierarchicalCoding = 0 # B hierarchical coding (0= off, 1= 2 layers, 2= 2 full hierarchy, 3 = explicit)
RateControlEnable = 1 # 0 Disable, 1 Enable
Bitrate = 1000000 # Bitrate(bps)
RCUpdateMode = 0 # Rate Control type. Modes supported :
# 0 = original JM rate control,
# 1 = rate control that is applied to all frames regardless of the slice type,
# 2 = original plus intelligent QP selection for I and B slices (including Hierarchical),
# 3 = original + hybrid quadratic rate control for I and B slice using bit rate statistics
之后使用以下cmd指令完成编码。
lencod.exe -f encoder.cfg
现对encoder.cfg中的部分重要参数作出解释:
参数 | 解释 |
---|---|
FramesToBeEncoded | 指定要编码的帧数 |
IntraPeriod | 编码序列中I编码帧(非IDR)的最大周期 |
NumberBFrames | 使用B片编码的帧数。如果HierarchicalCoding设为3,则参数被覆盖(所以这里需要把HierarchicalCoding改为0) |
RateControlEnable | 启用简单的速率控制支持。默认值为0(禁用) |
RCUpdateMode | 指定速率控制算法。全I编码时设置为1,其余情况设置为0 |
Bitrate | 码率/bps |
Example: Encode a sequence at 100kbps, with an initial QP of 32,while performing adaptation at the frame level.
lencod.exe –p RateControlEnable=1 –p Bitrate=100000 \ –p InitialQP=32 –p BasicUnit=99
2.2.2 相同的GOP长度及形状,不同的码率
1000kb/s, 800kb/s,400kb/s
因为要生成多种编码规格的多个文件,每次都打开encoder.cfg修改参数会很麻烦,所以后续可以直接使用如下cmd指令完成编码。-p后设置的参数可以覆盖默认参考文件encoder.cfg中的相应参数。
lencod.exe -d encoder.cfg -p ReconFile= “…” -p OutputFile= “…” -p IntraPeriod=… -p NumberBFrames=… -p Bitrate=…
2.2.3 实验结果
以下为编码规格GOP15/2B,1000kbps的输出结果,可以看到Y-PSNR的值为39.553dB,实际码率为976312bps。
任务三:用码流分析软件检查所生成的码流中各种编码模式和运动矢量等信息
3.1 编码模式分析
H.264采用帧内预测编码和帧间预测编码结合的形式。
就帧内预测编码而言,H.264并不直接对图像块处理,而是根据邻近块的值来预测当前宏块的值,再对预测值和原始值的差值进行变换、量化和编码。每预测一个宏块,则重建一个宏块,重建值=预测值+残差,最新重建的宏块作为下一宏块预测的参考块。
使用H.264 visa打开码流文件,打开MB Rec,分析某一宏块:
Final是最终的重建值,Residual指残差,Predicted是预测值,观察发现:
- Pre-LoopFilter=Predicted+Residual
- Final与Pre-LoopFilter完全一样或有像素差2以内的细微差别
查阅资料可知,H.264解码器在解码后得到的图像一般会出现块效应,产生块效应的原因主要来自:
- DCT变换带来的量化误差
- 运动补偿
为了减少块效带来的影响,需要添加LoopFilter(环路滤波)调整相邻块边缘上的像素值以减轻视觉上的不连续感。
这里Pre-LoopFilter用来在编码时产生参考,也就是说,Pre-LoopFilter经过LoopFilter产生最终的重建值Final,Final可作为下一步预测的参考。
之后打开MB Blocks逐帧分析。视频流的第一帧一定是I帧,具体宏块类型(MB Type)有I_4x4,I_8x8,I_16x16。即I帧内只含有其中只含有I型宏块,根据画面内容变化从剧烈到平坦依次选用4x4,8x8,16x16的编码模式。
视频流中的P帧,含有I型宏块(粉色),和P型宏块(绿色),相较I帧,其编码方式不再局限于4x4,8x8,16x16,而是更加灵活。
这是因为P帧是前向预测编码帧,需要参考它之前的I帧或P帧进行编码,为了提高帧间预测编码时的编码效率,采用树状结构运动补偿技术(Tree Structured Motion Compensation)。即根据画面内容平坦程度,用不同形状和大小的块灵活划分区域,进行运动搜索。
视频流中的B帧,含有I型宏块(粉色),和B型宏块(蓝色)。B帧是双向预测编码帧,参考它前后的I帧或P帧编码,同样使用不同形状和大小的块进行运动补偿。
3.2 运动矢量分析
打开MB Motion Vectors分析运动矢量,这里运动矢量分为由后向预测得到的红色矢量和由前向预测得到的绿色矢量。
I帧中不含运动矢量,也就是说,I帧是帧内压缩编码帧,它不参考前向或后向的任何帧。
P帧中只含有绿色的运动矢量,这就验证了P帧是由前向预测得到的。同时运动矢量描述了物体运动的走向。
B帧中含有两种颜色的运动矢量,这就验证了B帧是通过双向预测得到的
任务四:用播放器观看所生成码流的质量
4.1 固定码率不同GOP
依序按照以下规格进行编码,码率固定为1000kbps
1.GOP=15,2B帧;2.GOP=12,2B帧,3.GOP=9,2B帧
4.GOP=4,1B帧;5.GOP=12,无B帧;6.GOP=1,全I帧
用H264Visa观看生成的码流,截取同一帧,按以上顺序排列:
对比图1、2、3可以发现:B帧数相同,GOP越长,图像质量越好
对比图2、5可以发现:相同GOP下,B帧数越少图像质量越好
全I帧编码下图像质量最差
4.2 相同GOP不同码率
编码规格为GOP15/2B,从左至右码率依次为1000kbps、800kbps、400kbps。
这里图像均较为模糊,肉眼不易区分其清晰度。
视频大小如下:
理论上讲,相同GOP下,视频码率越高,即代表视频容量越大,质量越好,越清晰。
任务五:生成率失真曲线
PSNR是"Peak Signal to Noise Ratio"的缩写,即峰值信噪比,是一种评价图像的客观标准。
记录码流的Y-PSNR/dB(实际生成的码率与理想值有少量差距,这里忽略不计):
观察可知,相同GOP结构下,码率越高,PSNR越大,即图像质量越好。
相同码率下,GOP越长,B帧数目越小,PSNR越大。
全I帧情况下的PSNR最小,图像质量最差。
这样的规律也与主观观察到的码流质量情况一致。