ffmpeg解码器优化
????? 為了解決這個問題,擬將source和decoder寫成一個filter,避免filter間傳輸可能導(dǎo)致的幀間緩沖延遲,這樣就不得不研究開源的H.264 decoder軟件。這段時間,一直埋頭研究ffmpeg中的h.264 decoder源碼。對于新手來說,還是挺有挑戰(zhàn)性的,因?yàn)橐曨l播放框架基于directShow,必須在VC環(huán)境下開發(fā),而ffmpeg源碼卻采用VC不支持的C99標(biāo)準(zhǔn),ffmpeg的API庫無法直接編譯使用。
我的工作計(jì)劃,可以劃分為三個階段:第一階段是從網(wǎng)上下載了ffmpeg工程組成員hust_xcl從ffmpeg中剝離的H.264解碼器包,可以完全基于VC編譯和運(yùn)行。通過它驗(yàn)證了采用ffmpeg的H.264 decoder,以緊耦合方式調(diào)用播放,沒有幀間延遲。雖然解決了穩(wěn)定性,但是視頻質(zhì)量稍差,并且性能低,在我的雙核N卡機(jī)子上解碼D1只能達(dá)到110fps。經(jīng)過分析,覺得是源碼版本過于陳舊,而且不支持CPU加速指令。其間,還試驗(yàn)了hax264和ffdshow-tryout中的VC工程源碼,視頻質(zhì)量有所改善,但是性能方面改善有限,解碼D1提高到130fps。
????? 在第二階段中,采用ffmpeg-0.5版,在mingw環(huán)境下采用gcc編譯,然后調(diào)用VC鏈接,生成可被VC所使用的動態(tài)庫。之所以這樣做,是因?yàn)閒fmpeg所帶的CPU匯編優(yōu)化指令,VC無法支持。gcc編譯器生成的文件明顯要比VC大,通過ffmpeg默認(rèn)編譯生成的libavcodec.dll文件居然有11M之多。只好在configure中增加許多限制選項(xiàng),找到一種合適的選項(xiàng)組合:
./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達(dá)到210fps,比第一階段提高了60%。
????? 雖然第二階段提高了不少,但與商業(yè)版解碼器相比,還是有明顯差距的。coreavc在同樣環(huán)境下,軟解可以達(dá)到300fps,在GT8600顯卡支持下的CUDA運(yùn)行模式更是高達(dá)360fps。第三階段還正在實(shí)施中,基于當(dāng)前的ffmpeg-mt源碼進(jìn)行,CPU加速指令不僅可以升級到SSE4.2,而且支持多核處理,性能將會更上一個臺階。
???? 開源的東東雖然鼓搗起來經(jīng)常走彎路,缺乏穩(wěn)定可預(yù)測的開發(fā)環(huán)境,但是深入下去有時會有意想不到的成就感。
創(chuàng)作挑戰(zhàn)賽新人創(chuàng)作獎勵來咯,堅(jiān)持創(chuàng)作打卡瓜分現(xiàn)金大獎總結(jié)
以上是生活随笔為你收集整理的ffmpeg解码器优化的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 四舍六入五成双(四舍六入奇偶效验)银行家
- 下一篇: 巧妙喝水打败多种疾病