この記事でわかること
- concat デマルチプレクサ(concat demuxer)で動画を再エンコードなしに結合する方法
concat.txt(リストファイル)の作成方法- 同一コーデック・フォーマット要件と注意事項
concatフィルタ(再エンコードあり)との違い
テスト済みバージョン: FFmpeg 6.1で確認済み
対象 OS: Windows / macOS / Linux
⚠️ 実行前に必ず確認してください(無音・映像欠落がエラーなしで通過するリスク)
- リストファイルの書式ミスや存在しないファイルパスが原因で、FFmpegがエラーを出さずに不完全な出力を生成することがあります
- コーデック・解像度・フレームレートが揃っていない場合、音声や映像が途中で欠落するか、タイムスタンプがずれます
- 結合後は必ず
ffprobeで出力の尺を検証してください - 重要なデータを結合する前に小さなテストファイルで動作確認してください
concat デマルチプレクサとは
FFmpegの concat デマルチプレクサは、テキストファイルに記述されたファイルリストを順番に読み込んで、再エンコードなしで結合する機能です。
同一コーデック・同一パラメータのファイルであれば非常に高速に処理できます。
基本的な使い方
ステップ1: リストファイルの事前確認(必須)
リストファイルを作成する前に、結合するファイルが全て存在し、コーデックが揃っているか確認します:
# ファイルの存在確認
for f in clip1.mp4 clip2.mp4 clip3.mp4; do
if [ -f "$f" ]; then
echo "OK: $f"
else
echo "MISSING: $f"
fi
done
# コーデック・解像度・フレームレートの確認
ffprobe -v error -select_streams v:0 \
-show_entries stream=codec_name,width,height,r_frame_rate \
-of csv=p=0 clip1.mp4 clip2.mp4 clip3.mp4
全ファイルで codec_name,width,height,r_frame_rate の値が一致していれば -c copy で安全に結合できます。
ステップ2: リストファイル(concat.txt)を作成する
printf "file 'clip1.mp4'\nfile 'clip2.mp4'\nfile 'clip3.mp4'\n" > concat.txt
concat.txt の内容:
file 'clip1.mp4'
file 'clip2.mp4'
file 'clip3.mp4'
各行を file '...' の形式で記述します。パスはシングルクォートで囲みます。
注意: 各行は file から始まる形式に厳密に従う必要があります。スペルミスや余計な空白があると FFmpeg がファイルを無視する場合があります。
ステップ3: concat デマルチプレクサで結合する
ffmpeg -f concat -safe 0 -i concat.txt -c copy output.mp4
-c copy でストリームをそのままコピーします(再エンコードなし)。
リストファイルの書き方
相対パスの例
file 'clip1.mp4'
file 'clip2.mp4'
file 'clip3.mp4'
絶対パスの例(Windowsの場合は通常相対パスを推奨)
file '/path/to/clip1.mp4'
file '/path/to/clip2.mp4'
特殊文字を含むファイル名
シングルクォートを含む場合は '\'' でエスケープします:
file 'it'\''s a clip.mp4'
オプション一覧
| オプション | 説明 |
|---|---|
-f concat | concat デマルチプレクサを指定 |
-safe 0 | 絶対パスや相対パスを許可(デフォルトでは制限あり) |
-i concat.txt | リストファイルを入力として指定 |
-c copy | 再エンコードなしでコピー |
再エンコードなし結合の前提条件
concat デマルチプレクサで -c copy を使うには、すべてのファイルが同一のコーデック・パラメータである必要があります:
- 映像コーデックが同じ(例: すべて H.264)
- 解像度が同じ(例: すべて 1920×1080)
- フレームレートが同じ(例: すべて 30fps)
- 音声コーデックが同じ(例: すべて AAC)
- サンプルレートが同じ(例: すべて 44100Hz)
条件が揃わない場合はエラーが発生するか、映像・音声がずれることがあります。
音声付きファイルの結合
printf "file 'clip1.mp4'\nfile 'clip2.mp4'\n" > concat.txt
ffmpeg -f concat -safe 0 -i concat.txt -c copy output_with_audio.mp4
-c copy で映像・音声ともにコピーされます。
結合後の整合性確認(重要)
結合が成功したか必ず確認してください。個々のファイルの尺の合計と出力の尺を比較します:
# 各入力ファイルの尺を合計
total=0
for f in clip1.mp4 clip2.mp4 clip3.mp4; do
dur=$(ffprobe -v error -show_entries format=duration \
-of default=noprint_wrappers=1:nokey=1 "$f")
total=$(echo "$total + $dur" | bc)
done
echo "入力合計尺: ${total}秒"
# 出力の尺を確認
out_dur=$(ffprobe -v error -show_entries format=duration \
-of default=noprint_wrappers=1:nokey=1 output.mp4)
echo "出力尺: ${out_dur}秒"
# 差が 0.5 秒以上あれば結合が不完全な可能性があります
concat フィルタとの違い
| 方式 | 再エンコード | 速度 | 要件 |
|---|---|---|---|
| concat デマルチプレクサ(本記事) | なし | 高速 | 同一コーデック・フォーマットが必要 |
| concat フィルタ | あり | 低速 | 異なるコーデックでも対応可能 |
フォーマットが異なるファイルを結合したい場合や、トランジション効果を加えたい場合は concat フィルタを使います:
ffmpeg -i clip1.mp4 -i clip2.mp4 -filter_complex "[0:v][0:a][1:v][1:a]concat=n=2:v=1:a=1[v][a]" -map "[v]" -map "[a]" output.mp4
トラブルシューティング
映像がずれる・音声がずれる場合
タイムスタンプの不整合が原因の場合があります。-fflags +genpts を追加してみてください:
ffmpeg -f concat -safe 0 -fflags +genpts -i concat.txt -c copy output.mp4
“Unsafe file name” エラー
-safe 0 オプションが不足している場合に発生します:
NG例: ffmpeg -f concat -i concat.txt -c copy output.mp4
OK: ffmpeg -f concat -safe 0 -i concat.txt -c copy output.mp4
出力が入力より短い・途中で切れる
リストファイルのパスが間違っている、またはコーデックが揃っていない可能性があります。ステップ1の確認コマンドを再度実行してください。
関連記事
- xfade フィルタでクロスフェード・トランジション効果を追加する
- 動画をトリミング・カット(trim/ss/to)する
- 動画を結合・連結する
動作確認: ffmpeg 6.1 / Ubuntu 24.04 (GitHub Actions runner)
一次ソース: ffmpeg.org/ffmpeg-formats.html#concat-1 / trac.ffmpeg.org/wiki/Concatenate
よくある質問
concat プロトコルと concat デマルチプレクサの違いは?
プロトコル方式(concat:a.ts|b.ts)は限られた形式(TS ストリーム)でバイトを連結するだけ。デマルチプレクサ(-f concat -i list.txt)は任意のコンテナで再多重化。
concat:a.ts|b.ts はいつ使える?
放送録画など MPEG-TS(Transport Stream)でのみ機能します。MP4 / MOV では動きません — それらは concat デマルチプレクサか concat フィルタを使ってください。
MP4 で concat プロトコルが壊れるのはなぜ?
MP4 はグローバルなインデックス(moov atom)を持つため、バイトを単純連結することはできません。代わりに -f concat -i list.txt -c copy を使ってください。
コーデックが違うファイルを concat プロトコルで繋げる?
無理。MPEG-TS 内でも、コーデックとパラメータが一致している必要があります。違う場合は concat フィルタ + 再エンコード必須。
concat プロトコルは本番で使って大丈夫?
既知のツールチェーン(放送キャプチャなど)の MPEG-TS パイプラインだけなら OK。それ以外では concat デマルチプレクサ / フィルタの方が安全な既定です。