試驗了一下別人的測試文件, 又找了一下各個解碼器的性能參數,以便確定用什麼來做移植比較好。
以前看到有人(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開源解碼器評測(轉發)
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特性的支持、解碼速度以及二次開發難易程度。
一、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(2005-3-29)作了修改,支持baseline的解碼。
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)的parsing。所以,很多開源項目都有直接或間接地採用了ffmpeg,如mplayer播放器就是直接採用了ffmpeg,而mpc播放器則是先採用了ffdshow filter,而ffdshow又採用了ffmpeg。ffmpeg是一個非常棒的音視頻編解碼庫,支持的標準非常全,而且編解碼速度也很快。
本文實驗採用的是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 |
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的代碼不夠完善。