ffmpegで動画を結合する(最新版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を行うことが出来る。