左右の動画を結合する
3Dの撮影が可能でないカメラで動画を撮影した場合、別々の動画ファイルが作成されます。これらの左右の動画をくっつけて1つの動画ファイルにする必要があります。
ここでは、あらかじめ2つの動画の開始、終了のタイミングが一致するように調整済みの動画ファイルであることを前提としています。
ffmpegを使用
基本系
一番シンプルに単純に左右でくっつける場合は以下でOK
ffmpeg.exe -ss 0.0 -i LEFT.MP4 -ss 0.0 -i RIGHT.MP4 -filter_complex “[0:v][1:v]hstack[v]” -map “[v]” OUTPUT.MP4
-ss 0.0 -i LEFT.MP4
1つ目(左)の動画にLEFT.MP4を指定。開始時間は0.0秒。終了時間は指定していないため、動画の最後まで。開始時間を変える場合は0.0でなく、開始したい秒数を指定。動画全部でなく一部を使いたい場合は、-tオプションで秒数を指定することもできる。
-ss 0.0 -i RIGHT.MP4
2つ目(右)の動画にLEFT.MP4を指定。指定方法は1つ目の動画と同じ。
-filter_complex “[0:v][1:v]hstack[v]”
1つ目の動画の映像([0:v])と2つ目の動画の映像([1:v])を、横方向にくっつける(hstack)。くっつけたものを「[v]」とする。(今回、音声データは扱わない)
-map [v] OUTPUT.MP4
[v]が出力対象であることを指定し、「OUTPUT.MP4」というファイル名で保存することを指定する。
SBSでなくTABで結合する場合
hstackは、水平方向にくっつける指定。なのでSBS動画ができる。
垂直方向にくっつけたい場合は、vstackを指定すればOK。
左右の動画に縦位置のずれがある場合
2台のカメラで動画を撮影すると、どうしても微妙なずれが発生する。それを調整してくっつける場合は、cropとpadを使用すればOK。
例えば、左右の動画が縦方向に10ピクセル分ズレていて、左の動画を10ピクセルだけ下げたい場合は、filter_complex部分を以下のように記述する。
-filter_complex [0:v]crop=iw:ih-10:0:10[2];[2]pad=iw:ih+10:0:0[3];[3][1:v]hstack[v]
[0:v]crop=iw:ih-10:0:10[2];
1つ目(左)の動画をクロップ([0:v]crop)する。クロップの範囲は=の後に記述する。
縦方向のずれ調整のため、横方向は調整せず全部使うため、iw(入力の幅)をそのまま指定。
縦方向は入力から10ピクセル減らすため、ih-10を指定。
切り取りの開始位置は、(0:10)横方向が0ピクセルから、縦方向は10ピクセルからを指定。
最後に、クロップ結果を「[2]」として終了。
[2]pad=iw:ih+10:0:0[3];
クロップした左の動画([2])の高さは、右の動画([1])よりも10ピクセル減っているため、横方向の結合ができない。そのため、減った分を埋めなければならない。そこでpadを使う。
入力は先ほどクロップした「[2]」を指定。操作にはpadを指定する。
動画の幅は変更しないため、iw(入力の幅)をそのまま指定。
縦方向はpadした結果、10ピクセル増やしたいので、ih+10を指定。
今回の例ではcropで動画の上10ピクセルを削ったので、下側にpadを行いたい。
そのため、入力動画[2]は全部を使う必要があり、開始位置は「0:0」を指定する。
padをした結果を「[3]」とする。
[3][1:v]hstack[v]
左の動画は、[0:v] → crop → [2] → pad → [3]と加工を行った。
右の動画は何もしていないため、[1:v]で映像を指定する。
hstackした結果を[v]としたら左の動画の上10ピクセルを削って、下に黒帯10ピクセルを足した映像の出来上がり。あとは-map [v] OUTPUT.mp4で出力指定すればOK。
GPUでエンコードしたい
動画の書き出しは時間がかかるので、GPUがあるならGUPエンコードを使いたい。画質はCPUエンコードに比べて若干落ちるらしいのだが、違いは結局よくわからない。というか、動画にはそこまで画質を求めてないので気にしない。
GPUはNVIDIAのモノ前提で、NVIDIAが提供しているエンコードで説明。
h264(h264_nvenc)
最近はh264は使ってません。ニコニコ動画はh265がダメみたいで、h264ならOKだった。ということで以下は結合した動画を再圧縮するときのコマンド。
ffmpeg.exe -i INPUT.mp4 -i sound.mp3 -shortest -strict unofficial -metadata “frame-packing”=”3” -c:v h264_nvenc -profile:v high -g 150 -b:v 0 -cq 28 OUTPUT.mp4
ついでに音楽を付けて、3Dのメタデータ付けてます。
-c:v h264_nvenc -profile:v high -g 150 -b:v 0 -cq 28
エンコードと画質設定は難しくてよくわからない。とりあえず、-cqの値を下げると動画はきれいになるけどサイズが大きくなる。数値を上げるとその逆。
h265(hevc_nvenc)
h264は、動画の縦横サイズのどちらかが4096ピクセルを超えると使用できない問題がある。そのため、最近はもっぱらh265を使用してます。
ffmpeg.exe -ss 0.0 -i LEFT.MP4 -ss 0.0 -i RIGHT.MP4 -filter_complex [0:v][1:v]hstack[v] -c:v hevc_nvenc -b:v 0 -cq 30 -bf 3 -b_ref_mode each -map [v] OUTPUT.MP4
こちらは左右動画をくっつけて、h265で書き出す例
-c:v hevc_nvenc -b:v 0 -cq 30 -bf 3 -b_ref_mode each
何がどういう指定なのかはさっぱりだけど、-cqの値をいじるとサイズと画質が変わるのは一緒。