この記事でわかること

テスト済みバージョン: 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使用上の注意


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