HTC Vive の音声ミラーをスクリプト制御する (ソーシャルスクリーンのネタバレ対策)
HTC Vive を展示等で利用する際、HMD を着けている人が見ている映像 (あるいは第三者視点の映像) をディスプレイに表示するソーシャルスクリーンは、周囲の人を楽しませ、惹き付けるのに有用なことはよく知られています。
この際、映像と合わせて音声もスピーカー出力できるとより良いことが多いです。
ヘッドフォンの音声を物理的に分岐する、サーバー/クライアント構成をとり HMD 接続 PC とスピーカー接続 PC を分けるなど、いくつか方法はありますが、SteamVR の設定でも簡単に実現できます。
以下のように、「設定」 > 「オーディオ」 > 「デバイスにオーディオをミラーする」でスピーカーを選択するだけで OK です。
さて、ネタバレ対策で一部のシーンでソーシャルスクリーンを隠したいことがあると思います。
映像の方は例えば Unity のカメラ制御などで前面に出せばできるので詳細は割愛しますが、音声ミラーも合わせてオンオフしたいので、オーディオのミラーリングのオンオフをスクリプト制御することを考えます。
Unity + SteamVR Plugin 1.1.1 を使っている場合、以下でできました。
(2017/1/15 追記 : SteamVR Plugin 1.2.0 の場合、下記 11 行目、GetString() の引数 "" を削除してください。API が変わっています)
GetString() すると、以下のような文字列が取得できます。
これを SetString() してから Sync() すれば反映されます。
ミラーリングしないときは空文字列です。
上記の文字列はデバイスのプロパティのバス関係の末尾と同じなように見えます。
openvr_api.cs には他にも CVRSettings.SetBool(), SetInt32(), SetFloat(), SetString() と複数のセクション、キーの定義があるので、SteamVR の設定の多くはスクリプト制御できるのではないかと思います。
UE 等は不明ですが同様の API があってもおかしくない気はします。
なお、ドキュメントにはなさそうなので保証はできない感じですが、実装も運用もお手軽で便利です。
2017/1/15 : SteamVR Plugin 1.2.0 について
この際、映像と合わせて音声もスピーカー出力できるとより良いことが多いです。
ヘッドフォンの音声を物理的に分岐する、サーバー/クライアント構成をとり HMD 接続 PC とスピーカー接続 PC を分けるなど、いくつか方法はありますが、SteamVR の設定でも簡単に実現できます。
以下のように、「設定」 > 「オーディオ」 > 「デバイスにオーディオをミラーする」でスピーカーを選択するだけで OK です。
さて、ネタバレ対策で一部のシーンでソーシャルスクリーンを隠したいことがあると思います。
映像の方は例えば Unity のカメラ制御などで前面に出せばできるので詳細は割愛しますが、音声ミラーも合わせてオンオフしたいので、オーディオのミラーリングのオンオフをスクリプト制御することを考えます。
Unity + SteamVR Plugin 1.1.1 を使っている場合、以下でできました。
(2017/1/15 追記 : SteamVR Plugin 1.2.0 の場合、下記 11 行目、GetString() の引数 "" を削除してください。API が変わっています)
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
public string GetAudioPlaybackMirrorDevice () | |
{ | |
System.Text.StringBuilder sb = new System.Text.StringBuilder(128); | |
Valve.VR.EVRSettingsError er = new Valve.VR.EVRSettingsError(); | |
Valve.VR.OpenVR.Settings.GetString( | |
Valve.VR.OpenVR.k_pch_audio_Section, | |
Valve.VR.OpenVR.k_pch_audio_OnPlaybackMirrorDevice_String, | |
sb, | |
(uint)sb.Capacity, | |
"", | |
ref er); | |
return sb.ToString(); | |
} | |
public void SetAudioPlaybackMirrorDevice (string serial) | |
{ | |
Valve.VR.EVRSettingsError er = new Valve.VR.EVRSettingsError(); | |
Valve.VR.OpenVR.Settings.SetString( | |
Valve.VR.OpenVR.k_pch_audio_Section, | |
Valve.VR.OpenVR.k_pch_audio_OnPlaybackMirrorDevice_String, | |
serial, | |
ref er); | |
Valve.VR.OpenVR.Settings.Sync(false, ref er); | |
} | |
public void ClearAudioPlaybackMirrorDevice () | |
{ | |
SetAudioPlaybackMirrorDevice(""); | |
} |
GetString() すると、以下のような文字列が取得できます。
"{0.0.0.00000000}.{4bad97d2-1df8-4fdb-bf3b-ccb574d6ff34}"
これを SetString() してから Sync() すれば反映されます。
ミラーリングしないときは空文字列です。
上記の文字列はデバイスのプロパティのバス関係の末尾と同じなように見えます。
UE 等は不明ですが同様の API があってもおかしくない気はします。
なお、ドキュメントにはなさそうなので保証はできない感じですが、実装も運用もお手軽で便利です。
2017/1/15 : SteamVR Plugin 1.2.0 について
コメント
コメントを投稿