高效影音處理:用 FFmpeg 輕鬆轉換、合併及提取影片
- Leo
- 技術宅 ( tech geek)
- 2023年8月31日
目錄
FFmpeg 是一款功能強大的開源影音處理工具,廣泛用於影片格式轉換、擷取影片中的聲音檔、添加字幕、擷取特定片段,以及進行批次處理等。考慮到其多功能性,我將經常使用的指令和用法記錄下來,以便於日後查詢和使用。
安裝 FFmpeg
可以到官方網站 下載安裝檔,或是使用下列指令安裝:
Windows
使用 Chocolatey 安裝: (還不知道怎麼安裝 / 使用 Chocolatey 的可以參考這篇 )
choco install -y ffmpeg
MacOS
使用 Homebrew 安裝:
brew install ffmpeg
FFmpeg
的基本使用
影片格式轉換
將 .mkv 轉換成 .mp4,副檔名可以換成不同的檔案格式
ffmpeg -i "input.mkv" "output.mp4"
批次處理
可以批次處理資料夾內的影片檔案,例如將資料夾內的
.mkv
檔案轉換成.mp4
格式。for /r %A in (*.mkv) do ffmpeg -i "%~nA.mkv" "%~nA.mp4"
可以將
do
後方的ffmpeg -i "%~nA.mkv" "%~nA.mp4"
替換成任何想要執行的指令。 其中/r
為搜尋包含子資料夾的檔案,若只想搜尋當前資料夾可以不寫此指令,%~nA
為顯示不含副檔名的檔名,例如input.mkv
會顯示成input
。可以先加入
echo
來確認指令是否正確,例如:for /r %A in (*.mkv) do @echo ffmpeg -i "%~nA.mkv" "%~nA.mp4"
擷取影片聲音檔
ffmpeg -i "input.mp4" -vn -acodec libmp3lame -q:a 0 "output.mp3"
for /r %A in (*.mp4) do @echo ffmpeg -i "%~nA.mp4" -vn -acodec libmp3lame -q:a 0 "%~nA.mp3"
添加字幕檔
# 內封字幕檔,需要撥放器支援解讀,但是可以隨時提取字幕資料出來。 ffmpeg -i "input.mkv" -i "input-subtitle.srt" "output.mp4"
# 內嵌字幕檔,將字幕資料像圖案一樣疊在影片上,形成新的影片。因此不需要撥放器支援字幕解讀,反之因為字幕已經變成了圖片,因此無法提取。 ffmpeg -i "input.mkv" -vf "subtitles='input-subtitle.srt'" "output.mp4"
for /r %A in (*.mkv) do @echo ffmpeg -i "%~nA.mkv" -i "&~nA.srt" "%~nA.mp4"
for /r %A in (*.mkv) do @echo ffmpeg -i "%~nA.mkv" -vf "subtitles='%~nA.srt'" "%~nA.mp4"
擷取片段
將聲音或影片擷取出來,可以指定開始時間點及持續時間。使用
-ss hh:mm:ss
指定開始時間點,-t hh:mm:ss
指定持續時間。 可以將.mp4
替換成任何影片副檔名或是聲音副檔名 e.g..mp3
ffmpeg -i "input.mp4" -ss hh:mm:ss -t hh:mm:ss "output.mp4"
擷取每一幀的畫面
將影片中每一幀的畫面輸出成圖片,可以指定輸出的圖片格式,例如
.bmp
、.png
、.jpg
、.webp
等等。ffmpeg -i "input.mp4" "output-%d.bmp"
合併影片
# 產生要合併的影片名稱列表文件 (for %i in (*.mp4) do @echo file '%i') > merge.txt # 將文件中的影片做合併 ffmpeg -f concat -safe 0 -i merge.txt -c copy output.mp4
將圖片轉成 Webp 格式
Webp 是一種 Google 開發的圖片格式,可以將圖片壓縮成較小的檔案,並且保持高品質的圖片。
ffmpeg -i "input.png" -compression_level 6 -lossless 1 "output.webp"
for /r %A in (*.png *.jpg) do @echo ffmpeg -i "%A" -compression_level 6 -lossless 1 "%~dpnA.webp"
輸出成 Animated WebP
這是一種支援動畫的圖片格式,可以將影片轉換成 Animated WebP,並且可以指定轉換後的動畫播放次數、壓縮級別、品質等等。
下列指令將
input.mp4
轉換成帧率為 20 帧每秒,循環播放,預設渲染預設效果,無損的output.webp
檔案:ffmpeg -i input.mp4 -vcodec libwebp -filter:v fps=fps=20 -lossless 1 -loop 0 -preset default -an -vsync 0 output.webp
for /r %A in (*.mp4) do @echo ffmpeg -i "%~nA.mp4" -vcodec libwebp -filter:v fps=fps=20 -lossless 1 -loop 0 -preset default -an -vsync 0 "%~nA.webp"
若希望轉出的
output.webp
動畫只播放一次,有損,壓縮級別為 3(0-6,預設為 4,越高效果越好),品質為 70(0-100,預設為 75,越高效果越好),渲染為圖片,可使用以下指令:ffmpeg -i input.mp4 -vcodec libwebp -filter:v fps=fps=20 -lossless 0 -compression_level 3 -q:v 70 -loop 1 -preset picture -an -vsync 0 output.webp
for /r %A in (*.mp4) do @echo ffmpeg -i "%~nA.mp4" -vcodec libwebp -filter:v fps=fps=20 -lossless 0 -compression_level 3 -q:v 70 -loop 1 -preset picture -an -vsync 0 "%~nA.webp"