普通のビデオをVRゴーグルで見るためにmpvプレーヤーのlibavfilterを書いてみた

タイトル
スマホを取り付けるVRゴーグルで普通のビデオを見たいです。どんなアプリでできるのか知りません。mpvプレーヤーなら再生時にフィルターをかけて左右同じビデオ映像を映すことができます。

スマホを取り付けるVRゴーグルを買いました。VRをやりたいわけじゃなくビデオを見る時の拡大鏡代わりにしたいのです。そこで、左右にレンズがあるだけではなく一枚の拡大鏡にも取り替えられるタイプのVRゴーグルを買ってみました。


少しお値段が高くなります。さっそく試してみますが・・・見えない。
老眼の私の眼ではピントが合いません。スマホをあと2~3cm遠ざけられれば見えそうなのですが。老眼・遠視の方はご注意を。
という事で期待した拡大鏡は全く使えない事が判りました。しかたなく左右にレンズがある普通のVRゴーグルみたいに使います。

この時問題になるのが左右に映像を映さなくてはならないこと。普通のビデオを左右に表示してくれるアプリは多分あるのでしょう。でもどのアプリでできるかがわかりません。有料アプリを買うほどの話でもありません。

ビデオ映像を2つに並べるだけならffmpegのlibavfilterでできます。私は普段からlibavfilterが使えるmpvプレーヤー系列のプレーヤーを使っています。
関連記事:

という事で2つ映像を並べるフィルターグラフを書きます。
まず、2つ映像を並べるにはどんなフィルターを使えば良いでしょうか?ざっくり選んでみます。すると次のフィルターが候補に上がります。
  1. stereo3dフィルタ:ステレオ映像の形式を変換する
  2. overlayフィルタ:映像を重ねて合成する
  3. hstackフィルタ:複数の映像を水平に並べる
stereo3dフィルターはステレオ形式の映像を異なる形式に変換します。ステレオではない映像もステレオ形式として解釈させ、左右に映像を並べることができます。ただし元の映像を2分割するので解像度が下がります。スマートフォンの解像度ならそれほど問題にならないでしょうが少しもったいないので使いませんでした。

overlayフィルタは映像の上に他の映像を重ねるフィルターです。2倍の横幅の映像を作って、その上に表示したい映像を左右に2回重ねれば良さそうです。処理が重くなるのでスマートフォンによっては処理が間に合わずカクカクした表示になるでしょう。

hsatackフィルターは複数の映像を水平方向に並べます。overlayフィルターより高速だそうです。今回の目的に一番あっています。

hstackフィルターを使う

mpvプレーヤーでhstackフィルターを使い、ビデオ映像を左右に2つ並べる処理を書いてみましょう。mpvプレーヤーはパソコン用とandroid用があります。私は派生版のmpv.netを愛用しています。iphone用があるかは知りません。フィルターの設定方法は基本的に皆同じです。
独自の設定はmpvの設定ファイル mpv.conf に記述します。テキストファイルなのでテキストエディタで開きます。
mpv.confの一番最後の行に次のように書きます。
[prof-stereoscopic]
vf = lavfi="split=[l][r];[l][r]hstack"
"vf"はビデオフィルターを設定するコマンドです。"lavfi"はFFmpegのlibavfilterを使うという意味です。mpvプレーヤー自体とlibavfilterライブラリに同じ名前のフィルターがあるとどちらを使うかわからないのでlibavfilterの名前だと宣言します。lavfiの後はFFmpegのフィルターと同じ記述の仕方です。
hstackフィルターは入力された2つの映像を左右に並べるので、2つの入力映像が必要です。そのため、hstackフィルターの前にsplitフィルターを使います。splitフィルターは一つの映像を2つに分けます。

"[]"はプロファイルです。プロファイル名は"prof-stereoscopic"としました。プロファイル内の記述をひとまとまりに扱えます。
mpvプレーヤーを動かした時にプロファイルは読み込まれません。何かキーを押したら呼び出すようにします。mpvプレーヤーはキー入力での動作を決める事ができます。その設定はinput.confファイルで行います。input.confファイルの最後の行に次のように書きます。
alt+KP3     apply-profile "prof-stereoscopic"
altキーを押しながらテンキーの"3"を押したら”prof-stereoscopic”プロファイルを呼び出します。そしてプロファイルに記述したフィルターが適用されます。

スマートフォンの場合はプロファイルを使わない方が良いでしょう。プロファイル名の行は削除して書いてください。スマートフォンにはキーがほとんど無いのでinput.confを書く必要は無いでしょうがBluetoothでキーボードをつなげば使えるでしょう。

hstackは高速に動作しますが古いスマートフォンなどCPU性能が低いスマホでは処理が間に合わずカクカクした映像になるでしょう。

padフィルターで映像サイズと左右の間隔を調整する

hstackフィルターは単に映像を並べて表示するだけです。スマートフォンの画面サイズによっては左右の映像が離れすぎて眼がおかしくなるとか画面が広すぎて端の方が見えないとかあるでしょう。そこでpadフィルターで余白を作り映像の調整をします。
  1. padフィルター: 映像に余白を設ける
padフィルターを使うとかなり処理が重くなります。
スマートフォンの画面やVRゴーグルに合わせて画面サイズや余白を調整します。私の場合の例を次に書いておきます。前述のhstackフィルターの替わりに次のように書きます。
vf = lavfi="split=[l][r];[l]pad=1.4*iw:1.4*ih*2*dar/2.17:0.25*iw:ih*(1.4*2*dar/2.17-1.5)[l2];[r]pad=1.4*iw:1.4*ih*2*dar/2.17:0.15*iw:ih*(1.4*2*dar/2.17-1.5)[r2];[l2][r2]hstack"
かなり複雑になりました。最初のsplitフィルターと最後のhstackフィルターは同じです。padフィルターで左目用右目用の余白を作っています。
余白の計算は次のようになっています。
padフィルターの座標
使っているスマートフォンの画面のドット数sw,shを調べてください。画面の縦横比に合わせた余白を追加しています。
Aは1以上の数字を指定します。元映像の横幅をA倍して左右の余白を作ります。例では1.4にしています。
BはB<(A-1)の範囲を指定します。左右の映像の間隔が変わります。例では0.25にしています。
Cは映像の高さの調整です。例では1.5にしています。

ややこしくてこの説明を書いている時でも合っているか間違っているかわからなくなります。

padフィルターを使うとPixel 6 Proでも4Kビデオを見るとカクカクします。かなり処理が重いです。FHDなら見れますが発熱してくると処理が間に合わなくなるかもしれません。

ビデオ





コメント

最近のコメント

Threaded Recent Comments will be here.