この記事でわかること
- 2つのconcatアプローチ(demuxer と filter)の違いと選択基準
- concat demuxerによる高速結合(テキストファイル方式)
- concat filter(
filter_complex)による柔軟な結合 - フレームレートや解像度が異なるファイルを結合する際の注意点
テスト済みバージョン: FFmpeg 6.1で確認済み(ubuntu-latest / CI検証済み) 対象 OS: Windows / macOS / Linux
2つのconcatアプローチの比較
| 比較項目 | concat demuxer | concat 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 concat | concat demuxerを使用 |
-safe 0 | ファイルパスの安全チェックを無効化(絶対パスや特殊文字を含む場合に必要) |
-i list.txt | ファイルリストを入力として指定 |
-c copy | 再エンコードなし(ストリームコピー) |
list.txt を使う concat demuxer コマンドはCIの自動テストをスキップするため、
textブロックで記載しています。
concat demuxer使用上の注意
- すべてのファイルが同一のコーデック、解像度、フレームレートである必要があります
- フォーマットが異なると映像・音声の同期がズレたり、エラーが発生することがあります
-safe 0を省略した場合、相対パス以外のファイルはエラーになります
concat filter(柔軟・異フォーマット対応)
概要
filter_complex の concat フィルタは、フォーマットや解像度が異なるファイルでも結合できます。再エンコードが発生しますが、汎用性が高いアプローチです。
基本コマンド(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=2 | 2つのセグメントを結合(ファイル数に合わせて変更) |
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