2012年5月5日 星期六

[ffmpeg]轉檔 mp4 (x264 + aac)

有鑑於目前,公認最流行的影片格式是 mp4 ( h.264 + aac )(需要證據),所以我也使用這個格式來儲存新的影片。

mp4 其實算是一種影音容器,在影片部份的編碼可以使用 MPEG 4 或 MPEG AVC (也就是所謂的 h.264,由VideoLan組織寫好的編碼器叫 x264,因此我的標題是寫 x264),在聲音部份的編碼使用 aac。

以 Canon G11 錄下來的影音為 MOV 容器,影像就是 h.264,然聲音部份是 PCM,所以檔案大很多。

在轉檔的部份,vlc 在目前的版本 2.0.1 還沒好很好的轉換。而 ffmpeg 使用了 x264 編碼器及它內建的實驗的 aac 編碼器,我試用過還不錯。所以我用的 ffmpeg 的參數如下:

ffmpeg.exe -y -i 來源檔 -filter:v yadif -acodec aac -ar 44100 -ab 128k -ac 2 -vcodec libx264 -preset slow -crf 20 -async 512 -strict -2 -threads 1 輸出檔

參數說明:

-y 是指覆蓋舊檔,如果有的話
-filter:v yadif 效果如同之前的 deinterlace,沒加的話,我的經驗是顏色會怪怪的
-acodec aac -ar 44100 -ab 128k -ac 2 是說聲音部份用 aac 編碼,採樣 44100 赫茲,聲音頻寬128k,2 聲道
-vcodec libx264 -preset slow -crf 20 是指影像部份用 x264 編碼,使用慢速組態(我想要好一點的畫質),-crf 20 是想要品質固定為優先。
-async 512 是說影音部份的同步,每 512 個聲音採樣就對齊一次
-strict –2 有這個才能使用 aac 編碼,因為目前還在實驗中才會需要這個參數
-threads 1 指定只用一個 thread,這樣在雙核電腦、作業系統為 win 時,只用 25% 的 cpu。因為我的電腦容易熱當,所以用這方式降速,這參數放在 –i 的前面反而無作用。如果沒熱當問題,拿這此參數或指定高一點的數字可以加速編碼時間。

在我喜歡用 python 來幫我輸入參數,因此使用以下的程式來幫忙:

def transcode(inputfile, inputfolder, outfolder):
    exepath = os.path.abspath(u"D:/bin/ffmpeg-20120426-git-a4b58fd-win64-shared/bin/ffmpeg.exe")
    inputfilepath = os.path.join(unicode(inputfolder),unicode(inputfile))
    outputfilepath = os.path.join(unicode(outputfolder),'%s.m4v' % unicode(inputfile))
    cmd = u"%s -y -i \"%s\" -filter:v yadif -acodec aac -ar 44100 -ab 128k -ac 2 -vcodec libx264 -preset slow -crf 20 -async 512 -strict -2 -threads 1 \"%s\"" % (exepath,inputfilepath,outputfilepath)
    os.system(cmd.encode('cp950'))

for i in os.listdir(mov_folder):
    transcode( i, mov_folder, mov_folder)

這樣就很方便了。

想要用圖形介面的人,也可以使用 Handbrake,http://handbrake.fr/
其實就是用 ffmpeg 來轉碼,但我不用是因為Handbrake 就是無法強迫降速轉碼,導致熱當。
我猜只是它的 –thread 參數放在前面導致的。因為我下指令時放在前面就跟沒放一樣。
因此,電腦不熱當,而且轉檔參數常換或喜歡用 gui 來操作的人,就用 Handbrake 吧

沒有留言:

張貼留言