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

2019年11月3日DTV・ffmpegffmpeg,concat,エンコード

 

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

当方環境のffmpegバージョン

ffmpegversionN-83006-g4c63910Copyright (c) 2000-2017theFFmpegdevelopersbuiltwithgcc 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」においてあることとする。

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

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

ffmpegで結合をする

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

ffmpeg-safe 0 -fconcat-i[テキストファイルの場所]-c:vcopy-c:acopy-c:scopy-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を行うことが出来る。

Posted by webnetforce