日本語 English
インターステラ株式会社の技術ブログです

VR180の動画を2D動画にffmpegで変換する

Youtube application screengrab

こんにちは。
阿形です。

弊社ではしばらく前から実験的にVR180で撮影した動画をYoutubeにアップしています。以下のような適当に撮った動画ですが、意外と見られているようです。

さて、今回のテーマですが、このVR180で撮影した動画を流用して最近流行りのショート動画にしたいという要求がありました。やることとしては、VR180の動画を2D動画変換、ショート動画に適した縦画面にし、15秒だけ切り出すという形です。
有償の動画編集ツールでは当然できるのですが、ファイル数も多く自動化したかったので、ffmpegでやってみました。

ffmpegのオプション

結論から入りますが、以下のようなコマンドで実現できました。(ffmpeg 5.0.1で動作確認済み)
入力ファイルはInsta360 EVOで撮影したものをInsta360 Studioでエクスポートしたものを使用しています。

ffmpeg -i input.mp4 -vf v360=input=equirect:output=flat:ih_fov=180:iv_fov=180:h_fov=93:v_fov=121:in_stereo=sbs:w=1440:h=2560 -codec:v hevc -t 15 output.mp4
オプション処理内容
v360VR動画を扱うフィルタ。
input=equirect入力ファイルの設定。equirectは入力ファイルの投影法がequirectangularであることを示す。
Insta360EVOの出力がequirectangularなので、それを指定しています。
output=flat出力ファイルの設定。flatで2Dで出力することを指定している。
ih_fov=180入力ファイルの水平方向の視野。VR180なので180固定。
iv_fov=180入力ファイルの垂直方向の視野。VR180なので180固定。
h_fov=93出力ファイルの水平方向の視野。
v_fov=121出力ファイルの垂直方向の視野。
in_stereo=sbs入力ファイルのステレオモードの指定。ここではSide by Sideを指定している。
w=1440出力ファイルの水平解像度。
h=2560出力ファイルの垂直解像度。
-codec:v hevchevc (H.265)で再エンコードする。
-t 15頭から15秒を切り出し。
ffmpeg オプション

出力ファイルのFOVについてですが、これはGoProのFOVの値を参考に設定しました。ただ、これは任意に設定できるので、自分の好みに設定すれば良いと思います。ここではショート動画に出力するため、縦方向のv_fovの方が大きな値となっています。通常の横長画面の出力の場合は、h_fovとv_fovの値を入れ替えます。

出力解像度は元動画の解像度が2880×2880の正方形なので、それに近い値でWQHD(2560×1440)の縦画面として設定しました。こちらも横長画面の出力の場合はwとhの値を入れ替えます。

最後にhevcで再エンコードしていますが、これは本来は不要なものです。ですがInsta360EVOのメタデータの削除のためにあえて行なっています。

Insta360EVOの出力動画のメタデータに独自データが含まれているようで、ffmpegがそのパラメータを除去できないようです。このため、Youtubeにアップロードすると、正常に2D動画と認識されずおかしな表示になってしまいます。これを避けるため、あえてhevcで再エンコードを行なっています。再エンコードを行う場合はffmpegはメタデータを引き継がないためです。なお、Insta360EVO独特の問題である可能性が高いので、他のVR180カメラで撮影した場合は再エンコードは不要かもしれません。

まとめ

ffmpegはなんでもできるんじゃないかというぐらいオプションが豊富ですが、やりたいことを実現する方法を見つけるのが一苦労ですね。今回のものもかなり探し回ってようやくできた感じでした。同じような苦労をする方のお役に立てれば幸いです。

SNSでフォローする