實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)