#ChannelPlayer · Quest2 · Rift · Unity · VRソフト

動画の色補正とホワイトバランスの実装

具体的には、HSV(Hue:色相、Saturation:彩度、Value/Brightness:明度)や、Contrast:コントラストの調整と、ホワイトバランス(Temperature, Tint)の調整機能をChannel Playerに実装することを考える。

HSV, Contrast, Temperature, Tintの各VR Playerの実装状況を調べてみて、Channel Playerで実装すべき項目を表にして考えてみた。設定できるもの何でもてんこ盛りのHere Sphereでは、Hueの代わりにTintを実装しているように見えるが、どちらで色を調整するかは好みであるとも言えるため、Channel Playerでは両方実装する方針とした。なお現状のShaderのコードでは、SV, Contrastと、Temperature, Tintは実装してある。Hueを実装したShaderにはしていないが、参考情報を元に、HSVのShaderにContrastを追加することを考えることとした。

PigasusHSV, Contrast
DeoHSV, Contrast
SkyboxSV, Contrast
PLAY’ASV, Contrast
HereSphereS, Contrast, Temperature, Tint
Channel PlayerHSV, Contrast, Temperature, Tint

参考情報

広告
#ChannelPlayer · Go · Quest2 · Rift · Unity · VRソフト

Youtube DL Video Playerアセットを使ったUnityアプリをOculus Quest 2で動作させる

ここ2か月ほどかけて、Youtube DL Video Player というUnity Asset Storeで公開されているAssetを試していた。これは内部に aarファイルの形式で、PythonバイナリとPythonで書かれたyoutube-dlを動作させ、Youtubeのコンテンツの実際のURLを引っ張り出して再生できるようにするもので、これをChannel Playerに組み込むか、あるいは単体アプリとしてYoutubeの動画再生機能をOculus Quest2で動作させるのが目的であった。(ちなみにUnity Asset Storeでは、Youtube Video Player + Youtube APIというAssetも存在し以前使ったこともあるが、古い昔のバージョンとは異なり、近年のバージョンではherokuapp.comを内部で呼んでいてアーキテクチャが理解できていないので保留している)

当初、サンプルアプリを作って、Oculus Goでも動くようにとARMv7向けにbuildしたら、Goで動くことが確認出来た。しかし、これをそのままQuest 2にインストールしても動かず、またARM64向けにbuildしても同様で動作せず、そこからが迷走の始まりであった。

まずエラーメッセージを見ると、ARMv7版とARM64版ではどちらも同じエラーであり、以下のようなものであった。

10-19 00:13:01.571: E/YoutubeDLPlugin(31518): java.io.IOException: Cannot run program “/data/user/0/com.Applet_LLC.myTube/files/youtubedl-android/packages/usr/bin/python”: error=13, Permission denied

Youbue DL Video PlayerのAsset Storeのレビューでは、IL2CPPではbuildできないとか、Android 10ではダメだとかしか書かれておらず、要するにARM64なOculus Quest 2では出来そうにないことが書かれていて断念していたのだが、実行できないのは、このaarプラグイン形式がダメなのだろうと思い、Youtube DL Video Playerアセットを使うのをやめて、NuGetから、NYoutubeDLというyoutube-dlをC#から呼び出すラッパーを試してみた。結論はOculus Riftでは動作できるようにできるが、このラッパーは、youtube-dl.exeを実行するものであるので、解決策からは、ほど遠いものであった。

Pythonが実行できないとダメだと思い、調べてみるとTermuxというアプリで、shellを起動しpythonを実行して、youtube-dlスクリプトを動作させることが出来ることが判った。しかしこれは、Linux Shellが使えるようになるだけで、UnityのC#から呼び出すことはできない。そこで、今度はIronPython for Unityとpython-for-androidを試すことにした。これらは、pythonスクリプトを実行できるが、前者はUnity Editor環境でPythonスクリプトが使えるようにするもので、アプリには出来ない。後者は、もっと調べてみると、Buildozerというpython-for-android を組み込んで書かれたPythonスクリプトを、kivyと呼ばれるGUIを持ったPythonスクリプトをAndroidで動作できるようにAPKファイルを作るものがあったので、それをWSLのUbuntu環境でbuildして、APKを作ることが出来るようになった。ここでBuildozerで、kivy GUIを使わないコードにすればGUIを持たず良いのではと思い、youtube-dlの派生版である yt-dlpを inportするようにしてAPKを作成した。Buildozerは良く出来ていて、Pythonスクリプトや buildozer.spcに yt-dlpのキーワードを書くだけで、勝手にyt-dlpをgetしてbuildしてしまう。このAPKをインストールして、Unityで作ったサンプルアプリから、Intentにyt-dlpの引数を渡して、Pythonスクリプトでは、Intentをyt-dlpの引数に渡すようにして、yt-dlpが実行した際の標準出力をファイル出力させれば、UnityのVideoPlayerやAVPro VideoのPlayerが解釈できるURLを吐き出すことが出来るはず。その後、Unity側から、そのファイルを読み込んで、Playerに渡せば、どうにか動くようにできるのではと作っていたが、Unityから引数が渡せて、Pythonとyt-dlpが動作するようになった時点で、困った事態が発生していることが判った。それは、Unity側のアプリから呼び出したyt-dlpのActivityは、要するに別アプリなので画面が遷移してブラックアウトしてしまう。これではアプリとして成立せずダメだと思いAndroidのサービスプログラムにしなければと、さらなる深みに入ろうとしていた。これが先週末あたりの出来事である。

ここで、迷ったら最初に戻るよろしく、最初のエラーメッセージから解決策が他にないのかを探ることにした。まず、なぜ先のエラーメッセージになっているのかを調べることにした。

そもそもエラーメッセージは、実行権限が無いと言っているだけで、実行ファイルでは無いとかファイルが存在しないと言っているわけでは無い。そこでこのエラーメッセージで検索して調べてみると以下の情報が得られた。

What path to put executable to run on Android 29? – Stack Overflow https://stackoverflow.com/questions/64786837/what-path-to-put-executable-to-run-on-android-29/64792194#64792194

これは、Androidのlevelが29以降だと、アプリのフォルダに置かれたバイナリを実行することが出来ないというものであり、これに該当していたことになる。Google Playとは異なり、Oculus Quest 2の場合は、TargetSDK level は29以上である必要は無いので(25以上であれば良い。ただしAppLabに登録するなら29となります。)、TargetSDKを下げてやれば、実はQuest 2でも先の Youtube DL Video Playerをそのまま使って動作できるのではと考え、実行に移してみた。

Unityの場合、TargetSDKは、Plugin/Androidに置いた AndroidManifest.xmlにも記載場所があるが、実際にbuildする際は、UnityのPlayerSettingsのTargetAPI Levelの指定が有効となる。ここをAutoにしていると環境に依存し、使えるAndroid SDKの一番高いレベルのものでbuildしてしまう。そこで、ここを28にして、ARM64向けにbuildしたら、エラーメッセージは発生せず、無事にYoutubeのコンテンツがサンプルアプリでOculus Quest 2の中で再生できた。

入手したスキル。Ubuntu環境にてBuildozerでAPKの作り方。Pythonスクリプトの書き方(触りだけだけど)。UnityのC#コードから他のAndroid Activityを呼び出しIntentを渡す方法。Pythonスクリプト側で受け取ったIntentを引数として解釈する方法、Pythonでstdin/stdoutをファイル出力に変える方法と、intentをsplitしてsys.argに代入すると、そこから呼び出したPythonスクリプトは、引数が存在していることを想定しているので、うまく渡る。

#ChannelPlayer · FOVE · Quest2 · Rift · Unity · VRソフト

Channel Player 1.28リリース

今回のバージョンにて、Quest2版は、Oculus AppLabからの配信となりました。
それ以外の更新内容としては以下となります。ソフトウェアのページでは、SteamVR版の御案内もあります。

2021-06-18 1.28
・SteamVR/Quest2版共通
 ラジアルメニュー右側
 - タイトル選択画面 輝度変更機能を追加
 - 動画再生中 ホワイトバランス(色温度、色合い)と輝度変更機能を追加
・Quest2版
セキュリティ脆弱性審査のために、AndroidManifest.xml に activity android:taskAffinity=”” を追加

2021-06-15 1.27 (一般向けには未公開)
・Quest2版 AppLab提出


#ChannelPlayer · FOVE · Quest2 · Rift · Unity · VRソフト

Channel Player 1.26リリース

ソフトウェアのページで御案内しているChannel Playerですが、この度、動画デコーダであるAVPro Video を2.0版(Ver. 2.1.3, 2021-05-14リリース)に差し替え、VRのステレオ動画フォーマットの自動認識に一部対応しました。Quest版では、AppLab申請中のため、今までは32bitのバイナリでしたが、ARM64向けの64bitのバイナリに変更しています。

AVPro Video 2.0版そのままでは、VRステレオ動画フォーマットの自動認識失敗したときに正しい形式に手動で切り替えることはできないのですが、動画プレイヤーでそれが出来ないと致命的なので、先日調査したときに書きましたが、Asset側コードに手を入れて対応しています。

またQuest2向けでは、AVPro Video 2.0版がGradle buildのみ対応となったので、build方法を変更したため、以前と異なるBuild IDとなっています。その結果、以前のバージョンがインストール済だとインストールに失敗します。その場合にはSideQuestアプリを用いてGame Dataのバックアップとアプリのアンインストールを実施してから、新しい版のインストールを実施して、その後Game DataをSideQuestアプリから戻すことで、フォルダ設定やお気に入りを残したままに出来ます。ご面倒をおかけしますが、よろしくお願いいたします。

#ChannelPlayer · FOVE · Quest2 · Rift · VRソフト

Channel Player 1.20リリース

Cahhel Playerの新しい版をリリースしました。ソフトウェアのページやSteam, SideQuestでご案内しています。

今回のアップデイト内容は、ダイレクトジャンプ機能を追加しました。ダイレクトジャンプ機能とは、動画再生中にYボタンをクリックするとダイアログが表示されます。そのダイアログではフォルダ内のファイルの一覧がボタンで表示され、上下移動してトリガーで直接選択出来る他、左右にマーカーを移動させて、動画ファイルの任意の位置にジャンプして再生指示することが可能です。ぜひお試しください。

その他更新履歴に記載した内容は以下となります。

2020-03-21 1.20
・以下の機能追加を実施

  • ダイレクトジャンプ機能の実装
    動画再生中にYボタンでダイアログが表示されます。
      上下左右にスティックを操作して、トリガーにて選択したファイルのマーカー位置にジャンプします。
  • Quest2版において、内蔵ストレージでの動画再生の際、動画をキャプチャーしてサムネイルする機能の有効化

・以下の仕様変更や機能修正を実施

  • キャプチャ機能操作方法変更
    動画再生のポーズ中に、Yボタンでキャプチャできる機能は、Yボタンをダイレクトジャンプ用のプロパティダイアログ表示に変更したため、プロパティダイアログ内のキャプチャーボタンとして実装を変更しました。
  • 拡張子 大文字対応
    拡張子が大文字となるZIPやJPG、MP4も表示対象となります。以前は無視していました。
  • フォルダ名表示文字数拡張
    タイトル選択画面や動画再生中の情報表示では、省略せずに表示可能な文字数を100文字から140文字に広げました。

・制限事項

  • トリガー操作によるトリックプレイにおいて、ダブル、トリプルクリックやワープジャンプが機能しないことがあり
    制限事項に追記しました。なおスティック操作やプロパティダイアログからのジャンプ操作は可能です。
#ChannelPlayer · FOVE · Quest2 · Rift · VRソフト

Channel Player Ver1.19リリース

VR動画再生アプリであるChannel Playerの新しい版をリリースしました。今回は新たにコミックブック(zip, cbzファイル形式)に対応し、静止画の表示が可能です。Channel Playerは、宇宙空間にて宇宙船の中のシアタールームでの動画視聴という体裁をとっているため、シアターでの上映時には真っ暗となる代わりに、宇宙空間に飛び出した状態で閲覧することとなります。ただし180°や360°の動画の場合には真っ暗な状態となります。詳しくはソフトウェアのページにてご案内しています。

#ChannelPlayer · FOVE · Rift · Unity · VRソフト

Channel Player静止画対応

Youtube対応は、正常に再生できないフォーマット(EACのこと)があるので保留として、静止画対応を進めている。
もともとスクリーンいっぱいにサムネイル表示する機能があるため、jpgやpngは表示可能であるが、動画プレイヤーであるため、動画ファイルが存在しないフォルダは再生対象として除外していたので、それを改め含めるように直した。

現在、フォルダに動画ファイルがひとつもない場合、再生開始すると、ファイル名の拡張子を見て、AVProVideoを動作させずに、1枚だけ表示可能となった。AVProVideoのコントローラスクリプトを直して、静止画用に次のファイル表示などを追加する必要がある。

それがまともに出来るようになれば、その次は、cpzあるいはzipファイルがあれば、それをフォルダ相当と捉えて、処理するようにすれば、一応出来るようになるのではと考えている。まだzipファイルをオンザフライで開く方法を理解していないけれども、assetフォルダ直下に、zipのdllを置けば、WebDav同様にPCでもAndroidでも使えるだろうと思う。

#ChannelPlayer · FOVE · Rift · Unity · VRソフト

Youtube対応、静止画対応

Channel Playerは、何故Channel Playerと言う名前かと言えば、もともとはYoutubeのVR Channelの動画を見れるようにしたいという動機からであり、開発当初の1.01や1.02ではブラウザも付けて、PC画面上でYoutubeのコンテンツを選んだら、Riftで再生できるという仕様だったけど、1.03からYoutube対応は取り外して、ローカルファイル再生に注力してきた。

まだ出来ていないことは多いけれども、次はYoutube対応と静止画対応のどちらかだろうと画策している。
Youtube対応は実は難しくて、ミドルウェア(Asset)のAVPro Videoでは、2.0になってもEACのshaderには未だ対応しておらず、Youtube対応をうたうasset (Youtube Playerと、Youtube-DL Player)は、前者は一応対応している(サンプル作って試してみた)ようだが、後者は未だStereoのものには対応していない(質問して回答を得た)。

世の中探せば、EAC ShaderのコードはGitなどで公開されているが、AVPro VideoのShaderとして使おうとして、動かしてみても、思ったようには動作せず、まだ実現していない。

だから、静止画対応(いわゆるコミックビューア)対応が先とも思うが、こちらもただ表示するだけでなく、大きなファイル対応など、難しい問題が出てくるだろうと思う。でもいずれの道も一歩からだからとは思う。

#ChannelPlayer · FOVE · Rift · Unity · VRソフト

Channel Player 1.18リリース

Channel Playerの新しい版をリリースしました。ソフトウェアのページでご案内しています。
改修履歴は以下となります。

2020-01-14 1.18
・以下の機能追加を実施
 - SteamVR版
  AとBボタンおよびXとYボタンを入れ替える機能を追加しました。
  設定ダイアログにて変更可能です。Oculus Touch使用時にAボタンで再生開始、Bボタンで終了となります。
 - 共通
  設定ダイアログにて、左下にバージョン番号を表示するようにした。
・以下の不具合改修を実施
 - Quest版
  Oculus Touchの左右のトリガーにて、WarpJump出来ない不具合修正
 - 共通
  トリックプレイ実行中、再生中のタイトル情報表示上で、音量表示の数値が点滅しないように直しました。
  これはジャンプ時に壊れた音が出ないよう一時的にMuteしていますが、それが見えてしまっていました。