重溫 ffmpeg 增加背景音樂 混音 視頻合併 視頻加速

我的運動相機拍攝的視頻是自動分段的,每段時長 15 分鐘。由於騎摩托車時用,風噪太大,在錄製視頻時,做了不錄製聲音的設定。因此,對於得到的視頻,我需要做兩個處理,首先是視頻的合併,其次是增加背景音樂。此外,倘若枯燥沉悶的路段,讓視頻的播放速度能加快一些會更好。

倘若用手機 APP 或者 PC 上的應用軟件來處理這些事,免費的軟件不是那麼好找,能找到的也不見得會多麼好用,還是用 ffmpeg 吧,好久沒用它了。

增加背景音樂

先從增加背景音樂開始。假設我有一段視頻,文件爲 foo.mp4,我想將 MP3 格式的一段音樂作爲 它的背景音樂——音樂文件爲 bar.mp3,爲便於理解,做法可以分爲兩步。第一步去除 foo.mp4 文件中的音軌,即便它無聲,但不代表它沒聲音:

$ ffmpeg -an -i foo.mp4 -c copy  foo-no-audio.mp4

輸出的 foo-no-audio.mp4 即爲去掉了音軌的視頻文件。然後,將 bar.mp3 作爲 foo-no-audio.mp4 的音軌:

$ ffmpeg -i foo-no-audio.mp4 -stream_loop -1 -i bar.mp3 -c copy -t 00:15:00 foobar.mp4

其中,-stream_loop -1 用於設定以 bar.mp3 的循環播放作爲 foo-no-audio.mp4 的音軌。-c copy 可簡單理解爲保持輸出視頻畫質的選項。-t 選項用於設定視頻的時長,由於 foo-no-audio.mp4 的時長爲 15 分鐘,所以命令中就是 -t 00:15:00。最終得到的結果爲 foobar.mp4,即原視頻增加了背景音樂的結果。

-t 選項是必須的,倘若沒設定這個選項,那麼 ffmpeg 會認爲,既然背景音樂在循環播放,那麼輸出的視頻也應該是無限長的。倘若不想打開原視頻查看截止時長,也可以用 -shortest 取代 -t 時長 這個選項。-shortest 會讓 ffmpeg 根據視頻和音軌的時長哪個更短來確定時長,倘若音軌是無限長的,那麼就以視頻時長爲截止時長。

掌握了爲視頻增加背景音樂的基本方法後,爲視頻做後期配音的事情也自然就會了。

混音

倘若保留原視頻 foo.mp4 的音軌,在此基礎上混入新的音軌,命令如下:

$ ffmpeg -i foo.mp4 -stream_loop -1 -i bar.mp3 -filter_complex [0:a][1:a]amix -shortest foobar.mp4

視頻合併

假設有視頻文件 a.mp4, b.mp4, c.mp4,它們位於同一目錄,要將它們合併爲 abc.mp4,只需在該目錄下建立一個文本文件,例如 list.txt,內容爲:

file 'a.mp4'
file 'b.mp4'
file 'c.mp4'

然後在該目錄下執行命令:

$ ffmpeg -f concat -i list.txt -c copy abc.mp4

便可得到視頻的合併結果 abc.mp4。

視頻加速

所謂視頻,無非是很多畫面的集合。每一張畫面(幀)都有其顯示的時間。視頻播放器根據這個時間顯示和切換畫面。理解了這一點,視頻加速問題本質上就是修改畫面顯示時間的問題。倘若將每個畫面的原來的播放時間都縮短,那麼視頻播放的就快了,反之就慢了。

ffmpeg 可通過 PTS 的倍率修改視頻畫面播放時間。例如,將 foobar.mp4 播放速度提高一倍,只需:

$ ffmpeg -an -i foobar.mp4 -filter:v "setpts=0.5*PTS" -q 1 foobar-quick.mp4

其中,-an 是必須的,即在視頻加速時要去掉音軌,否則決定加速後視頻時長的是音軌的時長,因爲上述命令是在對視頻進行加速,而非音軌。去掉的音軌,可以在視頻加速後,再重新加到視頻裏。選項 -q 1 用於保留視頻的原有畫質,之所以用這個選項,是因爲在修改視頻速度的命令中,之前用的 -c copy 不可用了。

同理,若將視頻速度提高 2 倍,只需:

$ ffmpeg -an -i foobar.mp4 -filter:v "setpts=0.3*PTS" -q 1 foobar-quick.mp4

但是,視頻加速後,必然會丟失一些畫面。因爲每個視頻,每秒鐘播放出多少畫面,這個數量叫幀率,它通常是固定的。例如,我的運動相機拍攝的視頻,幀率是 30,亦即視頻的每一秒的片段裏包含着 30 個畫面。倘若我將視頻加速,這樣每一秒實際上包含的畫面是高於 30 的(提速一倍,視頻的每一秒的片段就會包含了 60 個畫面),但是此時視頻幀數還是 30,那必定會有一部分畫面沒有機會播放,結果就會導致原本連續的畫面有所卡頓。解決方法是,在 ffmpeg 命令中指定新的視頻的幀率。例如,提速一倍的視頻,可以將幀率設爲 60:

$ ffmpeg -an -i foobar.mp4 -r 60 -filter:v "setpts=0.5*PTS" -q 1 foobar-quick.mp4

視頻加速處理,要對每個畫面都要進行變動,相當於一個圖像編輯軟件在對每個畫面進行格式轉換,所以這個過程會很慢。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章