株式会社時雨堂様が提供してくださっているsora-unity-sdkがAndroidに正式に対応したらしいので、サンプルを動かしてみました。
試した環境
sora-unity-sdk 2020.5
PC
Windows10
Unity2019.1.14f1
スマホ
Android10
Motog8
1.サンプルの入手
GitHubから入手。
https://github.com/shiguredo/sora-unity-sdk-samples
READMEに依ると
sora-unity-sdk のインストール
Windows の場合は install.bat を、macOS の場合は install.sh を実行して下さい。 これで各種サンプルを実行するために必要になる sora-unity-sdk をインストールできます。
とのことなのでinstall.bat
を実行します。しかしこの実行ファイルの中身を見てみるとsora-unity-sdk v2020.4
をインストールする設定になっているようです。今回、試したいのは2020.5
だったのでinstall.ps1
の$SORAUNITYSDK_VERSIONを修正します。
$SORAUNITYSDK_VERSION = "2020.5"
修正した上でコマンドプロンプトでinstall.bat
を実行して、sora-unity-sdk v2020.5
をプロジェクトにインストールします。

2.Sora Laboを使うように設定
とりあえず動かしてみたいので、時雨堂様が提供してくださっているSora Labo
を利用します。検証目的なら無償で利用できますが、商用利用はできないようです。簡単な利用規約があるのでよく確認してから利用しましょう。今回は検証目的なので大丈夫です。
https://sora-labo.shiguredo.jp/
サインアップしてログインしたらUnityに戻って設定していきます。
適当なサンプルシーンを開きます。今回はmulti_sendrecv
にします。
ScriptというオブジェクトにアタッチされているSora Sampleコンポーネント
にSora Laboに接続するための設定を記入していきます。
Sora Laboのダッシュボードに記述してあるシグナリングURL
, シグナリングキー
をコピペしてUnityのSora Sampleコンポーネント
に貼り付けます。

次にChannel Id
を設定します。sora-laboのドキュメントに依ると
チャネル ID を <自分の GitHub Username>@<好きな Room ID> のように指定してください
とのことなので適当に設定します。ここでは便宜上<GITHUB_USERNAME>@sora-labo
とします。
また、今回はUnityのカメラを送受信したいので、Capture Unity Camera
のチェックを入れます。

ここまでの設定でUnity Editor上で挙動を確認できるようになったはずです。Sora Laboにマルチストリーム受信
というページがあるので、そこから確認してみます。Unityカメラの映像がブラウザから確認できるはずです。

3.Androidで確認できるように設定
Android向けにビルドして実機で確認できるように設定していきます。まずビルドターゲットをAndroidに変更します。
- arm64-v8a のライブラリしか入れていないので armeabi-v7a の端末では動きません。
- libSoraUnitySdk.so のインスペクタ -> Platform settings -> Android の設定で CPU が ARM64 になっていることを確認して下さい。
- Player Settings -> Other Settings -> Target Architectures で ARM64 にチェックが入っていることを確認して下さい。
- Vulkan で動かす必要があります。
- Player Settings -> Other Settings の Graphics APIs で Vulkan が先頭にあることを確認して下さい。
- OpenGLES モードでの動作は未確認です。
- 最低でも API LEVEL 24 (Android 7.0)が必要です。
- Pixel 3 で解像度が 16 の倍数じゃない時に映像が乱れる問題があります。
とのことなので、書いてある通りに設定していきます。
まずAssets\Plugins\SoraUnitySdk\android\arm64-v8a\libSoraUnitySdk.so
のTarget ArchitecturesをARM64に変更します。変更したら忘れずにApplyしましょう。

次にPlayer Settingsの設定を変更していきます。Other SettingsのTarget ArchitecturesをARM64に。Graphics APIsのAuto Graphics APIのチェックをはずしてVulkanに設定します。さらにMinimum API LevelをAPI LEVEL 24にしておきましょう。

4.オブジェクトが映らない問題
一応、以上で設定はできたはずなんですが、私の環境だと問題が発生しました。Unityのカメラにオブジェクトが映らないという問題です。

本来なら球体が映らはずだけど、映らない。この問題はAndroidの実機だけじゃなくてUnity Editor上でも発生しました。
結論から言うと、Project Settings->Graphics->Tier SettingsのUser DafaultsのチェックをはずしてUSE HDRのチェックを入れると解決します。

この問題が起こった理由は特定できていませんが、検証してみた結果、ShaderのRenderTargetがOpaqueのオブジェクトが映らないという症状のようです。RenderTargetをTransparent
にすると映るようになりました。まだBuild Settingsで対象プラットフォームをPCにしても治るようです。たぶんVulkan関連の何かが原因な気がします。
何か必要な設定を忘れていたのか、自分の実行環境の問題なのか、よく分かりません。
なんか描画順とか、Unityのカメラをキャプチャしてテクスチャにする処理とかに何かヒントがある気がします。WaitForEndOfFrameのタイミングでUnityのカメラの映像をVulkanを直接叩いてキャプチャするっていう実装になっているようなんですが、これでなんで映らないのか謎です。WaitForEndOfFrameは描画系の処理の最後に実行されるようなので、キャプチャするタイミングとしては適切な気がします。
原因を探るならたぶんこの辺のキャプチャする仕組みがどうなってるのか見る必要がある気がするんですが、Vulkanとか低レイヤーのことは門外漢なので、私にはよく分からなかったです。今回はとりあえずUSE HDRのチェックを入れたら写ったので良しとしました。
https://github.com/shiguredo/sora-unity-sdk/blob/develop/src/unity_camera_capturer_vulkan.cpp
5.結果
ということでsora-unity-sdkをAndroidで使うことができました。
使っているスマホはMotog8というローエンド端末なんですが、想像以上にヌルヌル動きます。遅延もほとんどないと言っていいんじゃないでしょうか。すごいですね。
6.最後に
先日、NDI SDKをAndroidで使うっていう記事を書きました。NDIはローカルネットワーク上で映像や音声の送信を行うのに対してsora-unity-sdkはSoraを介してどこからでもアクセスできます。
またNDI SDKのAndroid実装は送信にしか対応してませんでしたが、こちらは送信も受信もできます。ただSoraを商用利用するにはお金がかかります。(NDI SDKは無料だったはず)
NDIもWebRTCも使うなら、表面的な理解だけでは駄目で、チューニングして軽量化したりする必要がありますね。
追記
特定のオブジェクトが映らない問題は修正されたようです。
https://github.com/shiguredo/sora-unity-sdk/commit/417477dca1532474703c16d1f271f08979d4ffb5