实验内容
- 调试JM18.6 H264编解码器,将输入的Annex B格式码流解码至YUV文件
- 调整编码器参数,将解码后的YUV文件编码至不同格式的H.264文件
- 用码流分析软件检查所生成的码流中各种编码模式和运动矢量等信息
- 用播放器观看所生成码流的质量
- 生成率失真曲线
实验过程及结果
解码.264文件(Annex B码流)至YUV 420文件
在H.264中,编码后的比特流将被NAL( Network Abstraction Layer)打包形成NAL Unity:
NAL Unity由一个字节的头部和有效载荷组成,可以被单独的解析和处理,包含1字节的头部和有效载荷:
H.264码流的Annex B格式由NAL Unity数据加开始前缀组成。其开始前缀为2个或者3个0x00,后面再加一个0x01。此外,为了防止NALU载荷中出现开始前缀,需要对其进行防竞争处理,通过在0x01前插入防竞争字节0x03实现,将0x000001变成0x00000301。
更为详细的Annex B码流格式可参考:字节流格式(Annex B)和RTP格式流浅析
使用ffmpeg将.mp4文件转换至.264格式的Annex B Byte Stream Format,命令:
ffmpeg -i test1.mp4 -codec copy -bsf:v h264_mp4toannexb test1.264
转换结果:
使用JM H264编解码器中的解码器部分将两段文件解码至YUV文件,使用解码器时,需要修改解码器配置文件中以下两项以指定输入输出文件:
InputFile = "test2.264" # H.264/AVC coded bitstream
OutputFile = "test2_dec.yuv" # Output file, YUV/RGB
解码结果:
将解码后的YUV文件编码至不同格式的H.264文件
视频编码帧主要分为三种:
I(Intra frame)帧:帧内编码帧,仅利用该帧图象本身信息进行编码,数据率最大。
P(Predictive-coded frame )帧:前向预测编码帧,根据前面最靠近的I帧或者另一个P帧进行预测,属于前向预测,数据率小于I帧
B(Bidirectionally predictive-coded frame)帧:双向预测编码帧,它既用过去的帧作基准,也用未来的帧作基准,即前向和后向预测都有,数据率最小。
图像组GOP(group of pictures)
图像组是将一个图像序列中连续的几个不同编码帧种类的图像组成一个小组,简称为GOP。一个GOP中通常只包含1个I帧。
在相同码率的情况下,GOP越长,图像质量越高(P、B帧可分配到更多比特);在相同图像质量的情况下,GOP越长,码率越低(高码率的I帧少)。
在JM H264编解码器中,调整GOP需要设置cfg文件中的如下参数:
IntraPeriod = 0 # Period of I-pictures (0=only first) I帧周期&