2008年12月2日 星期二

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、所用测试序列

image

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

四、解码速度比较结果

image

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

0 意見:

張貼留言