如何使用FFmpeg合併和串接影片(2026年指南)
完整指南:使用FFmpeg合併和串接多個影片檔案。涵蓋concat解多工器、濾鏡、協議方法,以及免費的一鍵替代方案。
有多個影片片段需要合併成一個檔案嗎?FFmpeg 提供了幾種合併影片的方式——但正確的方法取決於您的片段是否共用相同的格式、編解碼器和解析度。
本指南涵蓋所有三種方法及精確的指令。對於不想在終端機中除錯編解碼器不匹配問題的使用者,文末還提供了一個免費的拖放替代方案。
前置條件:安裝 FFmpeg

macOS:
brew install ffmpeg
Ubuntu/Debian:
sudo apt update && sudo apt install ffmpeg
Windows:
從 ffmpeg.org 下載,解壓縮後將 bin 加入 PATH。
方法一:Concat Demuxer(相同格式——最快速)
這是最快且最簡單的方法。適用於所有影片具有相同編解碼器、解析度和幀率的情況。
步驟一:建立檔案清單
建立一個名為 files.txt 的文字檔:
file 'clip1.mp4'
file 'clip2.mp4'
file 'clip3.mp4'
步驟二:執行合併指令
ffmpeg -f concat -safe 0 -i files.txt -c copy output.mp4
-f concat— 使用 concat demuxer-safe 0— 允許絕對/相對路徑-c copy— 無需重新編碼(即時完成)
自動產生檔案清單
Linux/macOS:
for f in *.mp4; do echo "file '$f'" >> files.txt; done
ffmpeg -f concat -safe 0 -i files.txt -c copy output.mp4
Windows (PowerShell):
Get-ChildItem *.mp4 | ForEach-Object { "file '$($_.Name)'" } | Out-File -Encoding ascii files.txt
ffmpeg -f concat -safe 0 -i files.txt -c copy output.mp4
方法二:Concat Filter(不同格式——最靈活)
當片段具有不同的編解碼器、解析度或幀率時,需要使用 concat filter。此方法會對所有內容重新編碼以統一規格。
兩個影片:
ffmpeg -i clip1.mp4 -i clip2.mov \
-filter_complex "[0:v][0:a][1:v][1:a]concat=n=2:v=1:a=1[outv][outa]" \
-map "[outv]" -map "[outa]" output.mp4
三個影片:
ffmpeg -i clip1.mp4 -i clip2.mov -i clip3.avi \
-filter_complex "[0:v][0:a][1:v][1:a][2:v][2:a]concat=n=3:v=1:a=1[outv][outa]" \
-map "[outv]" -map "[outa]" output.mp4
n=3— 輸入片段數量v=1— 一個影像串流輸出a=1— 一個音訊串流輸出
合併前統一解析度
若片段具有不同解析度,先進行縮放:
ffmpeg -i clip1.mp4 -i clip2.mp4 \
-filter_complex \
"[0:v]scale=1920:1080:force_original_aspect_ratio=decrease,pad=1920:1080:(ow-iw)/2:(oh-ih)/2[v0]; \
[1:v]scale=1920:1080:force_original_aspect_ratio=decrease,pad=1920:1080:(ow-iw)/2:(oh-ih)/2[v1]; \
[v0][0:a][v1][1:a]concat=n=2:v=1:a=1[outv][outa]" \
-map "[outv]" -map "[outa]" output.mp4
方法三:Concat Protocol(僅限 MPEG-TS)
對於 MPEG 傳輸串流,可以直接使用 concat protocol:
# 先轉換為 MPEG-TS
ffmpeg -i clip1.mp4 -c copy -bsf:v h264_mp4toannexb clip1.ts
ffmpeg -i clip2.mp4 -c copy -bsf:v h264_mp4toannexb clip2.ts
# 再進行合併
ffmpeg -i "concat:clip1.ts|clip2.ts" -c copy -bsf:a aac_adtstoasc output.mp4
此方法目前不建議使用——concat demuxer(方法一)更簡單且更可靠。
特殊情境
合併影像與音訊軌道
將影片檔案與獨立的音訊檔案合併:
ffmpeg -i video.mp4 -i audio.mp3 -c:v copy -c:a aac -shortest output.mp4
-shortest— 當較短的串流結束時停止
替換影片中的音訊
ffmpeg -i video.mp4 -i new_audio.mp3 -c:v copy -c:a aac -map 0:v -map 1:a output.mp4
合併不同幀率的影片
合併前強制所有輸入統一為 30fps:
ffmpeg -i clip1.mp4 -i clip2.mp4 \
-filter_complex \
"[0:v]fps=30[v0];[1:v]fps=30[v1]; \
[v0][0:a][v1][1:a]concat=n=2:v=1:a=1[outv][outa]" \
-map "[outv]" -map "[outa]" output.mp4
無音訊的影片
若部分片段缺少音訊軌道,添加靜音音訊:
ffmpeg -i clip_no_audio.mp4 -f lavfi -i anullsrc=r=44100:cl=stereo \
-c:v copy -c:a aac -shortest clip_with_silence.mp4
之後再正常合併。
常見錯誤與解決方法
「Discarding non-monotonous DTS」
片段之間的時間戳不對齊。重新編碼:
ffmpeg -f concat -safe 0 -i files.txt -c:v libx264 -c:a aac output.mp4
「Stream 0 codec does not match」
您的片段具有不同的編解碼器。請改用 concat filter(方法二)而非 concat demuxer。
「Discarding 1 additional packets」/ 同步問題
添加 -fflags +genpts 以重新產生時間戳:
ffmpeg -fflags +genpts -f concat -safe 0 -i files.txt -c copy output.mp4
輸出影片在片段之間出現黑色畫面
這是因為片段具有不同的像素格式。強制使用統一格式:
ffmpeg -i clip1.mp4 -i clip2.mp4 \
-filter_complex "[0:v]format=yuv420p[v0];[1:v]format=yuv420p[v1];[v0][0:a][v1][1:a]concat=n=2:v=1:a=1[outv][outa]" \
-map "[outv]" -map "[outa]" output.mp4
跳過終端機:改用 WaveSpeed Desktop
使用 FFmpeg 合併影片意味著需要在三種不同方法之間做選擇、建立檔案清單、處理編解碼器不匹配問題、除錯時間戳問題,以及撰寫看起來像正規表達式噩夢的 filter_complex 字串。
WaveSpeed Desktop 內建了媒體合併器,讓一切變得簡單:
- 拖放您的影片片段
- 依需求重新排序
- 點擊合併——一個檔案,搞定
不同格式?不同解析度?應用程式會自動處理。

免費下載 WaveSpeed Desktop: https://github.com/WaveSpeedAI/wavespeed-desktop/releases
常見問題
應該使用哪種合併方法? 若所有片段具有相同的編解碼器和解析度,使用方法一(demuxer)——即時完成。若片段在任何方面有所不同,使用方法二(filter)。
可以在片段之間添加轉場效果嗎?
FFmpeg 支援使用 xfade filter 的基本交叉淡化轉場,但較為複雜。對於轉場效果,視覺化編輯器通常更為簡便。
合併影片會降低品質嗎?
使用 -c copy(方法一)不會降低品質。使用 concat filter(方法二)會發生重新編碼,可能造成輕微的品質損失。使用較低的 CRF 值(18–20)可以將損失降至最低。
可以合併的影片數量有上限嗎? FFmpeg 沒有硬性限制。實際上,記憶體和處理時間會隨輸入數量增加而增加。



