この記事でわかること

  • 2つのconcatアプローチ(demuxer と filter)の違いと選択基準
  • concat demuxerによる高速結合(テキストファイル方式)
  • concat filter(filter_complex)による柔軟な結合
  • フレームレートや解像度が異なるファイルを結合する際の注意点

テスト済みバージョン: FFmpeg 6.1で確認済み(ubuntu-latest / CI検証済み) 対象 OS: Windows / macOS / Linux


2つのconcatアプローチの比較

比較項目concat demuxerconcat filter
速度高速(再エンコードなし)遅い(再エンコードあり)
互換性要件同一コーデック・フォーマットが必要異なるフォーマットでも結合可能
入力ファイル数何ファイルでも対応入力ファイル数分の -i が必要
ファイルリストテキストファイル(list.txt)が必要不要
コマンドの複雑さシンプルfilter_complex 記法が必要

concat demuxer(高速・同一フォーマット向け)

概要

concat demuxerはテキストファイルにファイルパスを列挙し、それらを順番に連結するアプローチです。再エンコードなしで動作するため非常に高速です。

ファイルリスト(list.txt)の作成

concat demuxerには専用のテキストファイルが必要です。list.txt を以下の形式で作成します。

# list.txt の例(コメント行は # で始める)
file 'part1.mp4'
file 'part2.mp4'
file 'part3.mp4'

Linuxでコマンドラインから作成する場合。

printf "file 'part1.mp4'\nfile 'part2.mp4'\nfile 'part3.mp4'\n" > list.txt

Windowsコマンドプロンプトから作成する場合。

(echo file 'part1.mp4' & echo file 'part2.mp4' & echo file 'part3.mp4') > list.txt

concat demuxerの実行コマンド

ffmpeg -f concat -safe 0 -i list.txt -c copy output.mp4
オプション意味
-f concatconcat demuxerを使用
-safe 0ファイルパスの安全チェックを無効化(絶対パスや特殊文字を含む場合に必要)
-i list.txtファイルリストを入力として指定
-c copy再エンコードなし(ストリームコピー)

list.txt を使う concat demuxer コマンドはCIの自動テストをスキップするため、text ブロックで記載しています。

concat demuxer使用上の注意

  • すべてのファイルが同一のコーデック、解像度、フレームレートである必要があります
  • フォーマットが異なると映像・音声の同期がズレたり、エラーが発生することがあります
  • -safe 0 を省略した場合、相対パス以外のファイルはエラーになります

concat filter(柔軟・異フォーマット対応)

概要

filter_complexconcat フィルタは、フォーマットや解像度が異なるファイルでも結合できます。再エンコードが発生しますが、汎用性が高いアプローチです。

基本コマンド(2ファイルの結合)

ffmpeg -i input1.mp4 -i input2.mp4 -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

filter_complex 記法の解説

[0:v][0:a][1:v][1:a]concat=n=2:v=1:a=1[outv][outa]
部分意味
[0:v][0:a]1番目の入力(index 0)の映像・音声ストリーム
[1:v][1:a]2番目の入力(index 1)の映像・音声ストリーム
concat=n=22つのセグメントを結合(ファイル数に合わせて変更)
v=1:a=1映像1ストリーム・音声1ストリームを出力
[outv][outa]出力ラベル(-map で参照)

3ファイルの結合

ffmpeg -i input1.mp4 -i input2.mp4 -i input.mkv -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 にしてすべてのストリームペアを列挙します。

コーデックを指定して結合

ffmpeg -i input1.mp4 -i input2.mp4 -filter_complex "[0:v][0:a][1:v][1:a]concat=n=2:v=1:a=1[outv][outa]" -map "[outv]" -map "[outa]" -c:v libx264 -crf 23 -c:a aac output.mp4

解像度・フレームレートの統一

concat filterを使う場合でも、解像度やフレームレートが異なると結合後の映像が乱れることがあります。事前にscaleフィルタやfpsフィルタで統一することを推奨します。

ffmpeg -i input1.mp4 -i input2.mp4 -filter_complex "[0:v]scale=1280:720,fps=30[v0];[1:v]scale=1280:720,fps=30[v1];[v0][0:a][v1][1:a]concat=n=2:v=1:a=1[outv][outa]" -map "[outv]" -map "[outa]" -c:v libx264 -crf 23 -c:a aac output.mp4
追加フィルタ目的
scale=1280:720解像度を統一
fps=30フレームレートを統一

方法の選び方まとめ

concat demuxerを選ぶべきケース:

  • すべてのファイルが同じコーデックと解像度を持っている
  • ファイルが多数あり、再エンコードなしで素早く連結したい
  • 録画ファイルの分割データを結合するなど、均質なデータを扱う

concat filterを選ぶべきケース:

  • ファイルのコーデックや解像度がバラバラ
  • スクリプトで動的にファイルを指定したい(リストファイル不要)
  • トリミング結果を直接結合したい

よくあるエラーと対処法

DTS ... out of order エラー

タイムスタンプが不連続なファイルを concat demuxer で結合した際に発生します。-c copy-c:v libx264 -c:a aac に変更してください。

音声がずれる

フレームレートや音声サンプルレートが異なる場合に発生します。concat filterを使い、事前にfpsフィルタとaresampleフィルタで統一してください。

特定のファイルがスキップされる

list.txtのファイルパスにスペースや特殊文字が含まれる場合、クォートが正しく処理されているか確認してください。


関連記事


動作確認: ffmpeg 6.1.1 / Ubuntu 24.04 (GitHub Actions runner) 一次ソース: ffmpeg.org/ffmpeg-formats.html / ffmpeg.org/ffmpeg-filters.html / trac.ffmpeg.org/wiki/Concatenate


よくある質問

concat は何種類あるの?

3 種類: (1) concat protocol(TS 限定のバイト連結)、(2) concat demuxer(任意コンテナ、リストファイル経由、-c copy 可)、(3) concat filter(再エンコード必須、トランジション可)。MP4 結合には demuxer か filter を使う。

異なる解像度の動画を結合したい

concat filter 必須。[0:v]scale=1920:1080[v0];[1:v]scale=1920:1080[v1];[v0][0:a][v1][1:a]concat=n=2:v=1:a=1[v][a] のように事前にスケール統一。

結合後に音ズレする

VFR 動画混入が原因の典型ケース。事前に各動画を CFR に変換(-vsync cfr -r 30)してから concat してください。

結合時に黒画面が一瞬入る

タイムスタンプの不連続が原因。concat demuxer の前に -fflags +genpts を追加するか、再エンコードする concat filter に切り替えてください。

リストファイルの書式は?

file 'video1.mp4' を 1 行ずつ。シングルクオートでパスを囲み、各ファイルのフルパスまたは相対パス(リストファイルから見た)を指定。