实H.264是一种视频压缩标准,其只规定了符合标准的码流的格式,以及码流中各个语法元素的解析方法。
H.264标准并未规定编码器的实现或流程,产生了一些比较著名的开源H.264编解码器工程。其中H.264编码器中最著名的两个当属JM和X264,这二者都属于H.264编码标准的一种实现形式。
- JM
- JM通常被认为是H.264标准制定团队所认可的官方参考软件;
- 实现了H.264标准的全部特征;
- 运算过程较为复杂,而且没有采用汇编优化等加速方法,因此运行速度较慢,很难达到实时编解码。
- 常用于编解码技术的科学研究领域
- X264
- X264是另一个著名的H.264开源视频编码器,由开源组织VideoLan开发制定。
- X264是目前企业界应用最为广泛的开源编码器
- 相对于JM进行了大量的优化与简化,使其运行效率大幅提高,主要有对编码代价计算方法的简化以及添加了MMX、SSE汇编优化等部分;
- 实时性高、可用性高
X264源代码路径: https://www.videolan.org/developers/x264.html
JM下载
- JM的源代码: http://iphome.hhi.de/suehring/tml/download/ -> old_jm/->jm8.6.zip(使用最经典的学习,下载之后解压通过vs打开)
1、下载方式

(2)
(3)下载8.6
(4)解压之后使用visual studio打开
(5)删除不使用的工程rtpdump,将lencod设为启动项
(6)修改生成的路径到当前目录下的bin目录:右键->属性->输出目录->编辑
(7)将输出目录路径拷贝到调试的工作目录
2、编码YUV
- 编码工程设置为启动项
- 修改编码需要的配置文件:encoder_baseline.cfg->encoder.cfg(使用encoder.cfg,工程运行时会自动找这个文件)
#<39905>编码所需要的配置信息
##########################################################################################
# Files
##########################################################################################
InputFile = "foreman_part_qcif.yuv" # <39905>输入的YUV序列Input sequence, YUV 4:2:0
InputHeaderLength = 0 # If the inputfile has a header, state it's length in byte here
StartFrame = 0 # Start frame for encoding. (0-N)
FramesToBeEncoded = 3 # <39905>需要编码的帧数Number of frames to be coded
FrameRate = 30 # Frame Rate per second (1-100)
SourceWidth = 176 # <39905>输入视频的宽高Image width in Pels, must be multiple of 16
SourceHeight = 144 # Image height in Pels, must be multiple of 16
TraceFile = "trace_enc.txt"
ReconFile = "test_rec.yuv"
OutputFile = "test.264"
##########################################################################################
# Encoder Control
##########################################################################################
ProfileIDC = 66 # Profile IDC (66=baseline, 77=main, 88=extended)
LevelIDC = 30 # Level IDC (e.g. 20 = level 2.0)
IntraPeriod = 1 # <39905>1:输出仅I帧的码流Period of I-Frames (0=only first)
IDRIntraEnable = 0 # <39905> 1:强制所有I帧都是IDR关键帧Force IDR Intra (0=disable 1=enable)
- 生成lencod项目:右键->仅用于项目->仅生成lencod
- F5生成:
- test.264:表示生成的264文件
- test_rec.yuv:编码过程中重建的视频图像(和最初的比较,可以看出失真所在)
3、解码
- 解码配置文件:decoder.cfg
test.264 ........<39905>解码的码流文件H.264 coded bitstream
test_dec.yuv ........<39905>输出文件Output file, YUV 4:2:0 format
test_rec.yuv ........Ref sequence (for SNR)
10 ........Decoded Picture Buffer size
0 ........NAL mode (0=Annex B, 1: RTP packets)
0 ........SNR computation offset
1 ........Poc Scale (1 or 2)
500000 ........Rate_Decoder
104000 ........B_decoder
73000 ........F_decoder
leakybucketparam.cfg ........LeakyBucket Params
- 生成:test_dec.yuv(和编码时生成的中间YUV一样,表示无失真test_rec.yuv)