H.264之幾種開源解碼器的對比評測
2003年5月,當H.264編碼標準草案發布時,很多人都覺得H.264太複雜,不宜實用。眨眼間3年過去了,以往的論斷、疑惑被如今的現實沖洗的乾乾淨淨。隨著硬體效能的提高和視訊編碼工作者對H.264的不斷優化,如今的H.264已完全實用,最新的達芬奇晶片上能實現D1解析度(720*480)視訊的實時編碼,而對於解碼,普通的PC機就能實現x264編碼的DVDrip電影的流暢播放。縱觀過去的三年,有多少人對H.264傾注了熱情和汗水才換來今天的成績,而那些H.264的開源專案以及參與這些專案的開發者自然是功不可沒。
本文評測的是作者接觸過的H.264開源解碼器,包括:JM decoder, T264 decoder, x264 decoder, ffmpeg libavcodec, Intel IPP simple player
一、H.264開源解碼器介紹
1、JM decoder
JM decoder是H.264的官方原始碼,通常也稱為校驗模型。其特點是支援特性好,實用性差。本文選用的程式是JM86,不支援high profile,因為本文不對high profile部分進行實驗比較。
NOTE: JM一直沒有做實用化方面的努力,所以其解碼速度代表的是2003年的水平。
2、T264 decoder
T264是國內的開源專案,T264 decoder的程式做過彙編優化,速度還可以,但只能解T264本身的碼流。作者對T264 decoder version 0.14
3、x264 decoder
x264本沒有decoder,但其包含decoder的部分函式雛形,猜想作者在一開始時是準備實現decoder,後來可能是因為有了ffmpeg,就放棄了這個想法(純粹屬於猜測,呵呵)。
本文的x264 decoder是作者在x264 svn check out 2005.12.26的基礎上實現的,支援baseline的解碼。
4、ffmpeg libavcodec
ffmpeg是一個大專案,它包含各種音視訊標準的codec,還支援各類file format(.avi, .mp4, .mkv and etc
本文實驗採用的是cvs check out 2006.02.20的版本,作者對其中的apiexample demo進行了簡單的修改,用於解碼h.264碼流
5、Intel IPP simple player
Intel的IPP庫,全稱為Integrated Performance Primitives,在Intel的各種處理器平臺(IA-32, Itanium, xscale and etc)上實現了訊號處理常用演算法、常用數學運算及音視訊編解碼演算法等等。IPP給我的第一感覺是,在Intel的處理器平臺上,它實現的各種演算法應該是最快的,至於實際結果如何,待等到實驗比較後見分曉。
本文采用的IPP庫版本為IA32 5.1.017 評估版
Intel IPP simple player是用於播放各種音視訊檔案的簡單播放器,用c++實用,具體演算法呼叫IPP庫來實現。本文采用的simple player版本是5.0.017
二、對於H.264特性的支援
1、JM86 decoder
support baseline, extended, main profile
2、T264 decoder
baseline
3、x264 decodeer
baseline
4、ffmpeg libavcodec
support baseline, main profile, high profile except the feature: paff, mbaff…
5、Intel IPP simple player
support baseline and main profile
三、評測條件
1、所用測試序列
表1 所用測試序列
解析度 |
序列名稱 |
特點 |
編碼幀數 |
QCIF |
foreman |
紋理複雜度一般 運動劇烈:畫面人物和鏡頭均運動,還有場景的切換 |
300 |
CIF |
foreman |
同上 |
300 |
mthr_dotr |
背景簡單 畫面人物運動幅度不大 |
100 |
|
mobile |
紋理複雜度極高 運動形式豐富——畫面有多個運動物體,但各運動物體運動方向規則且平緩,鏡頭也在移動 |
200 |
|
D1(720*480) |
soccer2 |
鏡頭有移動,畫面的足球運動員的運動也很劇烈 |
300 |
puppy |
鏡頭無運動,畫面中的玩具小狗也只有簡單的運動 |
100 |
(a) soccer2
(b) puppy
2、編碼引數
編碼程式:x264 svn check out 2006.05.06
引數設定示例:x264enc --frames 300 --no-cabac --qp 26 -o test.264 foreman.cif 352x288(相當於baseline)
量化步長:26和36
2、環境
CPU: Pentium4 2.4GHz, RAM: DDR 512M
OS: windows2000 professional+sp4
3、解碼器程式編譯環境
JM86 decoder: vc71 release
T264 decoder: vc71 release
x264 decodeer: vc71 release
ffmpeg libavcodec: MinGW
Intel IPP simple player: vc71 release + directX 9.0c sdk
4、解碼引數設定
不儲存重建序列(note: 是否儲存重建序列對於解碼速度的影響很大)
四、解碼速度比較結果
待補充完整。。。
表2 解碼速度比較(單位:fps)
解析度 |
序列名稱 |
量化步長 |
JM86 decoder |
x264 decodeer |
ffmpeg libavcodec |
QCIF |
foreman |
26 |
50fps左右 |
684.93 |
1196 |
36 |
874.64 |
1916.67 |
|||
CIF |
foreman |
26 |
15fps左右 |
168.44 |
303.86 |
36 |
190.11 |
503.37 |
|||
mthr_dotr |
26 |
182.82 |
421.28 |
||
36 |
200 |
634.62 |
|||
mobile |
26 |
129.28 |
190.07 |
||
36 |
173.01 |
353.46 |
|||
D1(720*480) |
soccer2 |
26 |
5fps左右 |
53.04 |
105.17 |
36 |
60.19 |
158.12 |
|||
puppy |
26 |
61.54 |
192.23 |
||
36 |
64.64 |
253.85 |
【note】
t264的解碼程式能解jm baseline的碼流,但無法解上面x264生成的碼流,故無法給出實驗結果。但通過對自身t264 fast mode碼流的解碼速度進行統計,t264 decoder和x264 decoder,解碼速度降低40%左右。
Intel IPP simple player在我的電腦上編譯未成功,在其它成功編譯的電腦(xp系統,directx, vs.net, IPP均安裝於C盤)上進行簡單測試,其解碼速度和ffmpeg的解碼速度相比,降低10%左右。
【簡單結論】
解碼速度:ffmpeg > IPP simple player > x264 decoder > t264 decoder > jm86 decoder
以ffmpeg的編碼速度為基準,假設為100fps,則:
IPP simple player:90fps
x264 decoder:50fps
t264 decoder:30fps
jm86 decoder:3fps
五、程式開發上的比較
我估計閱讀本文的大部分讀者都是搞開發的,因此,閱讀過程中自然會思考如何在程式開發上借鑑或者採用以上開源的H.264解碼器,下面就針對程式開發上的難易、適用場合等作個比較。
1、JM86 decoder
適合寫paper群體
2、T264 decoder
3、x264 decodeer
兩者程式碼非常相似,所以就合在一起講了。這兩個原始碼的程式結構都比較清晰,支援vc和gcc的編譯環境,但對H.264的特性支援不好,解碼速度和ffmpeg相比,還有差距。
4、ffmpeg libavcodec
程式結構比較差,H.264解碼的程式碼基本上在h264.c一個檔案中,這個檔案有8000多行,不利於閱讀。
編譯環境為gcc或MinGW,移植到vc下比較難(我嘗試過)。
解碼速度快(BTW: 通過doom9論壇瞭解到,目前最快的h.264解碼器是CoreAVC decoder,比ffmpeg快50%左右)。
對於H.264特性的支援好。
5、Intel IPP simple player
分兩個方面講:
(a)IPP庫
我覺得是非常棒的,但實現的是H.264解碼(IPP中也有H.264編碼)的一些關鍵函式,如deblock,dct,插值補償等,不能直接拿來用。
其它的缺點:IPP庫是商業軟體,要money的,而且只支援Intel平臺
(b)simple player
開源,用c++寫的,而且是directshow程式設計,也就是說只支援windows平臺。
其解碼速度比ffmpeg慢10%左右,我覺得原因不在於IPP庫,而是simple player的程式碼不夠完善。
謹以本文對所有參與過H.264開源專案的開發者致以滔滔江水連綿不絕的敬意之情。