引言
FFMpeg 是眾多多媒體應用程式的核心,但該程序本身不具備一次轉換多個文件的能力。
但也攔不住,FFMpeg 本身是命令行程序,可編寫腳本,藉助 Bash 輕鬆快速地構建自動化程序。
1 - 設置變量
使用 FFMpeg 處理批處理文件轉換的唯一高效方法是通過 Bash 腳本。不需要做的非常複雜,為了一個需求,只要夠用就可以。
本文將使用簡單得多的方法來完成工作。
首先,創建一個 Bash 腳本文件。
touch ffmpeg-batch.sh
接下來,使用您喜歡的文本編輯器打開它,並將其設置為bash腳本。
#!/bin/bash
此腳本將對文件路徑、擴展名和 FFMpeg 選項使用一系列變量。
通過這種足夠靈活的方式,你可以在不同參數位置,傳遞不同的文件,並在傳參過程中選擇文件格式。
我們規劃五個變量:
- 輸入目錄和輸出目錄各需要一個。
- 為輸入文件擴展名設置一個集合,為輸出擴展名設置另一個集合。
- 創建一個通用的參數轉換選項。
我們把變量名都起好了:
srcExt=$1
destExt=$2
srcDir=$3
destDir=$4
opts=$5
想用你喜歡的變量名,那完全可以,修改就是。
擴展名是必需的,而不是簡單地從文件中提取它們,因為一個文件夾可能包含多種類型的文件。
如果文件夾中只有一種類型的文件,那麼可以直接修改腳本,使其以這種方式工作。
2 - for 循環
此腳本中的所有內容都通過一個簡單的 for 循環進行。它將疊代指定目錄中有指定擴展名的每個文件。
for filename in "$srcDir"/*.$srcExt; do
done
3 - 去掉文件名
要使腳本真正具有通用性,你需要去掉每個文件的路徑和擴展名,以獲得純粹的文件名。這樣,腳本將能夠以相同的文件名導出新轉換的文件,而不需要單獨指定或重命名文件。
首先,去掉擴展並將其賦給一個新變量。
for filename in "$srcDir"/*.$srcExt; do
然後,將路徑從文件名中剝離。
baseName=${basePath##*/}
你可以試著把結果列印出來,看看變量內容是什麼。
echo $baseName
4 - 匯總起來
經過上面的思路準備,終於可以添加 FFmpeg 起作用的代碼了。這一部分本質上只是一個對 FFMpeg 的簡單調用。
- 為 FFMpeg 提供完整的文件名,並將路徑作為其輸入。
- 然後,使用目標目錄、提取的文件名和目標文件擴展名構建輸出。
引號是 Bash 將每個變量視為字符串所必需的,否則如果中間出現空格,將會解析錯誤。
ffmpeg -i "$filename" $opts "$destDir"/"$baseName"."$destExt"
你也可以在循環之後添加一條 echo "Finished",以確認文件已成功轉換。
總結起來,你的腳本應該如下所示:
它沒有太多功能,但是該腳本足以處理大多數情況。
為了讓該腳本可執行,需要賦予可執行權限,如下:
chmod u+x ffmpeg-batch.sh
運行調用應該是這樣的:
./ffmpeg-batch.sh flac mp3 /home/username/Music/'Led Zeppelin'/'Led Zeppelin'/ /home/username/Music/'Led Zeppelin MP3'/ "-ab 320k"
寫在最後
一旦你習慣使用之後,它會成為你批處理音視頻文件,非常得力的一個工具。
FFMpeg 是一個優秀的程序,如果你喜歡極簡主義,在命令行你就可以得到所要的結果。不必打開那些動輒上 G 的臃腫的軟體。
這很 geek ,不是嗎?
Happy Coding :-)
我是 @程式設計師小助手 ,持續分享編程知識,歡迎關注。