FFmpeg 使用指南

最後更新: 2021-05-09 05:38:32 +0800 +0800
tags: Ffmpeg | Media | Video
原文以英文撰寫。您正在閱讀AI翻譯版本。

ffmpeg 是一項媒體管線工具。它會讀取一或多個輸入,選擇性地篩選解碼後的影格,並寫入一或多個輸出。

管線模型 #

ffmpeg 由以下元件建立管線:

  • 解封裝器讀取容器資料並公開編碼封包;
  • 解碼器將封包轉換為原始影格;
  • 濾鏡圖轉換原始音訊或視訊影格;
  • 編碼器將篩選後的影格重新轉換為封包;
  • 封裝器將封包交錯寫入輸出容器。

這個模型說明了為何命令列會受到選項順序影響,以及為何串流選取很重要。

命令列順序 #

命令列具有位置性:

sh
ffmpeg [global_options] [input_options] -i input ... [output_options] output ...

實務上重要的規則:

  • 輸入選項必須放在相符的 -i 之前;
  • 輸出選項必須放在相符的輸出 URL 之前;
  • 全域選項必須放在最前面;
  • 每個檔案之間都會重設選項。

串流選取 #

ffmpeg 可以自動選取串流,但對於非簡單工作,明確的對映方式更為安全。

sh
ffmpeg -i input.mkv -map 0:v:0 -map 0:a:0 -c copy output.mkv

0:v:0 等串流指定器會選取第一個輸入中的第一個視訊串流。當容器包含多個音訊軌、字幕或附加圖片時,請使用這些指定器。

常見操作 #

串流複製 #

在不解碼或重新編碼的情況下複製串流:

sh
ffmpeg -i input.mkv -c copy output.mp4

當目標容器接受現有編解碼器時,這是最快的處理路徑。

轉碼 #

當輸出格式需要不同的編解碼器時,請重新編碼:

sh
ffmpeg -i input.avi -c:v libx264 -c:a aac output.mp4

裁剪 #

使用 -ss 和 -t 或 -to 來裁剪片段:

sh
ffmpeg -ss 30 -i input.mp4 -t 60 -c copy clip.mp4

需要精確度時,請將 -ss 放在 -i 之後;需要速度時,請將它放在 -i 之前。

擷取音訊 #

sh
ffmpeg -i input.mp4 -vn -c:a copy output.m4a

-vn 會移除視訊,而 -c:a copy 可避免重新編碼音訊串流。

篩選 #

簡單篩選器會附加至單一串流:

sh
ffmpeg -i input.mp4 -vf "scale=-2:720,format=yuv420p" output.mp4

複雜的濾鏡圖會合併多個輸入:

sh
ffmpeg -i main.mp4 -i overlay.png -filter_complex "[0:v][1:v]overlay=10:10" output.mp4

濾鏡圖語法屬於 ffmpeg-filters(1)。逗號會分隔鏈中的篩選器,分號會分隔鏈。

探查 #

當輸入配置不明時,請使用 ffprobe:

sh
ffprobe -hide_banner -show_streams -show_format input.mkv

這是在撰寫 ffmpeg 命令之前,檢查串流索引、編解碼器名稱、持續時間及中繼資料的最快方式。

實用旗標 #

  • -shortest 會在最短的串流結束時停止;
  • -movflags +faststart 會將 MP4 中繼資料移至檔案開頭;
  • -y 會覆寫輸出檔案;
  • -hide_banner 會讓指令碼輸出保持簡短;
  • -loglevel error 會抑制資訊性雜訊。

參考資料 #

評論

在 GitHub 上閱讀或評論(發表評論需要登入)