实验目的
将自行选择或老师给的两个264文件进行解码,得到相应的YUV文件。
将两个视频序列编码为.264文件。
□固定码率,以不同的GOP长度及形状编码
■ GOP=15,2B帧;GOP=12,2B帧,GOP=9,2B帧
■ GOP=4,1B帧;GOP=12,无B帧;GOP=1,全I帧
□相同的GOP长度及形状,不同的码率
■ 例:1000kb/s, 800kb/s,400kb/s,…
用码流分析软件检查所生成的码流中各种编码模式和运动矢量等信息。
用播放器观看所生成码流的质量,生成率失真曲线
实验原理
H.264编解码框图
编码器:
解码器:
实验内容
准备文件
运用两个mp4文件,转换为.264文件
在线转换网址:
https://www.convertfiles.com/convert/video/
生成结果:
修改decoder.cfg
InputFile = "nxn.264" # H.264/AVC coded bitstream
OutputFile = "nxn.yuv" # Output file, YUV/RGB
解码264文件
运行命令:ldecod.exe -d decoder.cfg
可以解码文件
得到yuv文件
编码
固定码率 不同GOP和形状编码
配置
固定码率:1000000b/s
GOP长度和形象参数配置:
编号 | 值 |
---|---|
1 | GOP=15,2B帧 |
2 | GOP=12,2B帧 |
3 | GOP=9,2B帧 |
4 | GOP=4,1B帧 |
5 | GOP=12,无B帧 |
6 | GOP=1,全I帧 |
如以下参数配置:
- GOP=15
- 2B帧
则修改encoder.cfg如下:
# Files
InputFile = "nxn.yuv" # Input sequence
SourceWidth = 640 # Source frame width
SourceHeight = 360 # Source frame height
SourceResize = 0 # Resize source size for output
OutputWidth = 640 # Output frame width
OutputHeight = 360 # Output frame height
FramesToBeEncoded = 30 # Number of frames to be coded
ReconFile = "use1_reconstruct.yuv" # Reconstruction YUV file
OutputFile = "use1_1.264" # Bitstream
# Encoder Control
IntraPeriod = 15 # Period of I-pictures (0=only first)
# B Slices
NumberBFrames = 2 # Number of B coded frames inserted (0=not used)
测试
运行截图如下:
分别对应上述编码方式,可以看到,信噪比都在30以上,说明在相同码率(1000000b/s)的情况下,编码效果都还行,相比来说,只有GOP长度最短的第四次编码获得了最好的效果,PSNR>40。
相同GOP长度、形状、不同码率
配置
相同GOP配置。取上一部分中的代码中的配置,即GOP=15,2B帧
修改码率配置主要是要修代码中的:
RateControlEnable = 1 # 0 Disable, 1 Enable
Bitrate = 1000000 # Bitrate(bps)
码率配置测试如下:
编号 | 值 |
---|---|
1 | 800kb/s: |
2 | 600kb/s |
3 | 400kb/s |
4 | 200kb/s |
5 | 100kb/s |
测试结果
得到PSNR如下
从主观上可以判断,随着码率的减少 信噪比逐渐降低
率失真曲线
根据不同码率编码的测试结果,横坐标为码率,纵坐标为峰值信噪比PSNR,可以做出率失真曲线:
总结
- 码率和GOP都会对编码造成影响
- 虽然率失真曲线存在差异,PSNR数值也有不同,但是在主观感受上不同码率差异不大,也许是由于为了处理快捷,视频分辨率太低,以至于100kbps足以编码
- 应当采用更大的测试间隔或更高分辨率的视频测试