それFFmpegで出来るよ!2


それFFmpegで出来るよ! の続きです。
久しぶりに記事を更新したら、Googleの検索順位が変動したので、更新分をこちらへ一時的に移動してみることにしました。
ケース8~10はこちらに書きます。

ケース8:動画を連結したい

動画同士を連結したいときもFFmpegなら比較的簡単!

まずは連結したい動画のリストを作る
input01.mp4input02.mp4input03.mp4 を連結したいときは以下のように inputs.txt に書く

inputs.txt
file './input01.mp4'
file './input02.mp4'
file './input03.mp4'

inputs.txt を作成して、次のコマンドを実行すると、複数の動画が連結される。

inputs.txtにリストされた動画を連結してoutput.mp4を作成する
ffmpeg -f concat -safe 0 -i inputs.txt -c copy output.mp4

-safe 0のオプションをつけているので、動画リストのファイルパスは絶対パスでも相対パスでも良い。
連結したい動画のコーディック(h.264やvp9など)がすべて同じなら -c copyオプションをつけることで、 高速・無変換・無劣化 で連結できる。

連結する動画がたくさんあるならこのやり方でも手間はかからないが、 動画A+動画B=動画Cみたいに、2つの動画をつなげたいときに、inputs.txtを作成するのは手間
そんなときは以下のコマンド、-filter_complexsを使って結合する

input01.mp4とinput02.mp4をつなげてoutput.mp4を作成する
ffmpeg -i input01.mp4 -i input02.mp4 \
-filter_complex "[0:v:0][0:a:0][1:v:0][1:a:0]concat=n=2:v=1:a=1[outv][outa]" \
-map "[outv]" -map "[outa]" output.mp4

-filter_complex の詳細は長くなるので、ここでは割愛する

拡張子・コーディックが違くても大丈夫

input01.mp4とinput02.webmをつなげてoutput.movを作成する
ffmpeg -i input01.mp4 -i input02.webm \
-filter_complex "[0:v:0][0:a:0][1:v:0][1:a:0]concat=n=2:v=1:a=1[outv][outa]" \
-map "[outv]" -map "[outa]" output.mov

ただし、動画を連結する際、気をつけないと行けないのは、異なるサイズの動画は上記の方法では連結できない...
例えば、 「解像度640x480 の動画」と「解像度1920x1080 の動画」を結合することはできない。もし結合したい場合、どちらかの解像度に ケース6:動画をリサイズする を参考に、解像度を変換してから結合する。

ケース9:動画をクロップ(トリミング)したい

画像でよくするトリミングもFFmpegならコマンドだけできる!
基本的なコマンドは次の通り

動画をクロップする
ffmpeg -i input.mp4 -vf crop={X size}:{Y size}:{X position}:{Y position} output.mp4

切り出す基準となる原点と、そこから切り出す動画の解像度を指定する
X size : 切り出す横幅ピクセル数
Y size : 切り出す横幅ピクセル数
X position : 切り出すX座標原点
Y position : 切り出すY座標原点

例を挙げると次のように指定する

動画を左上からX座標50ピクセル、Y座標75ピクセルの位置から横1280ピクセル、縦720ピクセルのサイズでトリミングする
ffmpeg -i input.mp4 -vf crop=1280:720:50:75 output.mp4

難点なのは、絵を見ながら切り抜けないところではあるが、
半分の大きさや1/4の大きさを切り出すといったときには、とても便利

参考: https://w.atwiki.jp/kobapan/pages/173.html

ケース10:動画の特定の時間範囲を取り出したい

執筆中

編集後記

一つの記事に情報量を詰め込むのはあまり良くないんですかね...