Sora Unity SDK ドキュメント

このドキュメントは Sora Unity SDK バージョン 2025.1.0 に対応しています。

Sora 自体の製品お問い合わせは sora at shiguredo dot jp までお願い致します。 (このメールアドレスへの特定電子メールの送信を拒否いたします)

問い合わせについて

Sora Unity SDK の質問などについては Discord の #sora-sdk-faq チャンネルをご利用ください。 ただし、 Sora のライセンス契約の有無に関わらず、応答時間と問題の解決を保証しませんのでご了承ください。

https://discord.gg/shiguredo

Sora Unity SDK に対する有償のサポートについては提供しておりません。

リリースノート

CHANGE

後方互換性のない変更

UPDATE

後方互換性がある変更

ADD

後方互換性がある追加

FIX

バグ修正

2025.1.0

日付:

2025-01-29

対応 Sora C++ SDK:

2025.1.0

対応 Sora:

2024.2.0

  • [CHANGE] ForwardingFilter は非推奨になりました。

  • [UPDATE] Sora C++ SDK を 2025.1.0 にアップデートしました

    • WEBRTC_BUILD_VERSION を m132.6834.5.2 にアップデートしました

    • BOOST_VERSION を 1.87.0 にアップデートしました

    • rtc::CreateRandomString のヘッダを追加しました

    • CMAKE_VERSION を 3.30.5 にアップデートしました

  • [ADD] Sora.Config に ClientCert, ClientKey, CACert を追加しました

  • [ADD] DataChannels に Header を追加しました

  • [ADD] ForwardingFilters を追加しました

    • ForwardingFilter の代わりにこちらを利用してください

    • 詳細は 転送フィルター をご確認ください

  • [ADD] ForwardingFilters に namepriority を追加しました

2024.4.0

日付:

2024-07-29

対応 Sora C++ SDK:

2024.7.0

対応 Sora:

2024.1.0

  • [UPDATE] Sora C++ SDK を 2024.7.0 にアップデートしました

    • Windows, Ubuntu 22.04 の NVIDIA Video Codec SDK を利用した環境で H.265 が利用できるようになりました

  • [UPDATE] libwebrtc を m127.6533.1.1 にアップデートしました

  • [ADD] WebSocket での接続時に User-Agent が設定されるようになりました

    • Mozilla/5.0 (Sora Unity SDK/<Sora Unity SDK のバージョン>) を設定します

    • 例: Mozilla/5.0 (Sora Unity SDK/2024.4.0)

2024.3.0

日付:

2024-04-18

対応 Sora C++ SDK:

2024.6.1

対応 Sora:

2023.2.0

  • [UPDATE] Sora C++ SDK を 2024.6.1 にアップデートしました

    • Windows, Ubuntu 22.04 の Intel VPL を利用した環境で H.265 が利用できるようになりました

  • [UPDATE] libwebrtc を m122.6261.1.0 にアップデートしました

    • libwebrtc の AV1 デコード機能の脆弱性対応が含まれています

  • [UPDATE] 対応プラットフォームに Ubuntu 22.04 x86_64 を追加しました

    • コード変更はありませんが、Ubuntu 20.04 版の Unity SDK で Ubuntu 22.04 も動作することを確認しました

2024.2.0

日付:

2024-03-13

対応 Sora C++ SDK:

2024.4.0

対応 Sora:

2023.2.0

  • [CHANGE] 音声コーデック Lyra を削除しました

    • 音声コーデック Lyra への対応を廃止しました

    • Sora.Config から Lyra に関する設定を削除しました

      • Sora.Config から AudioCodecLyraBitrate を削除しました

      • Sora.Config から AudioCodecLyraUsedtx を削除しました

      • Sora.Config から CheckLyraVersion を削除しました

      • Sora.Config.AudioCodecType から Lyra を削除しました

  • [CHANGE] Android デバイスのハンズフリー対応に伴い AudioOutputHelperIAudioOutputHelper に変更しました

  • [UPDATE] Sora C++ SDK を 2024.4.0 にアップデートしました

  • [UPDATE] libwebrtc を m121.6167.3.0 にアップデートしました

  • [UPDATE] Boost を 1.84.0 にアップデートしました

  • [UPDATE] CMake を 3.28.1 にアップデートしました

  • [ADD] Android のハンズフリー機能に対応しました

2024.1.0

日付:

2024-01-22

対応 Sora C++ SDK:

2024.1.0

対応 Sora:

2023.2.0

  • [UPDATE] Sora C++ SDK を 2024.1.0 にアップデートしました

  • [UPDATE] libwebrtc を m120.6099.1.2 にアップデートしました

  • [ADD] VideoCodecTypeH265 を追加しました

    • Android, iOS, macOS で H265 を利用できるようになりました

  • [ADD] ForwardingFilterversionmetadata を追加しました

    • Sora 2023.2.0 への追従です

  • [FIX] ForwardingFilteraction を必須項目からオプション項目に変更しました

    • Sora の仕様に合うよう修正しました

2023.5.2

日付:

2023-12-02

対応 Sora C++ SDK:

2023.16.1

対応 Sora:

2023.1.0

  • [FIX] Sora C++ SDK を 2023.16.2 にアップデートしました

    • Apple 非公開 API を利用しており、Apple からリジェクトされる問題が修正されました

2023.5.1

日付:

2023-11-30

対応 Sora C++ SDK:

2023.15.1

対応 Sora:

2023.1.0

  • [FIX] 受信したフレームデータについて書き込みと削除が同時に行われたときにクラッシュすることがあるため修正しました

2023.5.0

日付:

2023-11-13

対応 Sora C++ SDK:

2023.15.1

対応 Sora:

2023.1.0

  • [UPDATE] Sora C++ SDK を 2023.15.1 にアップデートしました

    • macOS で USB 接続されたカメラが利用できなくなっていた問題が解消しました

  • [UPDATE] libwebrtc を m119.6045.2.1 にアップデートしました

  • [UPDATE] CMake を 3.27.7 にアップデートしました

  • [UPDATE] Android NDK を r26b にアップデートしました

2023.4.0

日付:

2023-10-26

対応 Sora C++ SDK:

2023.14.0

対応 Sora:

2023.1.0

  • [CHANGE] Sora.Config 中にあるキャプチャラに関するフィールドを Sora.CameraConfig に移動しました

  • [UPDATE] SoraClientContext を利用してコードを簡潔にしました

  • [UPDATE] libwebrtc を m117.5938.2.0 にアップデートしました

  • [ADD] Sora C++ SDK を 2023.14.0 にアップデートしました

  • [ADD] iOS デバイスのハンズフリーができる AudioOutputHelper を追加しました

  • [ADD] 接続中にキャプチャラを切り替える機能を実装しました

  • [ADD] デバイスを掴まないようにする NoVideoDevice, NoAudioDevice を追加しました

  • [ADD] ハードウェアエンコーダを利用するかどうかを設定する UseHardwareEncoder を追加しました

  • [ADD] SelectedSignalingURLConnectedSignalingURL プロパティを追加しました

  • [FIX] IosAudioInit を初回接続の場合のみ呼び出すようにすることで、iOS で連続して接続しようとするとクラッシュするケースを修正しました

  • [FIX] AudioOutputHelper.Dispose() を複数回呼んでもクラッシュしないように修正しました

2023.3.0

日付:

2023-08-08

対応 Sora C++ SDK:

2023.9.0

対応 Sora:

2023.1.0

  • [UPDATE] Sora C++ SDK を 2023.9.0 にアップデートしました

    • Target minimum iOS Version を 13.4 以上に設定した時、iOS15.x のデバイスで実行すると起動時にクラッシュする不具合が解消されています

  • [UPDATE] libwebrtc を m115.5790.7.0 にアップデートしました

2023.2.0

日付:

2023-07-19

対応 Sora C++ SDK:

2023.7.2

対応 Sora:

2023.1.0

  • [UPDATE] Sora C++ SDK を 2023.7.2 にアップデートしました

  • [UPDATE] libwebrtc を m114.5735.2.0 にアップデートしました

    • VP9 および AV1 でサイマルキャストを利用できるようになりました

  • [ADD] Sora 接続時に ForwardingFilter を指定できるようにしました

  • [ADD] Sora 接続時に CodecParams を指定できるようにしました

  • [FIX] GetStats でデータレースによりエラーが発生するケースについて修正しました

2023.1.0

日付:

2023-04-13

対応 Sora C++ SDK:

2023.4.0

対応 Sora:

2022.2.0

  • [UPDATE] Sora C++ SDK を 2023.4.0 にアップデートしました

  • [UPDATE] libwebrtc を m111.5563.4.4 にアップデートしました

  • [UPDATE] Boost を 1.81.0 にアップデートしました

  • [UPDATE] CMake を 3.25.1 にアップデートしました

  • [ADD] オーディオコーデックに Lyra を追加しました

  • [ADD] Sora.ConfigAudioStreamingLanguageCode を追加しました

  • [ADD] Sora.ConfigSignalingNotifyMetadata を追加しました

  • [ADD] offer 設定時のコールバック関数 OnSetOffer を追加しました

2022.6.2

日付:

2023-03-25

対応 Sora C++ SDK:

2022.12.4

対応 Sora:

2022.2.0

  • [FIX] IPHONE_DEPLOYMENT_TARGET を 13 にアップデートしました

    • Sora C++ SDK を 2022.12.4 にアップデートする際に、IPHONE_DEPLOYMENT_TARGET をあわせてあげる対応です

2022.6.1

日付:

2023-03-24

対応 Sora C++ SDK:

2022.12.4

対応 Sora:

2022.2.0

  • [FIX] Sora C++ SDK を 2022.12.4 にアップデートしました

    • Unity で発生した、Websocket 切断時にクラッシュする不具合を修正するために、Sora C++ SDK のバージョンを上げました

    • Sora C++ SDK で WS 切断時のタイムアウトが起きた際に無効な関数オブジェクトが呼ばれていました

2022.6.0

日付:

2022-12-08

対応 Sora C++ SDK:

2022.12.1

対応 Sora:

2022.1.3

  • [ADD] 実行時に音声と映像のミュート、ミュート解除をする機能を追加しました

2022.5.2

日付:

2022-10-04

対応 Sora C++ SDK:

2022.12.1

対応 Sora:

2022.1.1

  • [FIX] UnityCameraCapturer がマルチスレッド下で正常に終了しないことがあるのを修正しました

2022.5.1

日付:

2022-09-24

対応 Sora C++ SDK:

2022.12.1

対応 Sora:

2022.1.1

  • [UPDATE] Sora C++ SDK を 2022.12.1 にアップデートしました

  • [FIX] カメラからのフレーム情報が縮小された状態で渡されていたのを修正しました

2022.5.0

日付:

2022-09-22

対応 Sora C++ SDK:

2022.11.0

対応 Sora:

2022.1.1

  • [ADD] カメラからのフレーム情報を受け取るコールバックを追加しました

  • [ADD] カメラデバイスの FPS の設定可能にしました

2022.4.0

日付:

2022-09-12

対応 Sora C++ SDK:

2022.11.0

対応 Sora:

2022.1.1

  • [CHANGE] iOS ビルド向けに Bitcode を off にする設定を追加しました

  • [UPDATE] Sora C++ SDK を 2022.11.0 にアップデートしました

  • [UPDATE] libwebrtc を m105.5195.0.0 にアップデートしました

  • [UPDATE] Boost を 1.80.0 にアップデートしました

  • [UPDATE] Android NDK を r25b にアップデートしました

2022.3.0

日付:

2022-08-31

対応 Sora C++ SDK:

2022.9.0

対応 Sora:

2022.1.1

  • [UPDATE] Sora C++ SDK を 2022.9.0 にアップデートしました

  • [ADD] OnDataChannel を追加しました

  • [FIX] Sora Unity SDK のクライアント情報を設定するように追加しました

  • [FIX] UnityAudioOutput = true で ADM を Stop しても再生中のままになっていたのを修正しました

  • [FIX] ProcessAudio が機能してなかったのを修正しました

Sora Unity SDK 概要

Sora Unity SDK は 株式会社時雨堂WebRTC SFU Sora の Unity 向けクライアントフレームワークです。

動作環境

対応 Unity バージョン
  • Unity 2022.3 (LTS)

対応プラットフォーム
  • Windows 10 22H2 x86_64 以降

  • macOS 13.4.1 arm64 以降

  • Android 7 以降

  • iOS 13 以降

  • Ubuntu 20.04 x86_64

  • Ubuntu 22.04 x86_64

対応 Sora

リリースノート をご確認ください

対応グラフィックス API

Windows は Direct3D 11 のみ利用できます。

  • Metal

  • Direct3D 11

  • OpenGL

  • Vulkan

問い合わせについて

Sora Unity SDK の質問などについては Discord の #sora-sdk-faq チャンネルをご利用ください。 ただし、 Sora のライセンス契約の有無に関わらず、応答時間と問題の解決を保証しませんのでご了承ください。

https://discord.gg/shiguredo

FAQ

解像度を変更することはできますか?

できます。

解像度の変更には「送信する映像のサイズ」、「受信するテクスチャのサイズ」、「Unity の表示上のサイズ」の 3 つの設定が必要です。 詳細は 解像度の変更方法 をご確認ください。

カメラを無効にして音声だけ送信できますか?

できます。

NoVideoDevice = true を指定することで映像デバイスを掴むことなく音声だけを送信することができます。 また、 video = false を指定することで映像デバイスを掴みながら音声だけを送信することもできます。

ただし、Unity Camera を利用している場合は NoVideoDevice = true を指定しても Unity Camera を掴んでしまうため、 ご注意ください。

マイクを無効にして映像だけを送信できますか?

できます。

NoAudioDevice = true を指定することで音声デバイスを掴むことなく映像だけを送信することができます。 NoAudioDevice = true を指定した場合音声の受信も行われなくなります。 また、 audio = false を指定することで音声デバイスを掴みながら映像だけを送信することもできます。

ただし、Unity Audio を利用している場合は NoAudioDevice = true を指定しても Unity Audio を掴んでしまうため、 ご注意ください。

カメラ無しの端末を利用して送受信できますか?

できます。

NoVideoDevice = true を指定することでカメラ無しの端末を利用して送受信をすることができます。

AV1 を設定して送受信できますか?

できます。

AV1 は全てのプラットフォームで利用できます。

HTTP Proxy を利用して接続できますか?

できます。Sora.Config にて HTTP Proxy の設定を行えます。

ProxyUrl:

Proxy の URL とポート番号を指定します (例 : http://proxy.example.com:8080)

ProxyUsername:

Proxy の認証に利用するユーザーを指定します

ProxyPassword:

Proxy の認証に利用するパスワードを指定します

Ubuntu で 利用するにはどうすればいいですか?

Ubuntu で Sora Unity SDK を利用するためには以下のコマンドで必要なパッケージをインストールしてください。

sudo apt-get install libva-drm2

iOS または macOS から H.264 の FHD で配信するにはどうすればいいですか?

iOS または macOS から FHD で配信したい場合は Sora の H.264 のプロファイルレベル ID を 5.2 以上に設定してください。設定は以下の方法で行うことができます。

  • Config.VideoH264Params を設定する

  • Sora の設定を変更する

Sora の設定については Sora のドキュメント をご確認ください。

Sora の TURN 機能を無効にして利用できますか?

できません。

Sora Unity SDK は Sora を turn = false に設定して利用することはできません。

Windows で 受信した VP9 の映像が表示できない

NVIDIA ビデオカード搭載の Windows で 128x128 未満の VP9 の映像を受信することはできません。 詳細は Sora C++ SDK の FAQ をご確認ください。

メッセージング機能を利用するにはどうすればよいですか?

メッセージング機能を利用するには最低限以下の設定が必要です。

  • dataChannelSignaling を有効にする必要があります

  • DataChannels で label を設定する必要があります

    • ラベルは # から始める必要があります

    • これは送受信するお互いが同一のラベルである必要があります

  • DataChannels の Direction で Sendrecv / Sendonly / Recvonly のいずれかを設定する必要があります

詳細は Sora のドキュメントの メッセージング機能 をご確認ください。

以下にサンプル集を使った設定方法の例を示します。

サンプル集では必要な値は全て Unity Editor の inspector の以下の項目から行えるようになっています。

  • DataChannel シグナリングの設定

  • DataChannel メッセージングの設定

メッセージは「送信」ボタンを押すことで送信し、メッセージ内容は固定で全てのラベルに aaa を送信するようになっています。 ラベルごとに指定したい場合や異なるメッセージを送信したい場合はご自身で修正していただく必要があります。

ハンズフリーで利用できますか?

iOS と Android デバイスでのみ IAudioOutputHelper を利用することでハンズフリーができます。

ヘッドセットの接続有無によって以下のように挙動が変わります。

  • ヘッドセットが接続されていない場合は通話用スピーカーと通常のスピーカーが切り替わります

  • ヘッドセットが接続されている場合は、ヘッドセットのスピーカーとマイクから端末の通常のスピーカーとマイクへ切り替わります

  • マイクなしイヤホン接続時の動作は考慮されておらず、イヤホンによりマイクが利用できなくなることがあります

ハンズフリーの詳細は ハンズフリー をご覧ください。

Android の音声デバイスを変更できますか?

libwebrtc の仕様のため、Sora Unity SDK をそのまま利用して Android の音声デバイスを変更することはできません。 変更したい場合はご自身でデバイスの変更処理を作成する必要があります。

Unity SDK では libwebrtc の webrtc::AudioDeviceModule::Create を使用して音声デバイスを取得しています。 Android 以外では音声デバイスを取得したときにデバイス名も取得しており、デバイス名を変更することで音声デバイスを変更することができます。

しかし、 Android ではデバイスは常に一つであり、デバイス名を取得しようとしてもエラーが発生するため、ダミーの値を入れるようにしています。 該当のコードは Unity SDK が利用している Sora C++ SDK の device_list.cpp になります。

device_list.cpp のソースコードにアクセスする

モノラルの音声を送信することはできますか?

できません。

Sora Unity SDK ではステレオ音声のみ取り扱うようになっているため、モノラルの音声を送信することはできません。 もしモノラルの音声を利用したい場合はモノラルの音声をステレオに変換するなどの処理をご自身で対応していただく必要があります。

カメラデバイスを変更することはできますか?

できます。

カメラデバイスを変更するにはまずカメラデバイスの一覧を取得する必要があります。 カメラデバイスの一覧は SoraUnitySdk.GetVideoDevices() で取得できます。 カメラデバイスの一覧を取得したら、その中から利用したいカメラデバイスの DeviceName か UniqueName を videoCapturerDevice に設定してください。

以下に Sora Unity SDK のサンプル集の SoraSample.cs で利用する場合の例を示します。

// 指定したいカメラデバイスの DeviceName か UniqueName を Inspector から設定する
public string videoCapturerDevice = "";

// カメラ・オーディオデバイスの一覧を取得する
void DumpDeviceInfo(string name, Sora.DeviceInfo[] infos)
{
    Debug.LogFormat("------------ {0} --------------", name);
    foreach (var info in infos)
    {
        Debug.LogFormat("DeviceName={0} UniqueName={1}", info.DeviceName, info.UniqueName);
    }
}

void Start()
{
    // アプリ起動時にカメラデバイスの一覧を取得する
    DumpDeviceInfo("video capturer devices", Sora.GetVideoCapturerDevices());
}

public void OnClickStart()
{
    // Sora と接続時に config を設定する
    var config = new Sora.Config()
    {
        // CameraConfig に videoCapturerDevice を設定する
        CameraConfig = new Sora.CameraConfig()
        {
            VideoCapturerDevice = videoCapturerDevice,
        },
     }
}

接続している URL を取得することはできますか?

できます。

SelectedSignalingURLConnectedSignalingURL を使用することで取得ができます。

SelectedSignalingURL は複数の候補の中から利用を決定した URL です。 ConnectedSignalingURL は実際に接続した URL です。

iOS の AVAudioSession.Category は何を設定していますか?

Sora Unity SDK では Sora 接続時、マイクを初期化する際に AVAudioSession.Category を PlayAndRecord に設定しています。(マイクを利用しない場合は設定を行いません)

もし、AVAudioSession.Category を変更したい場合はご自身で Native コードを作成し、 AVAudioSession.Category を期待する値に変更する必要があります。 Sora Unity SDK で AVAudioSession.Category を設定している場所は以下のリンクからご確認ください。

AVAudioSession.Category を設定している場所へアクセスする

iOS で送受信を行ったとき、音声が小さくなる

Sora Unity SDK では AVAudioSession.Category を PlayAndRecord に設定しています。

iOS の仕様上 AVAudioSession.Category を PlayAndRecord に設定すると、スピーカー音声が小さくなるようになっています。

マナーモードの時、受信だけをした場合に音声が聞こえない

iOS の仕様上、デフォルトの音声カテゴリではマナーモードの時に音声を再生することはできません。

もしマナーモードでも音声を出したい場合は、AVAudioSession.Category を変更する必要があります。 その場合はご自身で Native コードを作成し、 AVAudioSession.Category を Playback に変更する必要があります。

接続中にカメラを切り替えたい

Sora Unity SDK では、Sora.SwitchCamera() メソッドを使用して、実行時にアクティブなカメラを動的に切り替えることができます。

SwitchCamera() の詳細は Sora Unity SDK の Sora.cs 内の SwitchCamera() の定義を参照してください。

SwitchCamera 定義へアクセスする

切り替え可能なカメラのタイプは2つあります。

  • デバイスカメラ: 実行している端末に組み込まれた物理的なカメラデバイスです。これは、スマートフォンやタブレットの背面カメラやフロントカメラなどが含まれます。

  • Unity カメラ: Unity のシーン内に設定されたカメラです。これは、Unity の Camera コンポーネントを使用して作成されたカメラです。

これらのカメラを切り替えるには、適切なカメラ設定を SwitchCamera() メソッドに渡す必要があります。これは、以下のメソッドを使用して行います。

  • デバイスカメラを使用する場合 : CameraConfig.FromDeviceCamera() メソッドを使用して、特定のデバイスカメラ用のカメラ設定を生成します。

  • Unityカメラを使用する場合 : CameraConfig.FromUnityCamera() メソッドを使用して、特定の Unity カメラ用のカメラ設定を生成します。

以下に Sora Unity SDK のサンプル集の SoraSample.cs で利用する場合の例を示します。

// ここでは例としてユーザーがカメラ切り替えボタンをクリックしたときの処理を示します。
public void OnClickSwitchCamera()
{
    // Sora と接続していない場合は何もしない
    if (sora == null)
    {
        return;
    }

    int videoWidth;
    int videoHeight;

    // 映像サイズの取得
    GetVideoSize(videoSize, out videoWidth, out videoHeight);

    // captureUnityCamera の状態に基づいて、デバイスカメラと Unity カメラを切り替えます。
    if (captureUnityCamera)
    {
        // デバイスカメラに切り替えるために、Sora の SwitchCamera() メソッドを使用します。
        // FromDeviceCamera() メソッドを使って、特定のデバイスカメラ用の新しい CameraConfig を生成します。
        //  - videoCapturerDevice : 使用するデバイスカメラを指定します。
        //  - videoWidth : 切り替え後のビデオの幅を設定します。
        //  - videoHeight : 切り替え後のビデオの高さを設定します。
        //  - videoFps : 切り替え後のビデオのフレームレートを設定します。
        // CameraConfig は、CapturerType を DeviceCamera に設定し、適切なビデオキャプチャデバイスと解像度、フレームレートを指定して、ビデオストリームの設定を行います。
        sora.SwitchCamera(Sora.CameraConfig.FromDeviceCamera(videoCapturerDevice, videoWidth, videoHeight, videoFps));
        captureUnityCamera = false;
    }
    else
    {
        // Unity カメラに切り替えるために、Sora の SwitchCamera() メソッドを使用します。
        // FromUnityCamera() メソッドを使って、特定の Unity カメラ用の新しい CameraConfig を生成します。
        //  - capturedCamera : 使用する Unity カメラを指定します。
        //  - unityCameraRenderTargetDepthBuffer : Unity カメラのレンダーターゲットの深度バッファのサイズを指定します(ここでは16)。
        //  - videoWidth : 切り替え後のビデオの幅を設定します。
        //  - videoHeight : 切り替え後のビデオの高さを設定します。
        //  - videoFps : 切り替え後のビデオのフレームレートを設定します。
        // CameraConfig は、CapturerType を UnityCamera に設定し、適切な Unity カメラと解像度、フレームレートを指定して、ビデオストリームの設定を行います。
        sora.SwitchCamera(Sora.CameraConfig.FromUnityCamera(capturedCamera, 16, videoWidth, videoHeight, videoFps));
        captureUnityCamera = true;
    }
}

ハードウェアエンコーダの利用を制御することはできますか?

できます。Sora Unity SDK では、Sora.ConfigUseHardwareEncoder パラメータを使用することでハードウェアエンコーダの利用を制御できます。

  • UseHardwareEncodertrue を設定するとハードウェアエンコーダを利用します。

  • UseHardwareEncoderfalse を設定するとハードウェアエンコーダを利用しません。

Unity SDK のサンプル集にはどのようなシーンが用意されていますか?

Sora Unity SDK のサンプル集には以下のシーンが用意されています。 マルチストリームを推奨としているため、片方向のみのシーンは用意されていません。

  • Multi_Sendonly

  • Multi_Recvonly

  • Multi_Sendrecv

NVIDIA 搭載の Windows で、 width、 height のいずれかが 128 未満のサイズの VP9 の映像は受信できますか?

できません。NVIDIA VIDEO CODEC SDK のハードウェアデコーダでは width、 height のいずれかが 128 未満である場合 VP9 の映像をデコードできません。

width、 height のいずれかが 128 未満のサイズの映像を受信したい場合は VP9 以外のコーデックを利用するか、use_hardware_encoder を無効にして利用してください。

iOS で画面の向きのロックを設定中に端末の向きを変更しても映像サイズ(縦長・横長)が変わらない

Sora Unity SDK では端末の向きによって送信する映像のサイズが縦長か横長に変わりますが、 iOS と SDK で利用している libwebrtc の仕様で、画面の向きのロック中に端末の向きを変更しても、映像のサイズは変わりません。

映像のサイズを変更して送信したい場合は、iOS の画面の向きのロック設定を解除してください。

Android で物理の音量調整ボタンを押したときに、調節できる音量の種別を選択できますか?

Android の物理の音量調整ボタンで、どの種別の音声(メディア・通話など)が調節されるかは端末ごとに異なります。

物理の音量調整ボタンで好きな音量調整の種別を設定したい場合は、ご自身で Native コードを作成する必要があります。

Native コードを作成するには様々な方法がありますが、例えば Unity の AndroidJavaClass を使用して、作成することができます。

Android ベースのヘッドマウントディスプレイで利用できますか?

できます。Sora Unity SDK は Android に対応していますので、Meta Quest のような Android ベースのヘッドマウントディスプレイで利用できます。

Sora から切断後、再接続を行うとクラッシュしてしまう

Sora に再接続する時には必ず以下の手順でオブジェクトを破棄した後に、再作成をするようにしてください。

  • Disconnect を呼び出す

  • OnDisconnect を待つ

  • Dispose を呼び出す

これらのプロセスの詳細はサンプル集の SoraSample.cs にも記載されていますのでそちらも参考にしてください。

SoraSample.cs のコードへアクセスする

H.265 を利用できますか?

できます。

H.265 は 以下のプラットフォームで利用できます。 Windows と Ubuntu は Intel VPL または NVIDIA Video Codec SDK を利用した環境で利用できます。

  • macOS

  • iOS

  • Android

  • Windows (Intel VPL または NVIDIA Video Codec SDK を利用した環境)

  • Ubuntu 22.04 (Intel VPL または NVIDIA Video Codec SDK を利用した環境)

Intel VPL 環境 または NVIDIA Video Codec SDK ではない Windows や Ubuntu 22.04 で H.265 を利用した場合は 接続時にエラーとはなりませんが、映像の送受信は行われません。

トラックに紐づくコネクション ID を取得することはできますか?

ビデオトラックのみできます。

Sora.OnAddTrack コールバックから trackId と connectionId が取得可能です。

以下に Sora Unity SDK のサンプル集の SoraSample.cs で利用する場合の例を示します。

sora.OnAddTrack = (trackId, connectionId) =>
{
    Debug.LogFormat("OnAddTrack: trackId={0}, connectionId={1}", trackId, connectionId);
};

将来的に音声トラックも含めて取得できるよう、対応する予定です。

Unity Camera で映像を送信するときに FPS を設定できますか?

可能です。

Unity Camera の映像キャプチャを実行するサイクルを調整することで FPS を制御できます。 一例として Sora Unity SDK Samples での設定方法を以下に示します。

Sora Unity SDK Samples で Unity Camera の映像キャプチャを行っている箇所へアクセスする

映像キャプチャを実行している箇所に以下のように修正を加えることで FPS を制御できます。 ここでは 15 fps になるように修正を加えています。

修正内容は以下の通りです。

  • フレームカウンターを追加

  • フレームカウンターの値を見て偶数フレームのみでキャプチャを行うように修正

  • オーバーフローを避けるためのリセット処理を追加

IEnumerator Render()
{
    int frameCounter = 0; // フレームカウンターを追加
    while (true)
    {
        yield return new WaitForEndOfFrame();
        frameCounter++; // フレームカウンターをインクリメント

        // Unity カメラの映像をキャプチャする
        // 必ず yield return new WaitForEndOfFrame() の後に呼び出すこと
        if (state == State.Started && frameCounter % 2 == 0) // 偶数フレームのみでキャプチャをする
        {
            sora.OnRender();
        }
        // Unity から出力された音を録音データとして Sora に渡す
        if (state == State.Started && unityAudioInput && !Recvonly)
        {
            var samples = AudioRenderer.GetSampleCountForCaptureFrame();
            if (AudioSettings.speakerMode == AudioSpeakerMode.Stereo)
            {
                using (var buf = new Unity.Collections.NativeArray<float>(samples * 2, Unity.Collections.Allocator.Temp))
                {
                    AudioRenderer.Render(buf);
                    sora.ProcessAudio(buf.ToArray(), 0, samples);
                }
            }
        }
        if (frameCounter >= int.MaxValue - 1) // オーバーフローを避けるためのリセット
        {
            frameCounter = 0;
        }
    }
}

CA 証明書ファイルやクライアント証明書ファイルの指定や無視することはできますか?

可能です。

Sora Unity SDK では以下の設定を用意しており、Sora.Config にて CA 証明書ファイルやクライアント証明書ファイルの指定や無視を行うことができます。

  • Insecure : サーバー証明書の検証を行わないようにするフラグです。デフォルトは false で証明書の検証を行います。

  • CACert : string で CA 証明書ファイルの内容を指定します。

  • ClientCert : string でクライアント証明書ファイルの内容を指定します。

  • ClientKey : string でクライアントプライベートキーファイルの内容を指定します。

CACert, ClientCert, ClientKey には、PEM 形式のファイルを指定してください。

詳細は 証明書の指定 をご確認ください。

既知のバグ

Sora Unity SDK では現在以下の既知のバグが存在します。

  • Android 12 以降の端末で Bluetooth ヘッドセット接続 => 有線ヘッドセット接続 のあと、有線ヘッドセットを切断する操作を行った時、音声が Bluetooth ヘッドセットには戻りません。

  • ハンズフリー機能について、Android 11 以前の端末で Bluetooth ヘッドセット接続 => 有線ヘッドセット接続 のあと、有線ヘッドセットを切断する操作を行った時、ハンズフリー機能が利用できなくなります。

    • Bluetooth ヘッドセットの切断、再接続でまた利用ができるようになります。

    • この問題は Bluetooth ヘッドセットと有線ヘッドセットが混在したケースであり、Bluetooth ヘッドセットの切断、再接続で解消されるため、Sora Unity SDK での対応は行いません。

  • 一部の Android 11 端末で USB ヘッドセット接続をしても音声が出力されない事象が発生しています。

    • Galaxy A21 で本事象を確認しています。

    • 該当の端末についてはイヤホン端子からイヤホンマイクを接続することで音声が出力されることを確認しています。

  • Android でワイルドカード証明書やマルチドメイン証明書を利用すると、接続時に CERTIFICATE_VERIFY_FAILED エラーが発生し、証明書の検証に失敗することがあります。

    • この問題は CA 証明書を指定することで回避できるという報告を頂いています。

    • CA 証明書の指定方法は 証明書の指定 を参照してください。

2024.1.x から 2024.2.x への移行

2024.2.0 にて AudioOutputHelper の利用方法が変更されました。 ハンズフリー機能を利用している場合は、以下の手順で移行してください。

修正内容

  • Sora.AudioOutputHelperSora.IAudioOutputHelper に変更されました。

    • Sora.IAudioOutputHelperSora.AudioOutputHelperFactory.Create メソッドを使用して生成されます。このメソッドはスピーカーの変更を検知するための Action 型の引数を取ります。

移行方法

Sora.AudioOutputHelper の生成ロジックの変更を行います。

  1. Sora.AudioOutputHelperIAudioOutputHelper に変更します。

  2. Sora.IAudioOutputHelper のインスタンスを生成する箇所を、 AudioOutputHelperFactory.Create を利用するよう変更します。

以下のサンプルコードを元に対応を行ってください。

移行前 (2024.1.0)
// AudioOutputHelper のインスタンスを取得する
Sora.AudioOutputHelper audioOutputHelper;

void Start()
{
    // アプリケーションの初期処理で AudioOutputHelper のインスタンスを生成する
    // 引数には Action を設定する。一例としてここではログ出力を行う
    audioOutputHelper = new Sora.AudioOutputHelper(() => { Debug.Log("OnChangeRoute"); });
}
移行後 (2024.2.0)
// IAudioOutputHelper のインスタンスを取得する
// インスタンス名を IAudioOutputHelper に変更する
Sora.IAudioOutputHelper audioOutputHelper;

void Start()
{
    // アプリケーションの初期処理で IAudioOutputHelper のインスタンスを生成する
    // 引数には Action を設定する。一例としてここではログ出力を行う
    // Sora.AudioOutputHelperFactory.Create を使用してインスタンスを生成する
    audioOutputHelper = Sora.AudioOutputHelperFactory.Create(() => { Debug.Log("OnChangeRoute"); });
}

2023.3.x から 2023.4.x への移行

2023.4.0 にて Sora.Config 中にあるカメラに関する以下のフィールドを Sora.CameraConfig に移動しました。 以下の項目を利用している場合は、 Sora.CameraConfig に移行してください。

  • CapturerType

  • UnityCamera

  • UnityCameraRenderTargetDepthBuffer

  • VideoCapturerDevice

  • VideoWidth

  • VideoHeight

  • VideoFps

修正内容

  • Sora.ConfigSora.CameraConfig を追加しました。 Sora.CameraConfig はカメラに関する以下の設定を保持するクラスです。

    • CapturerType

    • UnityCamera

    • UnityCameraRenderTargetDepthBuffer

    • VideoCapturerDevice

    • VideoWidth

    • VideoHeight

    • VideoFps

  • Sora.Config から以下の項目を削除しました。

    • CapturerType

    • UnityCamera

    • UnityCameraRenderTargetDepthBuffer

    • VideoCapturerDevice

    • VideoWidth

    • VideoHeight

    • VideoFps

移行方法

以下の通り、カメラに関する設定を Sora.CameraConfig に移行してください。

デバイスカメラの例
  • 移行前 (2023.3.0)

移行前のデバイスカメラに関する設定は Sora.Config のフィールドとして定義されており、以下のように設定していました。 例として可能な限り多くの項目を設定していますが利用している項目のみの移行で問題ありません。

config = new Config() {
  SignalingUrl = "wss://sora.example.com/signaling",
  ChannelId = "sora",
  // Sora.Config フィールドにあったデバイスカメラに関する設定
  CapturerType = Sora.CapturerType.DeviceCamera,
  VideoCapturerDevice = "camera",
  VideoWidth = 640,
  VideoHeight = 480,
  VideoFps = 30,
};
  • 移行後 (2023.4.0)

移行後のデバイスカメラに関する設定は新たに作られた Sora.CameraConfig 内のフィールドになりました。

config = new Config() {
  SignalingUrl = "wss://sora.example.com/signaling",
  ChannelId = "sora",
  // Sora.CameraConfig で移行前と同じデバイスカメラ設定を指定します。
  CameraConfig = new CameraConfig() {
    CapturerType = Sora.CapturerType.DeviceCamera,
    VideoCapturerDevice = "camera",
    VideoWidth = 640,
    VideoHeight = 480,
    VideoFps = 30,
  },
};
Unity Camera の例
  • 移行前 (2023.3.0)

移行前の Unity カメラに関する設定は Sora.Config のフィールドとして定義されており、以下のように設定していました。 例として可能な限り多くの項目を設定していますが利用している項目のみの移行で問題ありません。

config = new Config() {
  SignalingUrl = "wss://sora.example.com/signaling",
  ChannelId = "sora",
  // Sora.Config フィールドにあった Unity カメラに関する設定
  CapturerType = Sora.CapturerType.UnityCamera,
  UnityCamera = someUnityCapturedCamera,
  UnityCameraRenderTargetDepthBuffer = 16
  VideoWidth = 640,
  VideoHeight = 480,
  VideoFps = 30,
};
  • 移行後 (2023.4.0)

移行後の Unity カメラに関する設定は新たに作られた Sora.CameraConfig 内のフィールドになりました。

config = new Config() {
  SignalingUrl = "wss://sora.example.com/signaling",
  ChannelId = "sora",
  // Sora.CameraConfig で移行前と同じ Unity カメラ設定を指定します。
  CameraConfig = new CameraConfig() {
    CapturerType = Sora.CapturerType.UnityCamera,
    UnityCamera = someUnityCapturedCamera,
    UnityCameraRenderTargetDepthBuffer = 16
    VideoWidth = 640,
    VideoHeight = 480,
    VideoFps = 30,
  },
};

移行の経緯

カメラ切り替え機能を追加に伴い SoraSora.SwitchCamera(CameraConfig) を追加しました。 引数の簡略化のために Sora.CameraConfig に設定をまとめました。

統計情報

Sora Unity SDK の統計情報機能について説明します。

この機能を利用することで、接続状況や通信品質を把握することができます。

統計情報の取得機能について

統計情報の取得機能は、Sora.GetStats メソッドを利用して取得することができます。

このメソッドは内部で WebRTC の RTCStatsReport を利用し、統計データを取得します。

利用方法

統計情報の取得は一定間隔に行うことを推奨します。

ここではコルーチンを使用して 10 秒間隔で統計情報を取得し Debug.Log に出力する方法を示します。

// Soraインスタンス
private Sora sora;
// 接続状態
// 接続状態を見て統計情報の取得を制御する
private State state;

private enum State
{
    Init,
    Started,
    Disconnecting,
}

IEnumerator GetStats()
{
    while (true)
    {
        // 10秒間隔で取得
        yield return new WaitForSeconds(10);

        // 接続中の場合のみ取得
        if (state != State.Started)
        {
            continue;
        }

        sora.GetStats((stats) =>
        {
            // 注意: このコールバックは Unity メインスレッドとは別のスレッドで実行される
            Debug.LogFormat("GetStats: {0}", stats);
        });
    }
}

Start() メソッドでコルーチンを開始します。

void Start()
{
    StartCoroutine(GetStats());
}

ハンズフリー

iOS と Android デバイスでのみ IAudioOutputHelper を利用することでハンズフリーができます。

ハンズフリーではヘッドセットの接続有無によって以下のように挙動が変わります。

  • ヘッドセットが接続されていない場合は通話用スピーカーと通常のスピーカーが切り替わります

  • ヘッドセットが接続されている場合は、ヘッドセットのスピーカーとマイクから端末の通常のスピーカーとマイクへ切り替わります

  • マイクなしイヤホン接続時の動作は考慮されておらず、イヤホンによりマイクが利用できなくなることがあります

ハンズフリーの挙動について

ハンズフリーの挙動は実行するプラットフォームによって以下のような違いがあります。

Android の Bluetooth ヘッドセット接続時に音声通話スピーカーから音が出るケースがある
  • Android は ハンズフリーの状態から Bluetooth ヘッドセットに切り替えを行う際に一度音声通話スピーカーから音が出たあとに Bluetooth ヘッドセットに切り替わります

    • Bluetooth ヘッドセット接続までにタイムラグがあるため、切り替わるまでの時間に音声通話スピーカーから音が出ます

  • iOS では Bluetooth ヘッドセット接続時に音声通話スピーカーから音が出ることはありません

ハンズフリー機能を有効にしてから切断し、再接続した場合の動作差異
  • iOS ではハンズフリー機能を有効にしてから切断し、再接続した場合にはハンズフリー機能が有効の状態となります。

  • Android ではハンズフリー機能を有効にしてから切断し、再接続した場合に、切断前の有効状態を維持せずにハンズフリーは無効の状態に戻ります

    • Android でハンズフリー機能有効の状態で開始した際に Android API が正常に動作せずハンズフリー無効の状態に切り替えられなくなる事象があったため、ハンズフリーは必ず無効の状態から開始する対応としました Android でハンズフリーの設定を維持する場合はアプリ側で設定を保持し、再接続後に切断前の状態を再設定する必要があります

利用方法

ハンズフリーの利用方法は以下の通りです。

ここでは例として、UI ボタンのクリックイベントを利用してハンズフリーの ON/OFF を切り替えています。

// IAudioOutputHelper のインスタンスを取得する
Sora.IAudioOutputHelper audioOutputHelper;

void Start()
{
    // アプリケーションの初期処理で AudioOutputHelper のインスタンスを作成する
    // 引数には Action を設定する。一例としてここではルート変更時にログ出力を行う
    audioOutputHelper = Sora.AudioOutputHelperFactory.Create(() => { Debug.Log("OnChangeRoute"); });
}

void OnApplicationQuit()
{
    DisposeSora();

    // audioOutputHelper のインスタンスが存在しない場合は処理を抜ける
    if (audioOutputHelper == null)
    {
        return;
    }

    // アプリケーション終了時に IAudioOutputHelper のインスタンスを破棄する
    audioOutputHelper.Dispose();
}

/*
ハンズフリーの ON/OFF を切り替える。
例として UI ボタンのクリックイベント用に OnClickSetHandsfree() を作成する。
*/
public void OnClickSetHandsfree()
{
    // Sora がいない場合は何もしない
    if (sora == null)
    {
        return;
    }

    // audioOutputHelper のインスタンスが存在しない場合は処理を抜ける
    if (audioOutputHelper == null)
    {
        return;
    }

    // 現在のハンズフリーの状態を取得する
    bool isHandsfree = audioOutputHelper.IsHandsfree();
    // ハンズフリーの状態を反転させる
    audioOutputHelper.SetHandsfree(!isHandsfree);
}

ハンズフリー利用時の注意点

ハンズフリーは音声の送受信利用を前提としています。

そのため、Sendonly, Recvonly や NoAudioDevice といった設定ではハンズフリーは利用できません。

上記の補足として iOS の音声デバイスの仕様を以下に記載します。

Sora Unity SDK 内の iOS の実装では音声デバイスを利用しない場合、 AVAudioSession の カテゴリを PlayAndRecord にせず、デフォルトのまま利用します。

Sora Unity SDK のハンズフリーは Sora C++ SDK で実装されています。

その中で iOS のハンズフリー実装は overrideOutputAudioPort(_:) を使用して実現しており、このメソッドは PlayAndRecord 以外のカテゴリでは利用できません。

参考:overrideOutputAudioPort(_:)

リアルタイムメッセージング機能

Sora Unity SDK のリアルタイムメッセージング機能について説明します。

この機能を利用することで、チャネル参加者に対してリアルタイムにメッセージを送受信することができます。

リアルタイムメッセージング機能について

リアルタイムメッセージング機能を利用するためには、data_channel_signaling を有効にする必要があります。

細かな設定方法については Sora ドキュメント を参照してください。

Sora Unity SDK の実装内容

Sora Unity SDK では、リアルタイムメッセージング機能を利用するための実装を以下のように提供しています。

// データチャネルの設定を保持するクラス
public class DataChannel
{
    // 必須設定項目
    public string Label = ""; // チャネルのラベル
    public Direction Direction = Sora.Direction.Sendrecv; // チャネルの送受信方向

    // 以下はオプション設定
    public bool? Ordered; // メッセージの順序保証
    public int? MaxPacketLifeTime; // パケットの最大寿命 (ms 単位)
    public int? MaxRetransmits; // 最大再送回数
    public string? Protocol; // チャネルで使用するプロトコル名
    public bool? Compress; // データの圧縮を有効化するか
    public List<string>? Header; // ヘッダー情報
}

// データチャネルの設定を保持するリスト
public List<DataChannel> DataChannels = new List<DataChannel>();

// config.DataChannels の設定を内部のデータチャネル構造に変換して追加
foreach (var m in config.DataChannels)
{
    // データチャネルの方向を文字列形式に変換
    var direction =
        m.Direction == Direction.Sendonly ? "sendonly" :
        m.Direction == Direction.Recvonly ? "recvonly" : "sendrecv";

    // 内部のデータチャネル設定オブジェクトを生成
    var c = new SoraConf.Internal.DataChannel()
    {
        label = m.Label, // ラベルを設定
        direction = direction, // 送受信方向を設定
    };

    // オプション項目を設定 (null でない場合のみ)
    if (m.Ordered != null)
    {
        c.SetOrdered(m.Ordered.Value); // 順序保証を設定
    }
    if (m.MaxPacketLifeTime != null)
    {
        c.SetMaxPacketLifeTime(m.MaxPacketLifeTime.Value); // 最大寿命を設定
    }
    if (m.MaxRetransmits != null)
    {
        c.SetMaxRetransmits(m.MaxRetransmits.Value); // 最大再送回数を設定
    }
    if (m.Protocol != null)
    {
        c.SetProtocol(m.Protocol); // プロトコル名を設定
    }
    if (m.Compress != null)
    {
        c.SetCompress(m.Compress.Value); // 圧縮の有効/無効を設定
    }
    if (m.Header != null)
    {
        // ヘッダー情報を設定 (リストを内部形式に変換)
        c.SetHeader(new SoraConf.Internal.DataChannel.Header { content = m.Header });
    }

    // 内部データチャネルリストに追加
    cc.data_channels.Add(c);
}

// メッセージの受信
public Action<string, byte[]> OnMessage
{
    set
    {
        if (onMessageHandle.IsAllocated)
        {
            onMessageHandle.Free();
        }

        onMessageHandle = GCHandle.Alloc(value);
        sora_set_on_message(p, MessageCallback, GCHandle.ToIntPtr(onMessageHandle));
    }
}

利用方法

リアルタイムメッセージング機能を利用するためには、以下の条件を満たす必要があります。

  • Sora の設定でリアルタイムメッセージング機能が利用可能になっていること

  • data_channel_signaling が有効になっていること

  • data_channels の設定が行われていること

  • # から始まる label が設定されていること

  • direction が設定されていること

以下に Sora Unity SDK Samples でのリアルタイムメッセージング機能の利用方法を示します。

設定は Inspector で実施することを想定したものです。

また、メッセージの送信はゲーム画面上の UI から行うことを想定しています。

ご利用になる用途に合わせて適宜変更してください。

// データチャネルの設定をするクラス
[System.Serializable]
public class DataChannel
{
    // 必須設定項目
    public string label = ""; // データチャネルのラベル
    public Sora.Direction direction = Sora.Direction.Sendrecv; // チャネルの送受信方向

    // 以下は各オプション項目を有効にするためのフラグと設定値
    public bool enableOrdered; // 順序保証を有効化するか
    public bool ordered; // メッセージの順序保証設定
    public bool enableMaxPacketLifeTime; // パケット寿命設定を有効化するか
    public int maxPacketLifeTime; // パケットの最大寿命
    public bool enableMaxRetransmits; // 最大再送回数設定を有効化するか
    public int maxRetransmits; // 最大再送回数
    public bool enableProtocol; // プロトコル設定を有効化するか
    public string protocol; // 使用するプロトコル名
    public bool enableCompress; // 圧縮設定を有効化するか
    public bool compress; // 圧縮の有効/無効設定
    public bool enableHeader; // ヘッダー設定を有効化するか
    public string[] header; // ヘッダー情報 (文字列の配列)
}
[Header("DataChannel メッセージングの設定")]
public DataChannel[] dataChannels;
string[] fixedDataChannelLabels;

Sora に接続する際に設定を行う部分の例を以下に示します。

// Sora インスタンスの宣言
Sora sora;
// Sora.Config インスタンスの生成
var config = new Sora.Config();

// dataChannels が設定されている場合、処理を開始
if (dataChannels != null)
{
    foreach (var m in dataChannels)
    {
        // 新しい Sora.DataChannel インスタンスを生成
        var c = new Sora.DataChannel();
        c.Label = m.label; // ラベルを設定
        c.Direction = m.direction; // 送受信方向を設定

        // 各オプション項目の設定 (有効フラグを確認)
        if (m.enableOrdered)
        {
            c.Ordered = m.ordered; // 順序保証を設定
        }
        if (m.enableMaxPacketLifeTime)
        {
            c.MaxPacketLifeTime = m.maxPacketLifeTime; // 最大寿命を設定
        }
        if (m.enableMaxRetransmits)
        {
            c.MaxRetransmits = m.maxRetransmits; // 最大再送回数を設定
        }
        if (m.enableProtocol)
        {
            c.Protocol = m.protocol; // プロトコル名を設定
        }
        if (m.enableCompress)
        {
            c.Compress = m.compress; // 圧縮設定を有効/無効化
        }
        if (m.enableHeader)
        {
            // ヘッダー情報を文字列配列からリストに変換して設定
            c.Header = m.header.ToList();
        }

        // 設定済みのデータチャネルを config に追加
        config.DataChannels.Add(c);
    }

    // 設定したデータチャネルのラベルを配列に抽出
    fixedDataChannelLabels = config.DataChannels.Select(x => x.Label).ToArray();
}

メッセージの送信は以下のように行います。

// Sora インスタンスの宣言
Sora sora;

public void OnClickSend()
{
    if (fixedDataChannelLabels == null || sora == null)
    {
        return;
    }
    // DataChannel メッセージを使って全てのラベルに適当なデータを送る
    // ここでは "aaa" という文字列を送信している
    foreach (var label in fixedDataChannelLabels)
    {
        string message = "aaa";
        sora.SendMessage(label, System.Text.Encoding.UTF8.GetBytes(message));
    }
}

メッセージの受信は以下のように行います。

// Sora インスタンスの宣言
Sora sora;

sora.OnMessage = (label, data) =>
{
    // 受信したメッセージのラベルとデータをログ出力
    // dataはバイト配列として受信されるため、UTF8文字列に変換して表示
    Debug.LogFormat("OnMessage: label={0} data={1}", label, System.Text.Encoding.UTF8.GetString(data));
};

転送フィルター

Sora Unity SDK の転送フィルター機能について説明します。

この機能を利用することで、音声や映像のフィルターをすることができます。

Sora 2024.2.0 以降の Sora での利用について

Sora 2024.2.0 からルールだけでなくフィルターそのものを複数設定できるようになりました。

これまでの ForwardingFilter は非推奨になり、新たに ForwardingFilters が追加されました。

今後は ForwardingFilters を使用して転送フィルターを設定してください。

以下は ForwardingFilters を前提とした説明を記載しています。

転送フィルターについて

転送フィルターは ForwardingFilters クラスを使用して設定することができます。

このクラスは ForwardingFilter のリストになっており、複数の転送フィルターを設定が可能になっています。

転送フィルターの仕様の詳細については Sora ドキュメント を参照してください。

また、複数の転送フィルターの仕様については Sora ドキュメント を参照してください。

Sora.cs で ForwardingFiltersForwardingFilter クラスは以下のように定義されています。

// 転送フィルターの設定を保持するクラス
public class ForwardingFilter
{
    public string? Action;
    public string? Name;
    public int? Priority;
    public class Rule
    {
        public string Field;
        public string Operator;
        public List<string> Values = new List<string>();
    }
    public List<List<Rule>> Rules = new List<List<Rule>>();
    public string? Version;
    public string? Metadata;
}
public class Config
{
    // ForwardingFilter 設定
    public ForwardingFilter ForwardingFilter;
    // ForwardingFilters 設定
    public List<ForwardingFilter> ForwardingFilters;
}

利用方法

転送フィルターの利用方法の例を以下に示します。

var config = new Sora.Config();
// ForwardingFilters プロパティにフィルタリストを設定
config.ForwardingFilters = new List<Sora.ForwardingFilter>
{
    // フィルタ1: 特定の client-id (carol) を持つデータを許可
    new Sora.ForwardingFilter
    {
        // 許可アクション
        Action = Sora.ActionAllow,
        // フィルタの名前
        Name = "client-id-carol-allow",
        // 優先度
        Priority = 0,
        // フィルタのルール
        Rules = new List<List<Sora.ForwardingFilter.Rule>>
        {
            new List<Sora.ForwardingFilter.Rule>
            {
                new Sora.ForwardingFilter.Rule
                {
                    // 許可対象の client-id リスト
                    Field = Sora.FieldClientId,
                    Operator = Sora.OperatorIsIn,
                    Values = new List<string> { "carol" }
                }
            }
        },
        // フィルタのバージョン
        Version = "a",
        // メタデータ(JSON形式)
        Metadata = "{\"spam\":\"egg\"}"
    },
    // フィルタ2: audio と video データをフィルタ
    new Sora.ForwardingFilter
    {
        // Action / Name / Priority は未指定の場合はデフォルト値が設定される
        // フィルタのルール
        Rules = new List<List<Sora.ForwardingFilter.Rule>>
        {
            new List<Sora.ForwardingFilter.Rule>
            {
                new Sora.ForwardingFilter.Rule
                {
                    Field = Sora.FieldKind,
                    Operator = Sora.OperatorIsIn,
                    Values = new List<string> { "audio", "video" }
                }
            },
        },
    }
};

証明書の指定

Sora Unity SDK で CA 証明書、クライアント証明書、クライアントシークレットキーを指定する方法を説明します。

この機能を利用することで、Unity SDK を利用しているときに Sora に接続する証明書を指定することができます。

証明書について

Sora Unity SDK は liberbrtc の証明書チェック機能と、ハードコードで持っている証明書を使用して認証をしています。

独自の証明書を使用したい場合、PEM 形式の CA 証明書、クライアント証明書、クライアントシークレットキーを指定することで利用が可能です。

Sora Unity SDK の実装内容

Sora Unity SDK では、証明書の指定を利用するための実装を以下のように提供しています。

public class Config
{
    // クライアント証明書の文字列
    public string? ClientCert;
    // クライアント証明書の秘密鍵の文字列
    public string? ClientKey;
    // ルート証明書の文字列
    public string? CACert;
}

利用方法

以下に Sora Unity SDK Samples での利用方法を示します。

設定は Inspector で実施することを想定したものです。

ファイルをロードではなく、ファイル内容を直接入力する設定になっています。

ご利用になる用途に合わせて適宜変更してください。

Inspector での設定例

以下に Inspector での設定例を示します。 ファイルの内容を貼り付けてください。

-----BEGIN CERTIFICATE-----
MIIFaz (省略)
-----END CERTIFICATE-----

証明書関連設定の定義

// ここでは証明書を Inspector に貼り付ける実装にする
// 有効にするフラグを用意してあるので、証明書を使わない場合は false にする
public bool useClientCert = false;
private string clientCert = @"";
public bool useClientKey = false;
private string clientKey = @"";
public bool useCACert = false;
private string caCert = @"";

Sora に接続する際に設定を行う部分の例を以下に示します。

// Sora インスタンスの宣言
Sora sora;
// Sora.Config インスタンスの生成
var config = new Sora.Config();

// 有効フラグを確認して、証明書を設定
if (useClientCert)
{
    config.ClientCert = clientCert;
}
if (useClientKey)
{
    config.ClientKey = clientKey;
}
if (useCACert)
{
    config.CACert = caCert;
}

サンプル集を使った接続確認

概要

このチュートリアルでは Sora Unity SDK のサンプル集を使って接続確認をするところまでを説明します。

Sora Unity SDK サンプル集

チュートリアルの注意点

  • このチュートリアルは Windows 10 でのみ動作確認をしています。

  • このチュートリアルは Unity Editor 上での動作確認を前提としています。

  • このチュートリアルは Python3 がインストールされていることを前提としています。

接続先の用意

接続確認を行うために接続先を用意します。 接続先は時雨堂が開発、販売している WebRTC SFU Sora を利用します。

検証目的であれば Sora Labo を利用することで、 Sora を無料で試すことができます。

GitHub アカウントを用意して Sora Labo のドキュメント を読んだ後 https://sora-labo.shiguredo.jp/ にサインアップしてください。

Sora Unity SDK サンプル集の取得

Sora Unity SDK サンプル集 を clone してください。

最新は develop ブランチにありますが、ここでは安定版の master ブランチを使います。

$ git clone -b master https://github.com/shiguredo/sora-unity-sdk-samples.git

Sora Unity SDK のインストール

サンプル集の clone が完了したら、 作成されたディレクトリに移動後、 install.py を実行して Sora Unity SDK をインストールします。 Sora Unity SDK のインストール方法は以下の通りです。

$ cd sora-unity-sdk-samples
$ python3 install.py
Unity Editor で Sora Unity SDK サンプル集を開く

Sora Unity SDK のインストールが完了したら、 Unity Editor でサンプル集を開きます。 Unity Editor は Unity 2021 LTS 以降の LTS を推奨しています。

Unity Editor でサンプル集を開くとこのようになっています。

https://i.gyazo.com/3cebd97452cab92e4ab6b7ae31898206.png

接続確認をする

ここでは Sora Labo を使って接続確認をします。

シーンを開く

Sora Unity SDK サンプル集では接続サンプルとして以下のシーンが用意されています。

  • multi_sendrecv

  • multi_sendonly

  • multi_recvonly

ここでは multi_sendrecv を使用します。

接続設定

サンプル集のシーンは Script オブジェクトで設定を行います。

https://i.gyazo.com/d48fa446ae1e23856f1043e483f96f65.png

Sora Labo で取得したシグナリング URLs 、チャネル ID 、アクセストークンを設定します。

https://i.gyazo.com/b5ef947c329e1831927bf53a6d691b5e.png
接続する

Sora Labo の Devtools と映像の送受信を行います。

事前に送受信確認のために Sora Labo の Devtools でマルチストリーム送受信を開いておき fakeMedia で接続しておきます。

Unity Editor の Play ボタンを押下してください。

Game Tab が開き以下のような画面になりますので開始ボタンを押下します。

https://i.gyazo.com/6a0254bbdca453599c3f086cc0f5fcaf.png

無事送受信が開始されると以下のような画面になります。

https://i.gyazo.com/b28ca35c08b483a3c0101811fac9f82b.png

以上で接続確認は完了です。

各プラットフォーム向けの設定

このチュートリアルで使用したサンプル集では各プラットフォーム向けの設定が行われています。

ご自身の プロジェクトで Sora Unity SDK を利用する場合は各プラットフォーム向けに設定をする必要があります。

それぞれのドキュメントを参照してください。

Windows のビルド

Sora Unity SDK のインストール完了後使うことができます。

Target Pratform を Windows に指定してビルドしてください。

macOS のビルド

macOS で使ってみる をお読みください。

iOS のビルド

iOS で使ってみる をお読みください。

Android のビルド

Android で使ってみる をお読みください。

Linux のビルド

libva-drm2 パッケージの apt によるインストール、 Sora Unity SDK のインストール完了後使うことができます。

Target Pratform を Linux に指定してビルドしてください。

次のステップ

Sora Unity SDK のサンプル集ではいろいろな機能を試せるようになっています。

それぞれの機能を試せるよう次項からサンプル集を使用した機能の試し方について説明します。

接続の設定

概要

ここでは Sora Unity SDK のサンプル集を使って接続設定について説明します。

Sora Unity SDK サンプル集

Signaling URL と Signaling URL Candidate

接続する Sora の URL を設定します。 Signaling URL と Signaling URL Candidate は必須項目です。どちらか一方は必ず設定してください。

Sora Unity SDK Sample はクラスター環境でも利用できるよう Signaling URL を複数設定できるようになっています。

Signaling URL と Signaling URL Candidate で別の項目ですが、同じように機能します。複数指定したい場合は Signaling URL Candidate で接続先を追加してください。

https://i.gyazo.com/d14f7e516b7780e235ff5b5c70c23858.png

Insecure

Insecure を有効にすると SSL/TLS の証明書の検証を行わなくなります。

Channel ID

Sora に接続する Channel ID を設定します。必須項目になりますので必ず設定してください。

Client ID

クライアント ID を設定します。

Bundle ID

バンドル ID を設定します。

DataChannel シグナリングの設定

DataChannel シグナリングを有効にするかどうかを設定します。

DataChannel シグナリングを有効にすると、 DataChannel を利用したシグナリングを行うことができます。

Data Channel Signaling:

DataChannel シグナリングを有効にするかどうかを設定します

Data Channel Signaling Timeout:

DataChannel シグナリングのタイムアウトを設定します

Ignore Disconnect Websocket:

WebSocket の切断を無視するかどうかを設定します

Disconnect Wait Timeout:

切断時のタイムアウトを設定します

https://i.gyazo.com/0c36e5597a90ad5e8a870bb15ce74707.png
DataChannel シグナリングを無効にしたい場合

現在の Inspector の設定では DataChannel シグナリングを無効にすることができません。 DataChannel シグナリングを無効にしたい場合は、以下のように設定してください。

SoraSample.cs の config に以下のように設定します。

// EnableDataChannelSignaling = dataChannelSignaling,
EnableDataChannelSignaling = true,
DataChannelSignaling = dataChannelSignaling,

HTTP Proxy の設定

Proxy を設定します。

Proxy を設定することで、 Sora への接続時に Proxy を経由して接続することができます。

ProxyUrl:

Proxy の URL とポート番号を指定します (例 : http://proxy.example.com:8080)

ProxyUsername:

Proxy の認証に利用するユーザーを指定します

ProxyPassword:

Proxy の認証に利用するパスワードを指定します

https://i.gyazo.com/32061109684d207ea5220f1e8c8772cf.png

映像と音声の設定

概要

ここでは Sora Unity SDK のサンプル集を使って映像と音声の設定について説明します。

Sora Unity SDK サンプル集

映像と音声デバイスを指定する

サンプル集では映像と音声デバイスを指定することができます。

デバイスを指定しない場合、実行環境がもつデフォルトのカメラとマイクを使用します。

指定する場合は DeviceName または UniqueName を指定します。

Unity Editor で実行する場合、Editor の Play ボタンを押すとデバイス一覧が Console に表示されます。

https://i.gyazo.com/d48d51950fba81035bd144b3b9fc8559.png
Video Capturer Device を指定する

Console に表示されたデバイス名を Video Capturer Device に設定します。

------------ video capturer devices -------------- 以下から指定する DeviceName または UniqueName を探します。

Audio Recording Device を指定する

Console に表示されたデバイス名を Audio Recording Device に設定します。

------------ audio recording devices -------------- 以下から指定する DeviceName または UniqueName を探します。

Audio Playout Device を指定する

Console に表示されたデバイス名を Audio Playout Device に設定します。

------------ audio playout devices -------------- 以下から指定する DeviceName または UniqueName を探します。

Unity Camera を使ってゲームをキャプチャする

サンプル集では Capture Unity Camera を選択することで Scene 内の Camera を使ってゲームをキャプチャすることができます。

デフォルトで設定されているのは Scene 上の Camera ですが、他の Camera を設定することもできます。

https://i.gyazo.com/fcc87d236a1cdbdceded52ce0670e451.png

Unity の音声を使用する

サンプル集では Unity Audio Input を選択することで Scene 内の AudioSourceInput を使ってゲーム内の音声を送信することができます。

デフォルトで設定されているのは AudioSourceInput ゲームオブジェクトの Audio Source に設定されている音声ですが、他の音声を設定することもできます。

https://i.gyazo.com/6ff5ba997832da258d4f208b5903402c.png

映像や音声を送らないようにする

サンプル集では 映像や音声を送らないようにするパラメータとして以下を用意しています。

  • Video

  • No Video Device

  • Audio

  • No Audio Device

Video や Audio を OFF にすることでデバイスを掴んだ状態で映像や音声を送らないようにすることができます。

この状態ではセルフビューには映像や音声が表示されます。

No Video Device や No Audio Device を ON にすることでデバイスを掴まない状態で映像や音声を送らないようにすることができます。

この状態ではセルフビューには映像や音声が表示されません。

https://i.gyazo.com/f4dee1a305b9095010e4f1ba043fa5a4.png

ハードウェアエンコーダを使用する

Use Hardware Encoder を ON にすることでハードウェアエンコーダを使用することができます。

この設定を OFF にするとハードウェアエンコーダを使用しないようになります。

デフォルトは ON です。

https://i.gyazo.com/f4dee1a305b9095010e4f1ba043fa5a4.png

映像コーデックを指定する

Video Codec Type を指定することで映像コーデックを指定することができます。

映像コーデックは SDK で定義しているものを指定する必要があります。

VP8 / VP9 / H264 / H265 / AV1 が指定できます。

警告

Windows と Ubuntu 22.04 で H.265 を利用するには、 Intel VPL または NVIDIA Video Codec SDK が必要です。

https://i.gyazo.com/e5340ab530dc37cda2498771a4d8ef9f.png

映像コーデックパラメータを指定する

サンプル集では映像コーデックパラメータを指定することができます。

映像コーデックパラメータは VP9 / AV1 / H.264 で指定できます。

https://i.gyazo.com/f7228c84fb310a44c8e68f8c81e8bf9a.png
VP9 の映像コーデックパラメータ
  • Enable Video Vp 9 Params を ON にします

  • Video Vp 9 Params Profile Id を 0-3 の値に設定します

AV1 の映像コーデックパラメータ
  • Enable Video Av 1 Params を ON にします

  • Video Av 1 Params Profile を 0-2 の値に設定します

H.264 の映像コーデックパラメータ
  • Enable Video H264 Params を ON にします

  • Video H264 Params Profile Level Id を設定します (例:42e01f)

音声コーデックを指定する

Audio Codec Type で音声コーデックを指定することができます。

利用できるコーデックは OPUS です。

https://i.gyazo.com/4b5784adf51e92332fd1e2686fc6dbb7.png

音声ストリーミングを有効にする

Audio Streaming Language Code に言語コードを設定することで音声ストリーミングを有効にすることができます。

音声ストリーミングの詳細は Sora のドキュメント を参照してください。

https://i.gyazo.com/b057626f9a52608f89ac732856373e2a.png

映像ビットレートを指定する

映像ビットレートを指定するには Video Bitrate を設定します。

0 の場合 Sora のデフォルト設定が利用されます。

https://i.gyazo.com/663526d8066cda930345cea61f959625.png

映像フレームレートを指定する

映像フレームレートを指定するには Video Fps を設定します。

デフォルトでは 30fps です。

https://i.gyazo.com/0e97646d76093e82a353f8c5d6bb2e64.png

メタデータ

概要

ここでは Sora Unity SDK のサンプル集を使ってメタデータの設定について説明します。

Sora Unity SDK サンプル集

メタデータの設定

Sora Unity SDK のサンプル集ではいくつかのメタデータの設定を行っています。

Signaling Notify Metadata

Sora に接続した時や切断したときに送るシグナリング通知に含まれるメタデータを設定できます。

シグナリング通知メタデータの詳細は Sora のドキュメントの シグナリング通知メタデータ を参照してください。

https://i.gyazo.com/d463c5de266f28b83c8375d10699d1d0.png
Access Token

Sora Labo に接続するためのアクセストークンを設定します。

https://i.gyazo.com/e7c5b65a4df3164560124608153512ce.png
それ以外のメタデータ

Inspector で設定可能なメタデータは上記の2つだけですが、SoraSample.cs を編集することでそれ以外のメタデータを設定することができます。

アクセストークンを設定している箇所で Metadata クラスを定義しているので、ここに追加したいメタデータを定義してください。

[Serializable]
class Metadata
{
    // ここに追加したいメタデータを定義する
    public string access_token;
}

// アクセストークンがない場合はこの条件ではメタデータを設定しないため条件を変更する必要がある
// accessToken がある場合はメタデータを設定する
string metadata = "";
if (accessToken.Length != 0)
{
    var md = new Metadata()
    {
        access_token = accessToken
    };
    metadata = JsonUtility.ToJson(md);
}

サイマルキャスト機能

概要

このチュートリアルでは Sora Unity SDK のサンプル集を使ってサイマルキャスト機能の説明をします。

Sora Unity SDK サンプル集

サイマルキャストの注意点

サイマルキャストは解像度にあったビットレートを指定する必要があります。

詳細は Sora ドキュメント を参照してください。

サイマルキャスト設定

サイマルキャストを有効にする

サイマルキャストを利用するには Inspector で Simulcast を有効にします。

https://i.gyazo.com/0373de00babde4f08c5a5fb9108d0f3d.png
コーデックを指定する

サイマルキャストは VP8 と H.264 のコーデックを指定することができます。

M113 以降のバージョンであれば Sora の設定で scalabilityModescaleResolutionDownBy の設定を行うことで VP9 と AV1 を指定することもできます。

コーデックは Inspector の Video Codec Type で指定します。

https://i.gyazo.com/a9a444a90fe92ba3465000bbc6154177.png
解像度とビットレートを指定する

サイマルキャストは最大で 3 本のストリームを出力します。

ストリームの本数は解像度とビットレートによって決まるため解像度にあったビットレートを指定する必要があります。

解像度とビットレートの対応表は Sora ドキュメント を参照してください。

ビットレートは Inspector の Video Bit Rate で指定します。

ここでは例として HD サイズの場合のビットレートである 3000 を指定します。

https://i.gyazo.com/f2dbcb9fb04e9da5b9bf079374abb8fb.png

その他の設定

サイマルキャストにはその他にも設定があります。

Simulcast Rid

サイマルキャストで配信されている映像を受信する際のエンコードの初期値を指定することができます。

利用するには Inspector の Simulcast Rid を有効にし、その下の Simulcast Rid Type を指定します。

https://i.gyazo.com/f837c2eb2b4bd102a1a42bbed73daa43.png

スポットライト機能

概要

ここでは Sora Unity SDK のサンプル集を使ってスポットライト機能を説明します。

Sora Unity SDK サンプル集

注意

スポットライト機能はサイマルキャスト機能を活用した機能です。

そのため解像度にあったビットレートを指定する必要があります。

詳細は Sora ドキュメント を参照してください。

スポットライト設定

スポットライトはサイマルキャスト同時に利用することができます。

サイマルキャストの設定は サイマルキャスト機能 を参照してください。

スポットライトを有効にする

スポットライトを有効にするには Inspector で Spotlight を有効にします。

https://i.gyazo.com/c69329cb7b83f4a51fe170a393a30501.png
コーデックを指定する

スポットライトは VP8 / VP9 / H.264 / AV1 のコーデックで利用することができます。

コーデックは Inspector の Video Codec Type で指定します。

https://i.gyazo.com/a9a444a90fe92ba3465000bbc6154177.png
スポットライトのフォーカス数を指定する

フォーカスするスポットライトの数を指定します。

https://i.gyazo.com/18ebdd3366846e1dbf45c7fa5d7f7b04.png

その他の設定

スポットライトにはその他にも設定があります。

Spotlight Focus Rid

サイマルキャストと組み合わせて使用しているときに利用できます。

フォーカスするスポットライトの RID を指定します。

  • Spotlight Focus Rid を ON にします

  • Spotlight Focus Rid Type を指定します

https://i.gyazo.com/9bd7644d1f7918bd8d172e0022c3d5e3.png
Spotlight Unfocus Rid

サイマルキャストと組み合わせて使用しているときに利用できます。

アンフォーカスした時のスポットライトの RID を指定します。

  • Spotlight Unfocus Rid を ON にします

  • Spotlight Unfocus Rid を指定します

https://i.gyazo.com/233a179fc695abaa76b8052901d21513.png

メッセージング機能

概要

ここでは Sora Unity SDK のサンプル集を使ってメッセージング機能について説明します。

Sora Unity SDK サンプル集

メッセージング機能の注意点

メッセージングを使用する場合は Data Channel Signaling が有効になっている必要があります。

メッセージングの詳細については Sora のドキュメント を参照してください。

メッセージング設定

メッセージングはラベルを指定することで利用することができます。

https://i.gyazo.com/b5769a39250b3d3ed3dedabd42a907db.png
Data Channels

設定したいメッセージの数を指定します。

Element

DataChannels で指定した数だけ生成されます。それぞれのラベルを指定します。

Label

メッセージのラベルを指定します。先頭に # が付いている必要があります。

Direction

メッセージを送受信、または送信するか受信するかを指定します。

sendrecv は送受信、sendonly は送信のみ、recvonly は受信のみになります。

Orderd

Orderd を有効にするとメッセージが順番に届くようになります。

Orderd を有効にするには以下の設定が必要です。

  • Enable Ordered を有効にする

  • Orderd を有効にする

Max Packet Life Time

最大再送時間を指定することができます。デフォルトは未指定で無制限です。

Max Packet Life Time を有効にするには以下の設定が必要です。

  • Enable Max Packet Life Time を有効にする

  • Max Packet Life Time を有効にする

Max Retransmits

最大再送回数を指定することができます。デフォルトは未指定で無制限です。

Max Retransmits を有効にするには以下の設定が必要です。

  • Enable Max Retransmits を有効にする

  • Max Retransmits で再送回数を指定する

Protocol

現在指定する必要はありません。

Compress

Compress を有効にするとメッセージが圧縮されます。

Compress を有効にするには以下の設定が必要です。

  • Enable Compress を有効にする

  • Compress を有効にする

Header

Header を有効にして、Inspector で以下の設定をすることで Sora がメッセージにヘッダーを付与します。

  • {"type": "sender_connection_id"} を設定する

メッセージの送信

Sora Unity SDK サンプル集ではメッセージの送信は ゲーム画面の送信ボタンを押下することで送信できます。

メッセージの内容は aaa を送信するようになっています。

SoraSample.cs の以下に示す部分を変更することで送信するメッセージを変更することができます。

public void OnClickSend()
{
    if (fixedDataChannelLabels == null || sora == null)
    {
        return;
    }
    // DataChannel メッセージを使って全てのラベルに適当なデータを送る
    foreach (var label in fixedDataChannelLabels)
    {
        string message = "aaa";
        sora.SendMessage(label, System.Text.Encoding.UTF8.GetBytes(message));
    }
}

転送フィルター機能

概要

ここでは Sora Unity SDK のサンプル集を使って転送フィルター機能を試す方法を説明します。

Sora Unity SDK サンプル集

転送フィルターの注意点

  • こちらの転送フィルター機能は非推奨となります。マルチ転送フィルターを使用してください。

  • Inspector で転送フィルターを設定する場合 Unity 2022 LTS 以前のバージョンでは表示に問題があります。

転送フィルター

転送フィルターを設定することで特定の映像や音声を受信しなくなります。

詳細は Sora のドキュメント をご確認ください。

転送フィルターの設定方法

Inspector の ForwardingFilter の設定を変更することで転送フィルターを設定できます。

以下に設定方法を記載します。

Action

EnableAction を有効にすることで action 項目を有効にできます。

Forwarding Filter Action を指定することで allow と block のどちらかを設定できます。

https://i.gyazo.com/9913cfb7f2bc7d7d22ecbee356c85e9b.png
Name

EnableName を有効にすることで name 項目を有効にできます。

Forwarding Filter Name を指定することで名前を設定できます。

Priority

EnablePriority を有効にすることで priority 項目を有効にできます。

Forwarding Filter Priority を指定することでフィルターの優先度を設定できます。

Rule Lists
Data

Data の数を増やすことで一つの転送フィルターにかける条件を増やすことができます。

Data には Field / Op / Values があり、そこに条件を設定します。

https://i.gyazo.com/c59d1feb4aaf6c7483f0f48f4342ea4b.png
Field

Field には以下の値を設定できます。

  • connection_id : フィルターをかける connection_id を指定します。

  • client_id : フィルターをかける client_id を指定します。

  • kind : フィルターをかける kind を指定します。 音声や映像を指定できます。

Op

Op には以下の値を設定できます。

  • is_in : 指定した値が Values に含まれている場合にフィルターをかけます。

  • is_not_in : 指定した値が Values に含まれていない場合にフィルターをかけます。

Values

Values には文字列を設定します。複数設定することができます。例: audio, video

kind の場合には audio または video を設定します。

Forwarding Filter Version

Enable Forwarding Filter Version を設定することで version 項目を有効にできます。

Forwarding Filter Version を指定することで転送フィルターのバージョンを設定できます。

https://i.gyazo.com/13a272a300d9732fff0c1687b766292f.png
Forwarding Filter Metadata

Enable Forwarding Filter Metadata を設定することで metadata 項目を有効にできます。

Forwarding Filter Metadata を指定することで metadata を設定できます。

https://i.gyazo.com/feadbbefcd2e2b67a87518d50ead35d3.png

マルチ転送フィルター機能

概要

ここでは Sora Unity SDK のサンプル集を使って転送フィルターを複数設定する方法を試す説明します。

Sora Unity SDK サンプル集

マルチ転送フィルターの注意点

  • Inspector で転送フィルターを設定する場合 Unity 2022 LTS 以前のバージョンでは表示に問題があります。

マルチ転送フィルター

マルチ転送フィルターを設定することで特定の映像や音声を受信しなくなります。

また、複数を指定することで条件を組み合わせてのフィルターを設定することができます。

詳細は Sora のドキュメント をご確認ください。

マルチ転送フィルターの設定方法

Inspector の ForwardingFilters の設定を変更することでマルチ転送フィルターを設定できます。

既存の転送フィルターとは違い、マルチ転送フィルターは転送フィルターを複数設定することが可能です。

それぞれに Action などの設定を行うことができます。

https://i.gyazo.com/c07c4dd44626bd5f44a89a7c542fa03a.png

以下に設定方法を記載します。

Action

EnableAction を有効にすることで action 項目を有効にできます。

Forwarding Filter Action を指定することで allow と block のどちらかを設定できます。

https://i.gyazo.com/de2123337129929ba5c31bda81d099dc.png
Name

EnableName を有効にすることで name 項目を有効にできます。

Forwarding Filter Name を指定することでフィルターに名前を設定できます。

https://i.gyazo.com/cdc7cb7340ac1c13016855a7a52d65f2.png
Priority

EnablePriority を有効にすることで priority 項目を有効にできます。

Forwarding Filter Priority を指定することでフィルターの優先度を設定できます。

https://i.gyazo.com/500ce287d9d3f5b3ec030f86597dc5c0.png
Rule Lists
Data

Data の数を増やすことで一つの転送フィルターにかける条件を増やすことができます。

Data には Field / Op / Values があり、そこに条件を設定します。

https://i.gyazo.com/c59d1feb4aaf6c7483f0f48f4342ea4b.png
Field

Field には以下の値を設定できます。

  • connection_id : フィルターをかける connection_id を指定します。

  • client_id : フィルターをかける client_id を指定します。

  • kind : フィルターをかける kind を指定します。 音声や映像を指定できます。

Op

Op には以下の値を設定できます。

  • is_in : 指定した値が Values に含まれている場合にフィルターをかけます。

  • is_not_in : 指定した値が Values に含まれていない場合にフィルターをかけます。

Values

Values には文字列を設定します。複数設定することができます。例: audio, video

kind の場合には audio または video を設定します。

Forwarding Filter Version

Enable Forwarding Filter Version を設定することで version 項目を有効にできます。

Forwarding Filter Version を指定することで転送フィルターのバージョンを設定できます。

https://i.gyazo.com/13a272a300d9732fff0c1687b766292f.png
Forwarding Filter Metadata

Enable Forwarding Filter Metadata を設定することで metadata 項目を有効にできます。

Forwarding Filter Metadata を指定することで metadata を設定できます。

https://i.gyazo.com/feadbbefcd2e2b67a87518d50ead35d3.png

H.264 を利用する

Sora Unity SDK ではソフトウェアでの H.264 エンコード/デコードの利用はできません。 これは H.264 のソフトウェアエンコーダ/デコーダを含んで配布した場合はライセンス費用が発生することから、 無効にしているためです。

ただし、ハードウェアで H.264 エンコーダ/デコーダが使える場合は、それを積極的に利用します。

H.264 が利用可能かどうかを調べる

Sora.IsH264Supported() 関数を呼び出すことで、H.264 が利用可能かどうかを調べることができます。

bool h264Supported = Sora.IsH264Supported();

解像度の変更方法

概要

解像度の変更には「送信する映像のサイズ」、「受信するテクスチャのサイズ」、「 Unity の表示上のサイズ」の3つを変える必要があります。 ここでの変更方法は sora-unity-sdk-samples を参考例として記載しています。

変更対象

  • SoraSample.cs

  • RawImage ( multi_sendonly シーンのみ)

変更方法

送信する映像のサイズの変更
SoraSample.cs

VideoWidthVideoHeight パラメータを追加してください。

https://i.gyazo.com/36bad2d5d625a7e63107a9a2a5db7984.png
受信するテクスチャのサイズの変更
SoraSample.cs

テクスチャを生成するパラメータを変更してください。 参考: UnityDocument:Texture2D.Texture2D

  • multi_sendrecv / multi_sendonly の場合

    https://i.gyazo.com/50d3e2699d008e59d2649733aae6b7ea.png
Unity の表示上のサイズの変更
RawImage ( multi_sendonly シーンのみ)

Hierarchy から RawImage を選択し、Inspector から WidthHeight の値を変更してください。 WidthHeight を変更すると設定した値によっては「開始」と「終了」ボタンが隠れてしまうため、 Hierarchy から 「ButtonStart」 と 「ButtonEnd」 を選択して少し上に動かしてください。

https://i.gyazo.com/9ba94ab0b13edc2d4d4bf0d529e3ed14.png

参考: WidthHeight を変更すると Game ビューでは以下のように変化します。

https://i.gyazo.com/791329a7ea7d5524cb781027ef918446.png
multi_sendrecv シーンを変更したい場合

multi_sendrecv シーンは動的に必要なイメージ数が変わるため、あらかじめ設定する RawImage はありません。 その場合は Hierarchy の Canvas / BaseTrack の変更と Canvas / Scroll View のサイズ変更をしてください。

https://i.gyazo.com/e025bc6392b4424e1b25d0b6f95b2589.png
変更結果

Unity での表示。

https://i.gyazo.com/1b5cbd74888c36e3923ec99910db5955.png

Unity から送信した映像の表示設定した 1280x720 になっています。

https://i.gyazo.com/3e7b05d4a2467dcd211b95660a764910.png

Sora Unity SDK for Hololens2

Sora Unity SDK は Hololens2 に対応した Sora Unity SDK for Hololens2 を提供しています。

利用方法

Sora Unity SDK の support/hololens2 ブランチのタグをご利用ください。

サポート

Sora Unity SDK for Hololens2 のサポートは Discord では提供しておりません。 サポートは Sora のライセンスを契約している方向けに有償で提供しております。

サポートが必要な方は Sora サポートまでご連絡ください。

プロジェクトにインストールする

概要

ここでは Sora Unity SDK をプロジェクトにインストールして使ってみる方法を説明します。

インストール前に Sora Unity SDK の動作を確認したい場合は Sora Unity SDK のサンプル集を試してみてください。

Sora Unity SDK サンプル集

サンプル集の使い方についてはチュートリアルの サンプル集を使った接続確認 をお読みください。

Sora Unity SDK のインストール

Sora Unity SDK を導入したいご自身のプロジェクトにインストールしてみます。

https://github.com/shiguredo/sora-unity-sdk/releases から最新の SoraUnitySdk.zip をダウンロードして展開し、Sora Unity SDK を利用したいプロジェクトに以下のようにコピーして下さい。

  • SoraUnitySdk/Plugins/SoraUnitySdkAssets/Plugins/SoraUnitySdk にコピーしてください

  • SoraUnitySdk/SoraUnitySdkAssets/SoraUnitySdk にコピーしてください。

  • SoraUnitySdk/StreamingAssetsAssets/StreamingAssets にコピーしてください。

接続先の用意

接続先は時雨堂が開発、販売している WebRTC SFU Sora を利用します。

検証目的であれば Sora Labo を利用することで、 Sora を無料で試すことができます。

GitHub アカウントを用意して Sora Labo のドキュメント を読んだ後 https://sora-labo.shiguredo.jp/ にサインアップしてください。

使ってみる

Windows で Sora Unity SDK を使ってみる

Sora Unity SDK のインストール完了後使うことができます。

macOS で Sora Unity SDK を使ってみる

Sora Unity SDK のインストール完了後 macOS で使ってみる をお読みください。

iOS で Sora Unity SDK を使ってみる

Sora Unity SDK のインストール完了後 iOS で使ってみる をお読みください。

Android で Sora Unity SDK を使ってみる

Sora Unity SDK のインストール完了後 Android で使ってみる をお読みください。

Linux で Sora Unity SDK を使ってみる

Sora Unity SDK のインストール完了後 Linux (Ubuntu) で使ってみる をお読みください。

FAQ

FAQ をお読みください。

macOS で使ってみる

動作環境

  • macOS 13.3 arm64 以上が必要です

  • arm64 の Mac が必要です

macOS で使うために必要な設定

macOS Plugin の設定
SoraUnitySdk.bundle
  • インスペクタ -> Platform Settings -> CPU を Any CPU に設定してください。

https://i.gyazo.com/9b0956b68ac846a5f9b878e78927e38f.png
Player Settings の設定
カメラ使用時の設定

カメラを使用する場合は以下の設定をする必要があります。

Player Settings -> Other Settings -> Camera Usage Description にカメラ利用のためのコメント(内容は任意)を設定してください。カメラを利用しない recvonly や Capture Unity Camera の場合は不要です。

https://i.gyazo.com/5caf1a7aa3a5b5fdc9bf54665d294028.png
マイク使用時の設定

マイクを使用する場合は以下の設定をする必要があります。

Player Settings -> Other Settings -> Microphone Usage Description にマイク利用のためのコメント(内容は任意)を設定して下さい。マイクを利用しない recvonly や Unity Audio Input の場合は不要です。

https://i.gyazo.com/0302833be236aac6237034f4ca9c90fe.png

Android で使ってみる

動作環境

  • Android 7 以上が必要です

  • arm64-v8a の端末が必要です

Android で使うために必要な設定

Android Plugin の設定変更をします

libSoraUnitySdk.so インスペクタの Platform settings -> Android の設定で CPU を ARM64 に変更して下さい。

https://i.gyazo.com/f7dbf0ebbd1b1567517b4fcd34ff1c97.png
Graphics APIs を設定します
Vulkan を使用したい場合

Player Settings -> Other Settings の Graphics APIs で Vulkan を先頭にして下さい。

https://i.gyazo.com/bdd46d716499e312f3361b756e90b53c.png
OpenGLES を使用したい場合

Player Settings -> Other Settings の Graphics APIs で OpenGLES3 を先頭にして下さい。

https://i.gyazo.com/a3fe926948f72079cb663075c7968288.png
Minimum API Level で Android 7.0 'Nougat' ( API level 24 ) 以上を設定します

Player Settings -> Other Settings -> Minimum API Level で Android 7.0 'Nougat' ( API level 24 ) を以上を選択してください。

https://i.gyazo.com/f14a796b9c2a1661cbb4ad39734b5cc5.png
Target Architectures で ARM64 を設定します

Player Settings -> Other Settings -> Target Architectures で ARM64 にチェックをして下さい。

https://i.gyazo.com/de434b5dfff683dd3f9c306b9e9844bc.png

そのほかの利用に関する注意点

  • Development Build では接続できていたがリリースビルドで接続できない。

    • インターネット接続のパーミッションが付与されていない可能性があります。 Project Settings - Player - Android タブ - Other Settings - Configration - Internet Access の設定を Require に設定されているかご確認ください。

    https://i.gyazo.com/264d2afe1c1fec007a673f80665cf86e.png
  • Sora Unity SDK が要求する Gradle バージョンと Unity のデフォルトバージョンの組み合わせによりアプリ起動時に即クラッシュする可能性や、Android ビルドが Gradle のバージョンによってできない可能性があります。

    • Unity のバージョンを最新にアップデートする

    • Unity で利用する Gradle のバージョンを変更する

iOS で使ってみる

動作環境

  • iOS 13 以上が必要です

  • 64bit の iPhone が必要です

iOS で使うために必要な設定

iOS Plugin の設定
libwebrtc.a
  • インスペクタ -> Select Platform for plugin -> Any Platform のチェックを外し、 Include Platforms で iOS だけが チェックされるように設定してください。

https://i.gyazo.com/7628eee5c7976abbc20eed5e9835b130.png
libSoraUnitySdk.a
  • インスペクタ -> Select Platform for plugin -> Any Platform のチェックを外し、 Include Platforms で iOS だけが チェックされるように設定してください。

  • Platform settings の OpenGLES の項目にチェックが入っていない場合、チェックを入れてください。

https://i.gyazo.com/fc03999de53503d484f640e419701793.jpg
libboost_json.a
  • インスペクタ -> Select Platform for plugin -> Any Platform のチェックを外し、 Include Platforms で iOS だけが チェックされるように設定してください。

https://i.gyazo.com/db3ddc8c4624d83cd2a0ed4cc65c4fbd.png
libsora.a
  • 特に変更は必要ありません。想定している設定内容は以下の画像の通りです。

https://i.gyazo.com/d4de6b900211ed2fb528e3d245abc216.png
Player Settings の設定
Target Minimum iOS Version

Player Settings -> Other Settings -> Target Minimum iOS Version で 12.0 以上を設定してください。

https://i.gyazo.com/dfa0a38c8e5c78347a3030fb9603bd4e.png
カメラ使用時の設定

カメラを使用する場合は以下の設定をする必要があります。

Player Settings -> Other Settings -> Camera Usage Description にカメラ利用のためのコメント(内容は任意)を設定してください。カメラを利用しない recvonly や Capture Unity Camera の場合は不要です。

https://i.gyazo.com/ea332824fbcf5377734c6d399d1c77e2.png
マイク使用時の設定

マイクを使用する場合は以下の設定をする必要があります。

Player Settings -> Other Settings -> Microphone Usage Description にマイク利用のためのコメント(内容は任意)を設定して下さい。マイクを利用しない recvonly や Unity Audio Input の場合は不要です。

https://i.gyazo.com/aa73f00db149a853234939659eff999a.png

Linux (Ubuntu) で使ってみる

動作環境

  • Unity Editor の対応する Ubuntu バージョンを前提とします

  • Sora Unity SDK では Ubuntu 20.04 以上が必要です

Linux で使うために必要な設定

Linux で使うためには、共通の設定と NVIDIA か IntelVPL のどちらの GPU で利用するかによって設定が異なります。 ここでは共通の設定と GPU ごとに必要な設定、Plugins の配置について説明します。

共通の設定

Sora Unity SDK の利用には、以下のライブラリが必要です。

sudo apt-get install libdrm2 libva2 libva-drm2
NVIDIA GPU を利用する場合

Ubuntu で NVIDIA GPU が利用できるようになっていることを確認してください。

以下のコマンドで NVIDIA GPU が利用できるか確認できます。

nvidia-smi
IntelVPL GPU を利用する場合

利用する Ubuntu のバージョンや、Intel CPU の世代によって、IntelMediaSDK か IntelVPL を利用するかが異なります。 ここでは Ubuntu22.04 で 第 11 世代 以降のチップセットを搭載した Intel CPU を利用する場合の設定を説明します。

その他の環境での Intel VPL の設定については、Sora Unity SDK が利用している Sora C++ SDK の Intel VPL のドキュメント をご確認ください。

Intel の apt リポジトリを追加

ランタイムのインストールには Intel の apt リポジトリを追加する必要があります。

wget -qO - https://repositories.intel.com/gpu/intel-graphics.key | \
  sudo gpg --dearmor --output /usr/share/keyrings/intel-graphics.gpg
echo "deb [arch=amd64,i386 signed-by=/usr/share/keyrings/intel-graphics.gpg] https://repositories.intel.com/gpu/ubuntu jammy client" | \
  sudo tee /etc/apt/sources.list.d/intel-gpu-jammy.list
sudo apt update
Intel 提供パッケージの最新化

Intel の apt リポジトリを追加することでインストール済みのパッケージも Intel から提供されている最新のものに更新できます。依存問題を起こさないため、ここで最新化を行なってください。

sudo apt upgrade
ドライバとライブラリのインストール

以下のように、ドライバとライブラリをインストールしてください。 intel-media-va-driver には無印と non-free 版がありますが、 non-free 版でしか動作しません。

sudo apt install -y intel-media-va-driver-non-free libmfxgen1
Plugins の配置

Plugins/SoraUnitySdk/linux/x86_64 に以下のファイルを配置してください。

  • インスペクタ -> Platform Settings -> CPU を Any CPU に設定してください。

https://i.gyazo.com/71329583ad3922f753f834416dbeb5e4.png

Windows 10 x86_64 向けにビルドする

ビルドに関する質問は受け付けていません

警告

自前ビルドは推奨していません。提供されているバイナリを利用してください。

事前準備

以下の環境を準備します。

  • Windows 10 22H2 x86_64 以降

以下のツールをインストールしてください。

  • Visual Studio 2019 | Visual Studio

    • C++ をビルドするためのコンポーネントを入れてください

    • 動作確認は Visual Studio 2019 Community で行っています

  • Python 3.10.6 以降

Unity プラグインのビルド

PowerShell を起動し、プロジェクトのルートディレクトリで python3 run.py windows_x86_64 を実行してください。

$ python3 run.py windows_x86_64

うまくいくと _build\windows_x86_64\release\sora_unity_sdk\Release\SoraUnitySdk.dll が生成されます。

インストール

_build\windows_x86_64\release\sora_unity_sdk\Release\SoraUnitySdk.dllSora\ を自身のプロジェクトにコピーしてください。

macOS x86_64 向けにビルドする

ビルドに関する質問は受け付けていません

警告

自前ビルドは推奨していません。提供されているバイナリを利用してください。

事前準備

以下の環境を準備します。

  • macOS arm64 13.4.1 以降

以下のツールをインストールしてください。

  • Xcode 14.3.1 以降

  • Python 3.10.6 以降

Unity プラグインのビルド

コマンドラインで python3 run.py macos_arm64 を実行してください。

$ python3 run.py macos_arm64

ビルドに成功すると _build/macos_arm64/release/sora_unity_sdk/SoraUnitySdk.bundle が生成されます。

インストール

_build/macos_arm64/release/sora_unity_sdk/SoraUnitySdk.bundleSora/ を任意のプロジェクトの Assets にコピーしてください。

Linux x86_64 向けにビルドする

ビルドに関する質問は受け付けていません

警告

自前ビルドは推奨していません。提供されているバイナリを利用してください。

事前準備

以下の環境を準備します。

  • Ubuntu 20.04 x86_64 以降

以下のツールをインストールしてください。

  • libdrm-dev libva-dev libgl-dev パッケージ

  • Python 3.10.6 以降

Unity プラグインのビルド

コマンドラインで python3 run.py ubuntu-20.04_x86_64 を実行してください。

$ python3 run.py ubuntu-20.04_x86_64

ビルドに成功すると _build/ubuntu-20.04_x86_64/release/sora_unity_sdk/libSoraUnitySdk.so が生成されます。

インストール

_build/ubuntu-20.04_x86_64/release/sora_unity_sdk/libSoraUnitySdk.soSora/ を任意のプロジェクトの Assets にコピーしてください。

Android 向けにビルドする

ビルドに関する質問は受け付けていません

警告

自前ビルドは推奨していません。提供されているバイナリを利用してください。

事前準備

以下の環境を準備します。

  • Ubuntu 20.04 x86_64 以降

以下のツールをインストールしてください。

  • libdrm-dev libva-dev libgl-dev パッケージ

  • Python 3.10.6 以降

Unity プラグインのビルド

コマンドラインで python3 run.py android を実行してください。

$ python3 run.py android

ビルドに成功すると _build/android/release/sora_unity_sdk/libSoraUnitySdk.so が生成されます。

インストール

_build/android/release/sora_unity_sdk/libSoraUnitySdk.soSora/ を任意のプロジェクトの Assets にコピーしてください。

iOS 向けにビルドする

ビルドに関する質問は受け付けていません

警告

自前ビルドは推奨していません。提供されているバイナリを利用してください。

事前準備

以下の環境を準備します。

  • macOS arm64 13.4.1 以降

以下のツールをインストールしてください。

  • Xcode 14.3.1 以降

  • Python 3.10.6 以降

Unity プラグインのビルド

コマンドラインで python3 run.py ios を実行してください。

$ python3 run.py ios

ビルドに成功すると _build/ios/release/sora_unity_sdk/libSoraUnitySdk.a が生成されます。

インストール

_build/ios/release/sora_unity_sdk/libSoraUnitySdk.aSora/ を任意のプロジェクトの Assets にコピーしてください。

© Copyright 2024, Shiguredo Inc. Created using Sphinx 8.2.1