【HoloLens1】HoloLens で WebRTC を利用する

#2021/3/25 補足
MixedReality-WebRTC の Version が2系になった時に、ファイル構造・導入手順が変更されました。
こちらの記事を参考にする場合は1系（1.0.0 ~ 1.0.3）をお使いください。
https://github.com/microsoft/MixedReality-WebRTC/releases

#はじめに
WebRTCはウェブブラウザやモバイルアプリケーション間でのリアルタイム通信を可能にするものです。
オープンソースのプロジェクトであり、APIが公開されています。
HoloLensで利用するにあたって、今回はHoloLensの開発元であるMicrosoftが提供しているプロジェクトを利用しました。

webrtc-uwp-sdk
https://github.com/webrtc-uwp/webrtc-uwp-sdk
MixedReality-WebRTC
https://github.com/microsoft/MixedReality-WebRTC
#準備
・Visual Studio 2019
・Unity 2019以降
・Node.js
・以下リポジトリのクローン
　https://github.com/microsoft/MixedReality-WebRTC
　https://github.com/bengreenier/node-dss

#導入
###リポジトリのダウンロード
master branchをclone
https://github.com/microsoft/MixedReality-WebRTC
(zip形式の保存はファイル欠損が出るので, cloneで行います. 10GB程度の空き容量が必要になります)
###ビルドの準備
以下URLに沿って実行する
https://microsoft.github.io/MixedReality-WebRTC/manual/building.html
・rootディレクトリのMicrosoft.MixedReality.WebRTC.slnをVS2019で起動
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/299455/5f394513-5ba2-fa0c-583c-d948eac78e77.png)
・上記の設定でプロジェクト全体をビルド
HoloLens1であればx86, HoloLens2で利用する場合はターゲットをARMに変えます
いくつかエラーと警告が出るが、ビルドが通れば先へ進む

MixedReality-WebRTC-master\libs\Microsoft.MixedReality.WebRTC.Unity\Assets\Microsoft.MixedReality.WebRTC.Unity.Examples\VideoChatDemo
をUnityで開く
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/299455/6000a2fc-b4f0-5f8a-1b16-21fb247e383d.png)
Build Settingsは以下のように設定
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/299455/e22936e2-069d-2d03-762f-70485ebd6f26.png)

###ローカル映像取得
WebRTCを実行するためのシグナリングサーバを用意します。
node.jsコマンドプロンプトを起動し、予めダウンロードしたnode-dssのディレクトリに移動
以下コマンドを実行
`cd node-dss`
`set DEBUG=dss*`
`npm install`
`npm start`
コマンド実行後にUnityでシーンを再生する
成功していればWebカメラでローカルの映像が表示される
![無題.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/299455/860ac06c-3bff-34db-c366-37f3b6db27a6.png)
node.js側にはログが表示される
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/299455/9334457c-be0b-f890-5bac-4b29a7571b36.png)
###リモート映像取得(Unity - Unity)
2台のPCを使うことで相互に映像を取得できる
上記で利用したPCとは別のPCで同じプロジェクトを実行できる環境を作る
作り終わった後に, 同じ手順でローカルのデータが取れるかを確認
確認後、双方でnode-dssを実行
2台分, /data/以降の文字数列をメモ
(例えば, 上記ログの場合だと8bce5f31a0fcfa8e14380b224c00e2d1)

Hierarchyを開き、PeerConnection内のNodeDssSignalerを編集する
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/299455/f49a7253-4a12-cc2c-0208-5457ba32807f.png)

Remote Peer Idは控えた文字数列を入力
Http Server Addressは、
http://127.0.0.1:3000 → http://接続先ネットワークのIPv4アドレス:3000に変更
双方で再生ボタンを押し、CreateOfferすると、リアルタイムの映像が出力される
![無題.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/299455/e3af955f-690a-8de4-e230-c255494c794a.png)
ログから双方で通信が行われていることが分かる
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/299455/77e40380-4580-7d1f-9d04-4b599b537044.png)
###リモート映像取得(HoloLens - Unity)
編集中

###トラブルシューティング
Microsoft.MixedReality.WebRTC.slnがビルドできない
→ VS2019でビルドしているか確認
→ ターゲットの変更etc　
　(https://microsoft.github.io/MixedReality-WebRTC/manual/building.html)

ローカル映像取得ができない
→ Webカメラ、ネットワークの権限を許可しているか
→ Microsoft.MixedReality.WebRTC.slnのビルドはできているか、できていなければ再ビルド
→ node.jsでシグナリングサーバを立てているか

リモート映像取得ができない
→ ネットワークを127.0.0.1のままにしていないか
#さいごに
HoloLensにWebRTCを導入することで遠隔操作の支援・ビデオ通話など様々な分野での利用が可能になります。
今回利用したMixedReality-WebRTCはPUBLIC PREVIEWではありますが、HoloLens開発におけるWebRTC導入を容易にしてくれるものとなっています。