mencoder的命令列看起來有點嚇人,所以用ffmpeg。事實上,現在絕大部分的所謂轉換軟體都是基於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.mp3ffmpeg -i HYB-wish.wav -acodec libfaac -ab 192k -ac 2 HYB-wish.aacffmpeg -i HYB-wish.wav -acodec libamr_nb -ab 12.2k -ar 8000 -ac 1 HYB-wish-nb.amrffmpeg -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.3gpffmpeg -i samsung_mpeg4_aac_30.mp4 -vcodec h263p -r 30 -b 496k -s qvga -acodec copy samsung_h263p_aac_30.movffmpeg -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.mpgffmpeg -i mada_h264_aac_24.mp4 -vcodec h263 -s cif -r 24 -b 952k -acodec copy mada_h263_aac_24.3gpffmpeg -i mada_h264_aac_24.mp4 -vcodec h263p -s 480x272 -b 952k -r 24 -acodec copy mada_h263p_aac_24.movffmpeg -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,其他的一概不能相容。