1. 程式人生 > >讓ffmpeg支援輸出h264格式

讓ffmpeg支援輸出h264格式

預設輸出視訊會報錯:
[email protected]:/var/www/wavtest$ ffmpeg -i test.wav -ab 128k test.mp3
FFmpeg version 0.5-svn17737+3:0.svn20090303-1ubuntu6.2, Copyright (c) 2000-2009 Fabrice Bellard, et al.
configuration: --enable-gpl --enable-postproc --enable-swscale --enable-x11grab --extra-version=svn17737+3:0.svn20090303-1ubuntu6.2 --prefix=/usr --enable-avfilter --enable-avfilter-lavf --enable-libgsm --enable-libschroedinger --enable-libspeex --enable-libtheora --enable-libvorbis --enable-pthreads --disable-stripping --disable-vhook --enable-libdc1394 --disable-armv5te --disable-armv6 --disable-armv6t2 --disable-armvfp --disable-neon --disable-altivec --disable-vis --enable-shared --disable-static
libavutil 49.15. 0 / 49.15. 0
libavcodec 52.20. 0 / 52.20. 0
libavformat 52.31. 0 / 52.31. 0
libavdevice 52. 1. 0 / 52. 1. 0
libavfilter 0. 4. 0 / 0. 4. 0
libswscale 0. 7. 1 / 0. 7. 1
libpostproc 51. 2. 0 / 51. 2. 0
built on Apr 23 2010 15:08:34, gcc: 4.3.3
Input #0, wav, from 'test.wav':
Duration: 00:00:07.55, bitrate: 88 kb/s
Stream #0.0: Audio: pcm_u8, 11025 Hz, mono, s16, 88 kb/s
Output #0, mp3, to 'test.mp3':
Stream #0.0: Audio: 0x0000, 11025 Hz, mono, s16, 128 kb/s
Stream mapping:
Stream #0.0 -> #0.0
Unsupported codec for output stream #0.0

轉載內容:
ffmpeg安裝第三方編碼器(encoder)庫
關鍵詞:ffmpeg、編碼h264、第三方encoder
安裝好了ffmpeg後,如果你使用ffmpeg工具去把某個視訊檔案轉成h264視訊編碼、mp3音訊編碼or其他ffmpeg自身不帶的xxx編碼型別,就會看到報錯資訊,unknown encoder 'xxx'。此刻你需要的只要去安裝其他的編碼器就行了,本質上其實是把其他的編碼器以庫的形式安裝好,例如,把正確的libx264.so or libx264.a存放在/usr/lib下 or /usr/local/lib下。
舉兩個例子吧,視訊方面的編碼器就拿h264來說,音訊方面的例子就拿mp3(mp3lame)來說。
掃盲,Linux下安裝一個正規的軟體,一般都是三部曲,①、【./configure】(加一些可能的引數,比如enable一些功能,disable一些功能,究竟有哪些功能可以開啟和關閉呢?一般通過./configure --help命令來查詢),②、【make】(編譯),③、【sudo make install】(把生成的二進位制應用程式檔案和.so和.a複製到/usr/local/下)
一、h264
動手搜一下ffmpeg的工程程式碼庫,會發現每個codec都有一下幾個成員變數,但是有好幾個codec缺少encoder,h264就是其中一個了。先不管什麼原因,ffmpeg沒有原生的支援h264,但是你可以檢視一下avcodec_register_all這個API,會發現一大片的REGISTER_ENCODER(XXX, xxx)
REGISTER_DECODER(XXX, xxx)
這裡分很多塊,例如/* video codecs */,/* audio codecs */,/* external libraries */
但是你在/* video codecs */這一塊卻看不到h264的REGISTER_ENDECODER (H264, h264);這句話,如果你堅持往下翻,你會在/* external libraries */這塊裡面發現REGISTER_ENCODER (LIBX264, libx264);所以ffmpeg是有給h264準備好了介面的,但是需要第三方庫來支援。
回到重點,怎麼裝呢?
1.先下載x264的工程程式碼,【git clone git://git.videolan.org/x264.git】。
2.進入x264目錄,然後./configure --help看看它的幫助資訊,我們這裡需要的是x264以.so or .a的形式來支援ffmpeg,所以一般就關注shared和static關鍵詞就可以了。執行./configure --enable-shared --enable-static就行了。
3.完了make && sudo make install就可以了。
你會發現我們在./configure的時候沒有指定字首--prefix=/usr,很明顯,libx264.so和libx264.a就會複製到/usr/local/lib下去,記住這裡,等下會因為這裡要做一些修改。
二、mp3lame
上面說了h264,相信mp3lame理解起來就簡單多了。
1.先下載mp3lame的工程程式碼,http://sourceforge.net/projects/lame/files/lame/,為什麼這裡要顯得多餘的講一下mp3lame呢,是這樣的。大家可以看到x264用的是git,mp3lame是用的sourceforge,不妨再多說一個faac(也是一種原生ffmpeg不支援的音訊codec),faac用的是http://sourceforge.net/projects/faac/files/faac-src/,所以每一種codec或者很重要的軟體都有一個團隊或者社群在維護,所以需要什麼東西,儘量去sourceforge或者git上找,其他地方找的可能不夠新,可能不完整不正確。
2.然後也是./configure --help先,看看哪些功能是我們需要開啟關閉的
3.完了make && sudo make install就可以了。
很明顯,我們又沒有指定--prefix-/usr,所以mp3lame的libmp3lame.so和libmp3lame.a就被賦值到了/usr/local/lib下了。

三、重新編譯ffmpeg
1.進入ffmpeg目錄,./configure --enable-gpl --enable-libx264 --enable-libmp3lame,然後就生成了新的makefile了。
2.執行sudo make clean && make sudo make install。
3.這樣ffmpeg就被重新編譯了,完了就可以驗證一下,使用ffmpeg工具,把某個視訊檔案中的視訊流轉碼成h264格式,音訊流轉碼成mp3lame格式,不妨試試。
4.如果你真的嘗試了,你應該會看到類似於“libxxx.so找不到”的錯誤提示,解決辦法如下:
(1).表象:ffmpeg執行的時候試圖去連結libxxx.so,但是卻找不到相應的libxxx.so。
(2).疑惑:我之前明明安裝了libxxx.so的。
(3).原因:程式執行的時候預設是去/usr/lib下找libxxx.so,但是我們之前安裝的確實在/usr/local/lib下,所以造成這個報錯。
(4).解決辦法:有很多,我說一種我親測過的。
在/etc/ld.so.conf檔案中新增一行/etc/ld.so.conf,當然是用root使用者啦。然後執行ldconfig命令使得剛才的修改生效,完了再執行ffmpeg的轉碼命令試試,可以了吧。

之前我嘗試過用ffplay來播放一個h264編碼的視訊,結果當然是可以播放,我就天真的以為ffmpeg支援h264了,其實不然,ffmpeg主要還是用來解碼,所以部分格式的encoder卻沒有,所以才會有第三方庫支援,為什麼原生ffmpeg不支援某些格式呢?原因我暫時不知道。為了解決ffmpeg可以編碼h264這個問題,我在網上搜索一些資料,然後總結成上文,在此過程中我還收穫了一些Linux的知識,也已經寫出。

參考資料:
http://hi.baidu.com/y11022053/item/6d4c34ba87c7b5f362388e9a
http://www.cnblogs.com/MikeZhang/archive/2012/07/21/installFFmpegFromSourceCode.html

LINUX下ffmpeg安裝:
http://wenku.baidu.com/view/59aa8dafdd3383c4bb4cd2cf

X264編碼下載地址:
http://www.videolan.org/developers/x264.html

ffmpeg 引數說明
http://deleak.com/blog/wp-content/uploads/2010/09/ffmpeg-options.html

ffmpeg使用x264的使用配置:
http://www.php-oa.com/2009/03/09/ffmpeg_x264.html

mencoder的使用
http://ivarptr.blogspot.hk/2010/11/ubuntuh264mp4.html
http://www.360doc.com/content/10/0513/15/551936_27394082.shtml
http://www.mplayerhq.hu/DOCS/HTML/zh_CN/mencoder.html