← 部落格

如何使用FFmpeg合併和串接影片(2026年指南)

完整指南:使用FFmpeg合併和串接多個影片檔案。涵蓋concat解多工器、濾鏡、協議方法,以及免費的一鍵替代方案。

3 min read

有多個影片片段需要合併成一個檔案嗎?FFmpeg 提供了幾種合併影片的方式——但正確的方法取決於您的片段是否共用相同的格式、編解碼器和解析度。

本指南涵蓋所有三種方法及精確的指令。對於不想在終端機中除錯編解碼器不匹配問題的使用者,文末還提供了一個免費的拖放替代方案


前置條件:安裝 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 Media Merger

免費下載 WaveSpeed Desktop: https://github.com/WaveSpeedAI/wavespeed-desktop/releases


常見問題

應該使用哪種合併方法? 若所有片段具有相同的編解碼器和解析度,使用方法一(demuxer)——即時完成。若片段在任何方面有所不同,使用方法二(filter)

可以在片段之間添加轉場效果嗎? FFmpeg 支援使用 xfade filter 的基本交叉淡化轉場,但較為複雜。對於轉場效果,視覺化編輯器通常更為簡便。

合併影片會降低品質嗎? 使用 -c copy(方法一)不會降低品質。使用 concat filter(方法二)會發生重新編碼,可能造成輕微的品質損失。使用較低的 CRF 值(18–20)可以將損失降至最低。

可以合併的影片數量有上限嗎? FFmpeg 沒有硬性限制。實際上,記憶體和處理時間會隨輸入數量增加而增加。