自媒體良器:音頻文件批處理,FFmpeg一行搞定!果斷收藏

程序員小助手 發佈 2020-05-13T16:14:34+00:00

引言FFMpeg 是眾多多媒體應用程式的核心,但該程序本身不具備一次轉換多個文件的能力。但也攔不住,FFMpeg 本身是命令行程序,可編寫腳本,藉助 Bash 輕鬆快速地構建自動化程序。1 - 設置變量使用 FFMpeg 處理批處理文件轉換的唯一高效方法是通過 Bash 腳本。

引言

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 :-)


我是 @程式設計師小助手 ,持續分享編程知識,歡迎關注。

關鍵字: