ffmpegで動画を結合する(最新版concatの使い方)

2018年1月14日ffmpegffmpeg, concat, エンコード

ffmpegにはクセがあって、バージョンごとにコマンドが若干違ったりしている。その最たるものが動画を結合する際に使用する「concat」で、世の中に出回っているconcatの使用方法だとうまくいかないことが多い。
今回は、当方の環境で動作している「concat」の使い方を紹介したい。

当方環境のffmpegバージョン

ffmpeg version N-83006-g4c63910 Copyright (c) 2000-2017 the FFmpeg developers
  built with gcc 5.4.0 (Ubuntu 5.4.0-6ubuntu1~16.04.4) 20160609

ソースからビルドしているので非常に分かりづらいが、まあだいたい「最新版」と捉えていただいてたぶん結構です。

よくある「concat」の使い方

よく見かけるffmpegのconcatの使い方は、次のような形でファイルを”|”で区切って指定する方法である。

ffmpeg -i "concat:1.mp4|2.mp4|3.mp4" -c copy dst.mp4

しかし、最近のffmpegではこの記法はサポートされなくなってしまった。
このことは、ffmpegの公式サイトでも記載されている。

最新版ffmpegのconcatの使い方

じゃあどうすればいいかと言うと、次のような手順になる。

  • 結合したいファイルの名称を適当なテキストファイルに羅列する
  • 当該のテキストファイルを -iでffmpegに読み込ませる

具体的な使い方

適当なファイルにファイルの名称を出力する

例えば、0.mp4、1.mp4、2.mp4を結合したい場合、次のようなテキストファイルを作成する。
なお、ファイルは絶対パスで指定することが望ましい(今回は、「/home/hoge」においてあることとする。

/home/hoge/0.mp4
/home/hoge/1.mp4
/home/hoge/2.mp4

上記のファイルを、「concat.txt」などで保存しておく。

ffmpegで結合をする

一言で言ってしまうとこんな感じ。

ffmpeg -safe 0 -f concat -i [テキストファイルの場所] -c:v copy -c:a copy -c:s copy -map 0:v -map 0:a -map 0:s? [出力ファイル名]

-fオプションでconcatであることを明示したのち、-iオプションでテキストファイルの場所を指定する。
その後に指定しているものは、次のような意味を持っている(場合によっては必要ない)

  • -c:v copy :ビデオを元データからコピー
  • -c:a copy :オーディオを元データからコピー
  • -c:s copy :字幕データを元データからコピー
  • -map 0:v :ビデオファイルが複数存在する場合は全てのものを同梱する
  • -map 0:a :オーディオファイルが複数存在する場合は、全てのものを同梱する
  • -map 0:s? :字幕ファイルを検索し、存在する場合は全てのものを同梱する

これでうまいことconcatを行うことが出来る。