OculusRift DK2 のための 動画の 75fps 変換方法

お久しぶりです。fai です。
Oculus Rift DK2 が届いたので、早速 KaleidoPlayer も対応させました。
SDK 0.4.1 対応の最新版(ベータ3)はこちらです。
前回のベータリリースから、UIの細かなバグも修正していますので、再度ダウンロードして頂ければと思います。



さて、本題の 75fps化です。

このツイートを読んで、やはり 75hz駆動の DK2で動画鑑賞するには、動画自体の 75fps 化が不可欠であると確信しました。そして、いろいろ試行錯誤した結果、現時点でのお勧め変換方法が見つかったので紹介します。
24〜30fpsの動画を75fps化して視聴すると、全ての動画を 75fps化したくなるほどに感動的なので是非一度お試しください。






導入

Oculus Rift で擬似的な大画面で動画鑑賞すると、動画のコマ数不足による飛び飛びな動きと、ディスプレイと映像の更新タイミングのズレから生じるチラつきが非常に気になります。
この問題は、以前から他の再生機器でも同様に起きており、一つの解決策として、Smooth Video Project(SVP)が知られています。
SVPを常駐起動させておくと、動画再生時に自動的に補間フレームを作成して滑らかな動きと、更新タイミングの一致したフレームレートへの変換を実現してくれるのですが、残念ながら、KaleidoPlayerでは満足な結果は得られません。
(高解像度動画ではSVPの処理が間に合わずコマ落ちするのと、SVPで75fps再生させても僅かにタイミングがズレるようです。RiftのDirect HMD Access Driverが改善されれば治るかもしれませんが....)



そこで、SVPでの動的変換はあきらめて、動画ファイルを75fpsに保存してから再生させることにしました。
基本的には、「Convert videos to 60fps」の通りですが、いくつか補足・変更を加えています。

Step 1:

http://www.spirton.com/uploads/60FPS/Files-20131216.zip
をダウンロードして、AviSynth.exe(MT:マルチスレッド対応の2.6版)をインストールします。

toolsフォルダの中身は、最新版を別途入手するので不要です。



AviSynth(MT)の最新版は、こちらにあります。
このサイトでは dll のみの提供なので、AviSynth.exe をインストール後に、
system32 (32bit OS) または syswow64 (64bit OS) フォルダ内の avisynth.dll と入れ替えてください。




MeGUIは、最新の MeGUI_2507_x86.zip をダウンロードしましょう。
http://sourceforge.net/projects/megui/files/?source=navbar

C:\MeGUI 辺りに解凍しておけばOKです。
インストーラから、C:\Program Files (x86) 等に入れてしまうと起動時に毎回管理者権限の確認がでるので不便です。



Step 2:

元サイトでは、MKVToolnix を入れていますが、本記事では MKVコンテナを使わないので不要です。
K-Lite Mega Codec Packは、注意深くインストールしましょう。



Haali Media Splitterは、DSS2方式で動画を読み込ませる場合に必要ですが、変換が上手くいかない場合にインストールすれば良いです。


toolsフォルダの最新版である、InterFrame 2.5.2は解凍後、6つのファイルを
C:\MeGUI\tools\avisynth_plugin\
にコピーしてください。

Step 3:

MeGUIを起動すると以下の画面になります。

Step 4:

Ctrl+R または、メニューから Tools -> AVS Script Creator で以下のウィンドウが開きます。

Step 5:

Config ボタンを押すと以下の画面になります。

Step 6:

New ボタンを押して、75FPSと入力すると以下の画面になります。

Step 7:

75FPS変換用のスクリプトとして、以下のコードをコピー&ペーストしてください。

Setmemorymax(512)
SetMTMode(3,4)
PluginPath = "C:\MeGUI\tools\avisynth_plugin\"
LoadPlugin(PluginPath+"svpflow1.dll")
LoadPlugin(PluginPath+"svpflow2.dll")
Import(PluginPath+"InterFrame2.avsi")
<input>.ConvertToYV12()
SetMTMode(2)
<deinterlace>
<crop>
<denoise>
<resize>
InterFrame(Cores=4,GPU=true,NewNum=75,NewDen=1)

注意 #1:
3行目のフォルダのパス(C:\MeGUI\tools\avisynth_plugin\) が、実際の環境に合っているかどうか確認してください。

注意 #2:
SetMTMode(3,4)
InterFrame(Cores=4,...)
の 4 は、CPUのコア数です。PC環境に合わせて変更してください。

注意 #3:
InterFrame(Cores=4, GPU=true,...)
高級なGPU搭載マシンでは、 GPU=true でGPUによる計算処理が使えます。
オンボードの場合は false にしないとエラーが出ます。


注意 #4:
Setmemorymax(512)
十分なメモリ搭載マシンでは、2048 程度まで上げてください。処理が高速化します。
(32bitアプリなので、4GB以上は設定出来ません..)

Step 8:

Extra Setup タブをクリックしてください。
Haali Media Splitterをインストールしていると
"Prefer DSS2 over DirectShowSource"
が選択できます。

↑※未インストールなので選べませんが、ほとんどの場合問題ありません。

Optional tip #1: You might also want to choose your preferred resizer. For aspect-ratio changes (like from 720x576 to 720x480) a neutral filter like Spline36 will be nice. For actual resizing (like from 1920x1080 to 1280x720) a sharp filter like Spline64 will be best. I usually just leave it on Spline36. Make sure to untick the checkbox on the option after you change the default resizer, otherwise it will always be used by default which is often unnecessary.

Optional tip #2: I recommend changing the "MOD value used for resizing" to mod4. This gives the best balance between compatibility (a lot of devices like PS3 don't have good mod2 support) and aspect ratio accuracy (the higher the MOD value, the more likely the aspect ratio is to be skewed more heavily).

リサイズする場合は参考に…。

Step 9:

動画を選びます。


↓このダイアログが表示されるので、 DirectShowSource を押してください。

Step 10:

Save ボタンを押します。

↑押す度に動画のプレビューウィンドウが開きますが、適宜閉じてください。
動画が正しく読めない場合、プレビューウィンドウでおかしな画像が出ることがあります。
その場合は、Step 9 で、File Indexer を試してください。
動画読込みプラグインが異なるので正常に読み込める可能性があります。

Step 11:

エンコードの設定をします。
Encode settings は、 x264
File format は、RAWAVC
を選び、Config ボタンを押します。


X264の画質設定画面では、Quality値を20に変更し、Newを押して、Quality20等適当に名前を付けてOKします。

Quality値はゼロで無劣化、サイズを気にせずに高画質にするなら 16〜、ネットに上げるなら23〜で、ノイズが気にならないのは20前後…と言われています。

Step 12:

エンコード設定を終えたら、Queue ボタンを押します。

Queue タブをクリックし、Start ボタンを押すとエンコードが開始されます。
(デフォルトでは自動的に開始されると思います)


メニューの Options -> Settings で、キュー追加時の自動開始設定を変更できます。

Step 13:

Step12 で生成された .264ファイルは映像のみが 75fps化された動画なので、これに音声を結合させる必要があります。
Ctrl+5 または、メニューから Tools -> Muxer -> MP4 Muxer で Muxer 設定画面を開きます。

Video には、75fps変換済の .264ファイルを選びます。
Audio には、元の動画が .mp4 の場合は、その動画を選びます。
それ以外の形式の場合は、動画ファイルから音声ファイルを抽出する必要があります。
(MeGUIのメインウィンドウ下側の Audio の機能でmp3を生成することもできます)

Queue ボタンを押して、Start すれば結合された動画が作成されます。

K-Lite Codec Pack に付属してくる MediaInfo ツールで確認すると 75fpsになっていることが確認できます。

変換に使用した、.264 と .avs ファイルは削除してください。

再生時の注意:

  • グラフィックスドライバの垂直同期はオン
  • DK2 は 75hzで駆動させる
    • Extendモードの場合、DK2側をプライマリモニタにしないと 75Hz にならない問題があります。
  • KaleidoPlayer(Unityアプリ)は、VSync有りの Graphics quality で起動する
    • Shiftキーを押したまま 起動させると、Unityアプリの設定画面が表示されるので選べます。
    • ※まだ開発中なので、VSync無しの 「Don't Sync」 が選べます..。

  • KaleidoPlayerが利用している動画再生アセット(AVPro WindowsMedia)には DisplaySync 機能がありますが、これはオフ推奨です。
    • DisplaySyncは操作パネルの8枚目で変更でき、次の動画再生から有効になります。
    • 私見では、20〜30fpsの低fpsの動画で有効であり、75fpsの動画では逆に遅れを生じさせるようです..orz

↑正直なところ、
ドライバの設定が オフ/オン/適応/適応(ハーフ) の4種類
Unity の Graphics quality 設定が、Don't Sync/Every VBlank/Every Second VBlank の3種類
DK2との接続が Direct Mode/Extend Mode の2種類
AVPro の DisplaySync が On/Off の2種類
で、どの組合せが一番良いのか?まで詰め切れていません。
PC依存で変わるかも知れませんので適当に試してみてください。







最後に:

(1)元記事では MKV に変換していますが、本記事では MP4 にしています。これは、MKVコンテナの動画では、同じ75fps であるにもかかわらず、完全に同期して再生できなかった為です。コーデックの設定等で解決するのかも知れませんが、現時点では MP4 でのみ動作確認できています。


(2) 75fps変換には、スクリプト式動画編集ソフト AviSynth を使用しており、動画入力方法(関数)はこちらに説明があります。
本記事では、DirectShowSource を採用していますが、動画によっては画面サイズ次第でも不具合が出ます。
その場合は、動画選択時に File Indexer を選べば、FFmpegSource を使用できます。
Haali Media Splitterをインストールすれば、DSS2 も利用可能になります。
プレビュー時点で画像がおかしい、あるいは、99%変換時に固まる等、変換に問題がある時は適宜変更してみてください。



(3) fps変換設定の調整については、こちらに InterFrame 関数の説明があります。デフォルト設定では多少のカクつきが残るものの、実写からアニメまで各種素材で良好な結果が得られる気がします。(スムーズにするほど、不自然な形状≒artifactsが生じるので妥協しましょう..)



(4) MeGUIのバッチ処理について。
処理内容は、.avsのテキストファイルと joblists.xml と jobs/jobNN.xml で管理されているので、これらのXMLテキストを自動生成できると一括変換も可能です。
(XMLは、ActivePerlのスクリプトで encoding="Shift-JIS" で出力しても動作しました..。perl を編集できて、ベタなスクリプトでも欲しい人はコメントください)