使用ffmpeg來轉換media files

轉載自:http://www.cnblogs.com/super119/archive/2010/12/09/1901539.html

現在絕大部分的所謂轉換軟件都是基於ffmpeg的,mencoder也用的是ffmpeg。ffmpeg就是做mplayer的組織做的。所以,爲什麼很多軟件轉換不了某些文件和codec呢?就因爲ffmpeg不支持。比如:wmvv3(wmv9) encoding,ffmpeg現在不支持,所以,基本上現在能看到的轉換軟件都不支持,只能支持wmvv1(wmv7), wmvv2(wmv8)的decode和encode。  

 

以下是一些步驟和關鍵點:
1. 自己編譯ffmpeg。Ubuntu reposiroty中的ffmpeg功能不全(主要是看怎麼編譯的),比如由於沒有將libmp3lame引入,所以,Ubuntu官方repository中的ffmpeg是無法encode mp3的(只能encode mp2 -- mpeg 1 audio layer 2)。編譯ffmpeg很簡單,configure, make, sudo make install就OK了。主要是configure,看打開哪些支持,這次我做的是:

 

./configure --prefix=/usr --enable-gpl --enable-postproc --enable-nonfree --enable-pthreads --enable-x11grab --enable-libamr-nb --enable-libamr-wb --enable-libfaac --enable-libfaad --enable-libmp3lame --enable-libx264 --enable-libxvid --disable-armv5te --disable-armv6 --disable-armv6t2 --disable-armvfp

 

按照上面的命令行,要自己安裝faac, faad, libmp3lame, amrnb, amrwb, x264...。特別是要記得安裝這些包的dev版本,dev版本的包中才有頭文件。這裏也可以看出ffmpeg也不是每個decoder/encoder都是自己做的,也依賴很多其他的項目。比如x264,這是VLC player那個組織做的,用於H264的encoder/decoder。

 

2. 然後就是使用ffmpeg了。可以非常方便的轉換媒體文件,比如:
ffmpeg -i HYB-wish.wav -acodec libmp3lame -ab 192k -ac 2 HYB-wish.mp3
ffmpeg -i HYB-wish.wav -acodec libfaac -ab 192k -ac 2 HYB-wish.aac
ffmpeg -i HYB-wish.wav -acodec libamr_nb -ab 12.2k -ar 8000 -ac 1 HYB-wish-nb.amr
ffmpeg -i HYB-wish.wav -acodec libamr_wb -ab 23.85k -ar 16000 -ac 1 HYB-wish-wb.amr

 

看ffmpeg的manual就可以知道這些參數的含義,非常簡單:-i -- input file; -acodec -- 指定audio codec,用ffmpeg -formats命令可以看到當前編譯的ffmpeg支持的所有file formats和codec;-ab -- bitrate,主要數字後面要帶一個k,否則無效;-ac 指定channel數;-ar 指定sample rate,注意amrnb是8000,amrwb是16000,普通的是44100/48000。最後一個參數就是輸出文件的名字,ffmpeg會根據擴展名來檢測我們要轉換成什麼file format,也可以用-f option來明確指定output file format。

 

3. 轉換video:
# 只轉換14400幀 -- 24fps,所以這是10分鐘,也就是將input mp4的前十分鐘導出
ffmpeg -i mada2_h264_aac_24.mp4 -vcodec copy -vframes 14400 -acodec copy mada_h264_aac_24.mp4
# -s: size; -r fps; -b bitrate; "copy" means 不轉換,純拷貝
ffmpeg -i samsung_mpeg4_aac_30.mp4 -vcodec h263 -s cif -r 30 -b 496k -acodec copy samsung_h263_aac_30.3gp
ffmpeg -i samsung_mpeg4_aac_30.mp4 -vcodec h263p -r 30 -b 496k -s qvga -acodec copy samsung_h263p_aac_30.mov
ffmpeg -i samsung_mpeg4_aac_30.mp4 -vcodec libx264 -s qvga -r 30 -b 496k -acodec copy samsung_h264_aac_30.mp4
# ffmpeg -i samsung_mpeg4_aac_30.mp4 -vcodec mpeg2video -s qvga -r 30 -b 496k -acodec libmp3lame -ab 192k -ac 2 samsung_mpeg2_mp3_30.mpg
ffmpeg -i mada_h264_aac_24.mp4 -vcodec h263 -s cif -r 24 -b 952k -acodec copy mada_h263_aac_24.3gp
ffmpeg -i mada_h264_aac_24.mp4 -vcodec h263p -s 480x272 -b 952k -r 24 -acodec copy mada_h263p_aac_24.mov
ffmpeg -i mada_h264_aac_24.mp4 -vcodec mpeg4 -s 480x272 -r 24 -b 952k -acodec copy mada_mpeg4_aac_24.mp4
# ffmpeg -i mada_h264_aac_24.mp4 -vcodec mpeg2video -s 480x272 -b 952k -r 24 -acodec libmp3lame -ac 2 -ab 192k mada_mpeg2_mp3_24.mpg

 

還有兩點注意:
1. 不同的codec支持的video size是不一樣的。比如h263是不支持qvga(320x240)的。如果設置錯了也沒關係,ffmpeg會提示,而且會打印出h263支持的所有video size大小。如果Audio轉換的參數給錯了,ffmpeg也會打印原因和提示信息,非常的不錯。

 

2. 不同的file format對能放入其中的codec也是有要求的。比如mp4就不能放入h263/mp3。所以上面轉成h263的時候,輸出文件都是3gp。如果file format給錯了,ffmpeg的出錯信息是:[ <file format> <function address>]: could not find tag......

 

基本上就是這樣了。ffmpeg還是非常好用的,特別是用來轉換不同的media file和codec。參考ffmpeg的manual可以查閱每個參數的解釋。
不過ffmpeg現在也是有很多問題的:比如很多的codec現在還是不支持,像wmvv3(wmv9), wmav3(wma9)等。還有很多codec只提供了decoder,沒有提供encoder。這對於轉換來說也非常痛苦,對於播放倒是沒什麼。還有一些bug,比如上面命令行中,轉換到h263p的時候,如果輸出文件格式給定的是3gp,就會出錯說could not find tag...,事實上,3gp中是可以放入h263p的,m.youtube.com上的3gp就是h263++/amr。所以,上面用mov來代替了。

 

BTW:如果要轉換成wma/wmv的話,前面說了,如果是wmav1, wmav2, wmvv1, wmvv2(也就是wma7, wma8, wmv7, wmv8),使用ffmpeg就可以搞定。但是如果是wmav3, wmvv3(wma9, wmv9)的話,就只能用微軟的windows media encoder了。windows media encoder要求輸入文件是bmp, jpg, mp3, wav, mpg, avi, wmv, wma, asf,其他的一概不能兼容。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章