FFmpeg 批次影片轉檔

最近常發生在播放影片時,出現音軌格式不支援的錯誤,偏偏又都僅此一軌不能另選,也不能闗閉,導致無法播放。真奇怪,耳拙的我,本已經少了聆賞音樂的樂趣,現在連想關閉音軌,看無聲默片的樂趣都要被剝奪嗎?

查看了音軌格式,發現都是「eac3」格式。本來常見的 ac3 格式都好好的,怎麼遇到 eac3 就不行了呢?

試了在電腦這端安裝各種 codec,最後決定,不管新格式了,直接轉檔成已支援格式就好。(反正聲音如何對我影響不大)


由於作業系統是 openSUSE Linux,要影音轉檔,除 FFmpeg 之外,不做他想。皺著眉頭研究了 FFmpeg 極度複雜的參數,擇定幾個比較通用的,實作沒問題就定下來了。指令如下:

ffmpeg -y -i "INPUT" -map 0 -c:v copy -c:a ac3 -c:s copy -b:a 640k "OUTPUT"

簡要參數說明:

  • -y 直接覆蓋檔案不詢問
  • -i 輸入檔案
  • -map 選擇要使用的串流;-map 0 是全部。(包括影像、聲音、字幕、…所有串流)
  • -c:v 指定影像編碼。(video codec)
  • -c:a 指定聲音編碼。(audio codec)(-c:a ac3 表示將音頻重編碼成 ac3 格式輸出)
  • -c:s 指定字幕編碼。(subtitle codec)
  • -b:a 指定音頻位元率。(audio bitrate)(若原始位元率低於指定位元率,則採用最高質之原始位元率)
  • copy 原樣複製,不重新編碼。

若是要一次轉檔多個檔案,則寫成 script,加上迴圈做批次處理。為避免覆蓋原始檔案,OUTPUT 輸出檔最好不同名稱,或位在不同於 INPUT 的資料夾,若要放在同一處,則須更改輸出檔名。底下使用 for 迴圈,將本資料夾中所有 ext 影音檔轉檔,並在原檔名後加上”-ac3″標示。

for f in *.ext
do
    ffmpeg -y -i "$f" -map 0 -c:v copy -c:a ac3 -c:s copy -b:a 640k "${f%.*}-ac3.$1"
done

簡要說明:

  • ext :extension,副檔名。可直接寫定在 script 指令行中,或在執行時才交付副檔名參數,並以 %1 代表。
  • *.ext/*.$1 :所有指定副檔名的檔案,例如 *.mkv、*.mp4、…。
  • ${} :變數替換。將{}中的計算(過濾)結果,替換成變數值傳遞出去。(參考本篇
  • ${f%.*} :去掉最後一個 . 及其後字串(在此為去掉 .ext),而後以此值替換 $f。(另參考本篇

於是,往後需要時,便能在資料夾中,開啟終端機以類似 convertvideo.sh ext 的命令執行自動轉檔,按下 Enter 就可以去泡茶了。

 

註:這裡補了一篇 ${} 字串截取實作簡單範例

發佈留言

發佈留言必須填寫的電子郵件地址不會公開。 必填欄位標示為 *