1. 程式人生 > >H.264之幾種開源解碼器的對比評測

H.264之幾種開源解碼器的對比評測

20035月,當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特性的支援、解碼速度以及二次開發難易程度。

一、H.264開源解碼器介紹

1JM decoder

JM decoderH.264的官方原始碼,通常也稱為校驗模型。其特點是支援特性好,實用性差。本文選用的程式是JM86,不支援high profile,因為本文不對high profile部分進行實驗比較。

NOTE: JM一直沒有做實用化方面的努力,所以其解碼速度代表的是2003年的水平。

2T264 decoder

T264是國內的開源專案,T264 decoder的程式做過彙編優化,速度還可以,但只能解T264本身的碼流。作者對T264 decoder version 0.14

2005-3-29)作了修改,支援baseline的解碼。

3x264 decoder

x264本沒有decoder,但其包含decoder的部分函式雛形,猜想作者在一開始時是準備實現decoder,後來可能是因為有了ffmpeg,就放棄了這個想法(純粹屬於猜測,呵呵)。

本文的x264 decoder是作者在x264 svn check out 2005.12.26的基礎上實現的,支援baseline的解碼。

4ffmpeg libavcodec

ffmpeg是一個大專案,它包含各種音視訊標準的codec,還支援各類file format.avi, .mp4, .mkv and etc

)的parsing。所以,很多開源專案都有直接或間接地採用了ffmpeg,如mplayer播放器就是直接採用了ffmpeg,而mpc播放器則是先採用了ffdshow filter,而ffdshow又採用了ffmpegffmpeg是一個非常棒的音視訊編解碼庫,支援的標準非常全,而且編解碼速度也很快。

本文實驗採用的是cvs check out 2006.02.20的版本,作者對其中的apiexample demo進行了簡單的修改,用於解碼h.264碼流

5Intel IPP simple player

IntelIPP庫,全稱為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特性的支援

1JM86 decoder

support baseline, extended, main profile

2T264 decoder

baseline

3x264 decodeer

baseline

4ffmpeg libavcodec

support baseline, main profile, high profile except the feature: paff, mbaff…

5Intel IPP simple player

support baseline and main profile

三、評測條件

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

量化步長:2636

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: 是否儲存重建序列對於解碼速度的影響很大)

四、解碼速度比較結果

待補充完整。。。

解碼速度比較(單位: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 decoderx264 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 player90fps

x264 decoder50fps

t264 decoder30fps

jm86 decoder3fps

五、程式開發上的比較

我估計閱讀本文的大部分讀者都是搞開發的,因此,閱讀過程中自然會思考如何在程式開發上借鑑或者採用以上開源的H.264解碼器,下面就針對程式開發上的難易、適用場合等作個比較。

1JM86 decoder

適合寫paper群體

2T264 decoder

3x264 decodeer

兩者程式碼非常相似,所以就合在一起講了。這兩個原始碼的程式結構都比較清晰,支援vcgcc的編譯環境,但對H.264的特性支援不好,解碼速度和ffmpeg相比,還有差距。

4ffmpeg libavcodec

程式結構比較差,H.264解碼的程式碼基本上在h264.c一個檔案中,這個檔案有8000多行,不利於閱讀。

編譯環境為gccMinGW,移植到vc下比較難(我嘗試過)。

解碼速度快(BTW: 通過doom9論壇瞭解到,目前最快的h.264解碼器是CoreAVC decoder,比ffmpeg50%左右)。

對於H.264特性的支援好。

5Intel IPP simple player

分兩個方面講:

aIPP

我覺得是非常棒的,但實現的是H.264解碼(IPP中也有H.264編碼)的一些關鍵函式,如deblockdct,插值補償等,不能直接拿來用。

其它的缺點:IPP庫是商業軟體,要money的,而且只支援Intel平臺

bsimple player

開源,用c++寫的,而且是directshow程式設計,也就是說只支援windows平臺。

其解碼速度比ffmpeg10%左右,我覺得原因不在於IPP庫,而是simple player的程式碼不夠完善。

謹以本文對所有參與過H.264開源專案的開發者致以滔滔江水連綿不絕的敬意之情。