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.mkv0: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 上閱讀或評論(發表評論需要登入)