#ChannelPlayer · VRソフト

ダイレクトジャンプ機能

Channel Playerでは、動画再生中にYボタンを押すと、プロパティダイアログが表示されます。

一番上に表示されているものは、現在再生中ファイルが保存されたフォルダ名です。ダイアログの中にはボタンが4個と、右上にキャプチャーボタンが表示されます。
4個のボタンのうち、現在再生中のファイル名を表示しているボタンにフォーカスして、このダイアログが開きますが、ダイアログを開いて、そのまま左右にスティックを動かせ、トリガーを引くと再生位置を変更し、ダイレクトジャンプを実行します。他のファイルでの再生とする場合には、上下にスティックを動かせば選択可能です。

ボタン上の再生位置をスティックの左右動作で変更する際、右端まで持って行ってトリガーを引くと、次のタイトルの先頭からの再生になります。もっともそれよりも、スティックを一つ下げてトリガーを引けば、通常は次のファイルの先頭からの再生となります。タイバーの位置が変更されている場合には、その位置からの再生となるのでご注意ください。

広告
#ChannelPlayer · VRソフト

2D 縦長動画が大きく表示される理由

Channel Playerでは、2Dの横長動画はフルHDとなる横と縦が1920×1080ドットであることを想定してスクリーンを設置しており、RiftやQuestでスクリーンを見たときに、左右に首を振らずとも見える最大限のスクリーンとして表示している。

2Dの縦長動画を表示する場合、縦と横が1080×1920ドットであれば、1920×1080の横長のスクリーンを縦にしたときの大きさで表示されれば必要充分な仕様だとは思う。しかしChannel Playerでは、出来るだけ大きなスクリーンとしたかったために、横は1080ドットの元映像を1920ドットまで広げて表示を行う。

その結果、アスペクト比そのままだと縦は、1920 x (1920/1080) = 3413ドットまで広げることになり、縦横約1.7倍に広げて表示することになる。

2Dの縦長動画の再生は、他のアプリでは、縦が詰まってしまい横長動画よりも見劣りしてしまうが、Channel Playerでは、どーんと大きく表示される。このことをお知らせしておかないと、びっくりするかもと思い、ここに記した。

もしも、横長動画も大きく表示させたい場合には、カメラ位置をスクリーン近くに寄せてください。逆に縦長動画が大きくて困る場合には、カメラ位置をスクリーンから遠ざけてください。左側のスティックで操作可能です(カメラ移動をポーズ中のみとしている場合にはポーズしてからとなります)。

#ChannelPlayer · Unity · VRソフト

静止画のGamma → Linear 変換

Channel Playerでは、動画だけでなく静止画の描画も実装している。静止画だが180/LRフォーマットで、3D表示させる実装は今まで実現していなかったので現在実装中である。ちなみに参考にしているサイトはUnity_Panorama180Viewである。

静止画を一度表示した後で、2D/Monoから、180/LRにフォーマットを変換した場合、動画とは異なりTextureに再ロードが必要となるが、SteamVR版に比べQuest版は異様に遅いので、どこに問題があるか調べていた。

結論は、Texture2Dに展開後のGamma→Linear変換に時間がかかっていた。8000×4000ドットの静止画だと、大体4秒ぐらいかかる。

Quest版は、SteamVR版のUnity環境のビルドターゲットをWindowsからAndroidに変えたものであるので、基本的には全く同じように動作するはずである。しかし、SciFiシアターシーンでは問題無いが、Playerシーンでは、どうしても暗い映像となってしまい、Ver1.28以前では、ビルド時の色空間をLinearではなくGammaとしていた。

Ver1.29では色空間をLinearにした結果、SciFiシアターシーンも明るくなったが、Playerシーンでは、静止画表示の際、Gamma→Linearに変換することが必要となった。

それでも1920×1080程度の大きさの静止画であれば問題無かったが、評価用に用いた静止画の180/LRの静止画はその約16倍の面積であり、このときのGamma→Linear変換の時間が長くなってた。

Gamma→Linear変換は、RenderTexture(Texture2D)を画像保存すると暗い時での取り組みを参考にして、以下のようなコードを書いていた。

    private void gamma_correct(Texture2D tex)
    {
#if UNITY_ANDROID
        if (tex != null)
        {
            // ガンマ補正
            var color = tex.GetPixels();
            //Debug.Log(DateTime.Now.ToString("HH:mm:ss.fff") + ": 13 LinearToGammaSpace start");
            for (int i = 0; i < color.Length; i++)
            {
                color[i].r = Mathf.LinearToGammaSpace(color[i].r);
                color[i].g = Mathf.LinearToGammaSpace(color[i].g);
                color[i].b = Mathf.LinearToGammaSpace(color[i].b);
            }
            //Debug.Log(DateTime.Now.ToString("HH:mm:ss.fff") + ": 14 LinearToGammaSpace done");
            tex.SetPixels(color);
            //Debug.Log(DateTime.Now.ToString("HH:mm:ss.fff") + ": 15 tex.SetPixels(color) done");            
        }
#endif
    }

でも、ここに時間がかかることが判ったので、【Unity】【C#】ガンマ(Gamma, sRGB) – リニア(Linear) 値の相互変換  の情報を参考にして、以下コードに書き換えた。その結果、約4秒が0.8秒ぐらに短縮できた。その他の処理もあるので、8000×4000ドットの静止画だと残念ながらページめくるだけでも2秒ほどかかる。Quest 2はそもそも片目2Kぐらいの解像度なんだから、もっと小さい面積の静止画で十分だろうとは思う。

    private void gamma_correct(Texture2D tex)
    {
#if UNITY_ANDROID
        if (tex != null)
        {
            // ガンマ補正
            var color = tex.GetPixels();
            //Debug.Log(DateTime.Now.ToString("HH:mm:ss.fff") + ": 13 LinearToGammaSpace start");
            for (int i = 0; i < color.Length; i++)
            {
                //color[i].r = Mathf.LinearToGammaSpace(color[i].r);
                //color[i].g = Mathf.LinearToGammaSpace(color[i].g);
                //color[i].b = Mathf.LinearToGammaSpace(color[i].b);
                color[i].r = linearValue(color[i].r);
                color[i].g = linearValue(color[i].g);
                color[i].b = linearValue(color[i].b);
            }
            //Debug.Log(DateTime.Now.ToString("HH:mm:ss.fff") + ": 14 LinearToGammaSpace done");
            tex.SetPixels(color);
            //Debug.Log(DateTime.Now.ToString("HH:mm:ss.fff") + ": 15 tex.SetPixels(color) done");            
        }
#endif
    }

    private float linearValue(float gamma)
    {
        return gamma * (gamma * (gamma * 0.305306011f + 0.682171111f) + 0.012522878f);
    }