h.264的入門(2)

試驗了一下別人的測試文件, 又找了一下各個解碼器的性能參數,以便確定用什麼來做移植比較好。

以前看到有人(http://www.hustmobile.com/chinese/)在SYMBIAN下用的FFMPEG做的移植,我從FFMPEG的中文論壇下了一個ff_h264_dec的包,

剛好能把他們的測試文件解開,用yuvtools3.0播放起來沒有什麼問題,

但是對比了一個這個團隊給的頭文件,發現比FFMPEG裏的頭文件裁剪了很多沒有用到的東西,

發現他們還是做了很多工作的。

 

用這個來裁剪,是一個選擇,因爲他們已經證實了在SYMBIAN下可以達到理想的效果。

 

另外:andriod的opencore裏有個h.264的庫,不大,也很清晰,但是也有些問題,裏面使用了一些unix相關的系統的調用,這個也是很討厭的,我的目標是首先移植到WIN32下,然後再移植到其他的平臺。

這個庫,本來就是在手機裏用的,所以ARM上運行應該沒有問題,所以這個一個優點,還有人號稱比FFMPEG的要快,不知道是不是真的。需要驗證。

 

選擇2:使用opencore。

 

 

下面轉載一個評測報告:

 

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.142005-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、所用測試序列

 

1 所用測試序列

分辨率

序列名稱

特點

編碼幀數

QCIF

foreman

紋理複雜度一般

運動劇烈:畫面人物和鏡頭均運動,還有場景的切換

300

CIF

foreman

同上

300

mthr_dotr

背景簡單

畫面人物運動幅度不大

100

mobile

紋理複雜度極高

運動形式豐富——畫面有多個運動物體,但各運動物體運動方向規則且平緩,鏡頭也在移動

200

D1(720*480)

soccer2

鏡頭有移動,畫面的足球運動員的運動也很劇烈

300

puppy

鏡頭無運動,畫面中的玩具小狗也只有簡單的運動

100

 

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

 

四、解碼速度比較結果

待補充完整。。。

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 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的代碼不夠完善。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章