????? 為了解決這個問題,擬將source和decoder寫成一個filter,避免filter間傳輸可能導致的幀間緩沖延遲,這樣就不得不研究開源的H.264 decoder軟件。這段時間,一直埋頭研究ffmpeg中的h.264 decoder源碼。對于新手來說,還是挺有挑戰性的,因為視頻播放框架基于directShow,必須在VC環境下開發,而ffmpeg源碼卻采用VC不支持的C99標準,ffmpeg的API庫無法直接編譯使用。
我的工作計劃,可以劃分為三個階段:第一階段是從網上下載了ffmpeg工程組成員hust_xcl從ffmpeg中剝離的H.264解碼器包,可以完全基于VC編譯和運行。通過它驗證了采用ffmpeg的H.264 decoder,以緊耦合方式調用播放,沒有幀間延遲。雖然解決了穩定性,但是視頻質量稍差,并且性能低,在我的雙核N卡機子上解碼D1只能達到110fps。經過分析,覺得是源碼版本過于陳舊,而且不支持CPU加速指令。其間,還試驗了hax264和ffdshow-tryout中的VC工程源碼,視頻質量有所改善,但是性能方面改善有限,解碼D1提高到130fps。
????? 在第二階段中,采用ffmpeg-0.5版,在mingw環境下采用gcc編譯,然后調用VC鏈接,生成可被VC所使用的動態庫。之所以這樣做,是因為ffmpeg所帶的CPU匯編優化指令,VC無法支持。gcc編譯器生成的文件明顯要比VC大,通過ffmpeg默認編譯生成的libavcodec.dll文件居然有11M之多。只好在configure中增加許多限制選項,找到一種合適的選項組合:
./configure? --disable-static --enable-shared --enable-memalign-hack --disable-debug --disable-network --disable-vhook --disable-muxers --disable-mpegaudio-hp --disable-ffserver --disable-ffplay --disable-filters --disable-devices --disable-protocols --disable-demuxers --disable-muxers --disable-encoders --disable-decoders --disable-parsers --disable-bsfs --enable-decoder=h264
通過以上方式所生成的libavcodec.dll減小到1.6MB,性能方面也顯著提高,在SSE3指令加速下,解碼D1達到210fps,比第一階段提高了60%。
????? 雖然第二階段提高了不少,但與商業版解碼器相比,還是有明顯差距的。coreavc在同樣環境下,軟解可以達到300fps,在GT8600顯卡支持下的CUDA運行模式更是高達360fps。第三階段還正在實施中,基于當前的ffmpeg-mt源碼進行,CPU加速指令不僅可以升級到SSE4.2,而且支持多核處理,性能將會更上一個臺階。
???? 開源的東東雖然鼓搗起來經常走彎路,缺乏穩定可預測的開發環境,但是深入下去有時會有意想不到的成就感。