常见H.264视频编码器
X264(只有编码没有解码)是由Video LAN组织制作的,这个组织还制作了一款著名的开源媒体播放器VLC
JM的参考代码托管在hhi组织(德国的研究机构),我们可以在这个机构中获取JM最新的源代码。
最近经典的版本是JM8.6
,虽然没有包含最新的内容,但在开始阶段以及足够我们进行学习
JM基础配置
下载解压后用Visual Studio打开tml.sln
- ldecod——解码器
- lencod——编码器
将lencod设为启动项目
然后点击下方的属性,修改输出目录及工作目录
接下来重新生成项目
在bin目录下已生成lencod.exe
准备一个YUV视频
首先录一段视频,再使用ffmpeg将其转为yuv420p
ffmpeg -i srcVideo.mp4 -ss 00:00:00 -t 10 -s 1920x1080 -pix_fmt yuv420p srcVideo.yuv
该命令的作用是把所在路径下的srcVideo.mp4文件从第20秒开始,往下10秒,即20~30秒之间,截取这段时间的视频,把它转换为帧宽度为640,帧高度为272,像素格式为yuv420p的YUV文件:srcVideo.yuv。
然后放到bin目录下
JM实现编码
修改配置文件
在工作目录下,提供了三个config文件,表示三个profile的配置
本着由简单到复杂的原则,选择encoder_baseline.cfg
,复制一份,修改文件名为encoder.cfg
用notepad打开
这个文件,是我们在编码过程中所需要的一些配置信息
修改文件名
后面头的长度和StartFrame我们都保持不变。
FrameToBeEncoded表示需要编码的帧数,3帧有点少,我们改为10帧
后面的帧率日志文件输出文件等都保持不变
Encoder Control
- ProfileIDC——选择的profile
- IntraPeriod——若为0则只有第一帧为I帧,这里设置为1
- IDRIntraEnable——是否强制所有I帧为IDR关键帧,0关闭,1开启.
编译运行
这就是编码过程
编码完毕
上图可以看到,第一帧为IDR关键帧,其余都是I帧。总共编了10帧
这里是参数
test.264
,就是生成的H.264码流文件test_rec.yuv
是编码过程中重建的yuv图像trace_enc.txt
是日志文件,配置文件中关闭则文件没有内容
通过YUVPlayer将test_rec.yuv
同源yuv进行比较,就可以看出失真所在
以上就是通过JM对YUV格式的图像序列进行编码,生成一个符合H.264标准的码流的过程
JM实现解码
将ldecod
设置为启动项目,然后修改设置
和上面一样,将输出目录和工作目录设置为$(ProjectDir)bin
接着打开解码器的配置文件decoder.cfg
检查需要解码的码流文件、输出文件以及参考帧文件
由于是和编码的时候设置一致,此时就不需要修改
然后将解码的配置文件写道ldecod
的命令参数中
依次点击生成——清理解决方案
然后运行
解码完成
生成test_dec.yuv
如何判断编码解码是否正确
将解码后的图像与编码时重建的图像进行比对
只有这两个是一致的,那么我们所做的编解码才是匹配的
从第一帧一直比对到最后一帧,全部相同。
则编解码的过程是正确的,即编解码匹配