動画データのエンコードやファイルフォーマットの変更に使うffmpegですが、動画データ自体も編集することができます。今回はffmpegで動画を時間単位で切り出したり、複数の動画をつなげる方法についてまとめていきたいと思います。
時間単位で指定して動画を切り出す
まずは時間単位での動画の切り出しです。オプションで開始から何秒のところから、何秒間切り取るか、という方法で指定してきます。コマンドは下記のようになります。
ffmpeg -i INPUT_FILE -t [second] -ss [second] OUTPUT_FILE
オプションについて詳しくはこちらをご参考ください
| -t |
動画の切り出す時間を秒数で指定します |
| -ss |
切り出す部分の開始地点を動画の先頭からの秒数で指定します |
複数の動画を繋ぎ合わせる
次は複数の動画を繋ぎ合わせ1つの動画データにしていきます。ffmpegのバージョンによって違いがあって少しややこしいのですが、今回は現状の最新版で対応している方法になります。
まずはテキストファイル(.txt)を用意して、その中に下記のような感じで繋ぎ合わせる動画データのファイルパスをリスト状に並べていきます。そして適当なファイル名をつけて保存します。
【concat.txt】
file '/PATH/sample_01.mp4'
file '/PATH/sample_02.mp4'
file '/PATH/sample_03.mp4'
このテキストファイルの作成が終わったら、下記のコマンドで動画を繋ぎ合わせることができます。(テキストファイルと動画は同じディレクトリに用意しておいた方がわかりやすいです)この時、各動画のコーデックが異なる場合は必要なものを指定し、同じコーデックの場合は「-c copy」でコーデックを引き継ぐことができ、書き出しも短時間で終わります。
ffmpeg -f concat -safe 0 -i [FILE_NAME] -c copy OUTPUT_FILE
また、書き出しが完了して確認すると、音声データ、もしくは映像データが反映されていないというケースもあるようです。これは動画の情報がうまく解析できないために起こるようです。その場合は「-analyzeduration」と「-probesize」オプションを使うことで対応できます。
| -analyzeduration |
動画情報の解析時間をマイクロ秒で指定、整数値(int)で指定します。 |
| -probesize |
解析範囲の容量をバイトで指定、整数値(int)で指定します。 |
これらのオプションを使ったコマンドは下記のような感じになります。
ffmpeg -analyzeduration [µs] -probesize [byte] -f concat -safe 0 -i [FILE_NAME] -c copy OUTPUT_FILE
動画のエンコードやフォーマット変換だけでなく、こんな感じで動画編集もできてしまうffmpegはかなり便利なツールですね。これ以外にもまだまだできることがあるようなので、また後日まとめていきたいと思います。
(参考にさせて頂いたサイト)
Concatenate – FFmpeg
ffmpegのオプション -analyzeduration と -probesize