一、对264文件进行解码,得到相应的YUV文件
打开ldecod_vc10.vcxproj文件,修改decoder.cfg文件中的输入文件和输出文件。
InputFile = “demo.264” # H.264/AVC coded bitstream
OutputFile = “demo.yuv” # Output file, YUV/RGB
设置正确的工作路径,运行代码生成demo.yuv文件。
二、将上述视频序列编码为H.264文件
以上文中生成的demo.yuv作为实验材料。修改配置文件修改encoder.cfg。
(1)固定码率为800kbps,以不同的GOP长度及形状编码
GOP=15,2B帧,800kb/s;GOP=12,2B帧,800kb/s;GOP=9,2B帧,800kb/s
GOP=4,1B帧,800kb/s;GOP=12,无B帧,800kb/s;GOP=1,全I帧,800kb/s
(2)相同的GOP长度及形状,不同的码率
GOP=12,2B帧,1000kb/s;GOP=12,2B帧,800kb/s;GOP=12,2B帧,400kb/s
由于过程太多,此处仅以GOP=15,2B帧,800kb/s为例测试分析说明如下:
1.首先修改配置文件encoder.cfg的参数使之匹
...
##########################################################################################
# Files
##########################################################################################
InputFile = "demo.yuv" # Input sequence
InputHeaderLength = 0 # If the inputfile has a header, state it's length in byte here
StartFrame = 0 # Start frame for encoding. (0-N)
FramesToBeEncoded = 60 # Number of frames to be coded
...
SourceWidth = 854 # Source frame width
SourceHeight = 480 # Source frame height
SourceResize = 0 # Resize source size for output
OutputWidth = 854 # Output frame width
OutputHeight = 480 # Output frame height
...
ReconFile = "demo1.yuv" # Reconstruction YUV file
OutputFile = "demo1.264" # Bitstream
##########################################################################################
# Encoder Control
##########################################################################################
...
IntraPeriod = 60 # Period of I-pictures (0=only first)
...
##########################################################################################
# B Slices
##########################################################################################
NumberBFrames = 2 # Number of B coded frames inserted (0=not
disable, N <= NumberReferenceFrames)
...
HierarchicalCoding = 0 # B hierarchical coding (0= off, 1= 2 layers, 2= 2 full hierarchy, 3 = explicit)
...
Bitrate = 8000000 # Bitrate(bps)
实验结果:
2.用码流分析软件检查所生成的码流中各种编码模式和运动矢量等信息:
第一帧(I帧)的编码模式和运动矢量:
选取的是第一帧,按照分析来看,第一帧一定是帧内编码帧(I帧),在分析软件中分析时也确实如此。从图中,我们可以看到,宏块的类型MB Type为I_16X16_0_0_0,I_8X8和I_4X4。三个宏块都是I类型的宏块。同时,由于是I帧的原因,运动矢量并不存在。从上图中发现也确实如此。
第4帧(P帧)的编码模式和运动矢量:
由分析软件可知,Slice Type为P Slice,即该帧为前向预测帧(P帧),所以运动矢量应该是只有前向预测所得的运动矢量.
第2帧(B帧)的编码模式和运动矢量:
由分析软件可知,Slice_Type为B Slice,即该帧为双向预测帧(B帧),所以运动矢量应该有两种,一种是前向预测所得,一种是后向预测所得,拥有两种不同的运动矢量。
三、统计实验结果
事实上,用播放器播放时并没有特别大的差异。
利用表格中的数据作图得到:
matlab绘图:
x1=[1077,998,399];
y1=[40.773,40.453,37.772];
x2=[932,834,415];
y2=[39.541,39.371,39.355];
x3=[1033,841,400];
y3=[43.21,42.531,39.082];
x4=[1001,807,396];
y4=[43.119,41.978,37.982];
x5=[673,673,415];
y5=[38.172,38.172,36.945];
x6=[992,805,400];
y6=[35.871,34.872,32.401];
plot(x1,y1,'r',x2,y2,'g',x3,y3,'b',x4,y4,'y',x5,y5,'k',x6,y6,'c');
grid on;
xlabel('比特速率');
ylabel('PSNR');