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 の認証に利用するパスワードを指定します

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 デバイスでのみ AudioOutputHelper を利用することでハンズフリーができます。

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

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

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

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

プラットフォームによるハンズフリーの挙動差異

実行するプラットフォームによって挙動に以下のような差異があります。

Android の Bluetooth ヘッドセット接続時に音声通話スピーカーから音が出るケースがある

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

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

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

ハンズフリー機能を有効にしてから切断し、再接続した場合の動作差異

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

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

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

利用方法

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

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

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

void OnApplicationQuit()
{
    DisposeSora();

    // audioOutputHelper のインスタンスが作成されていない場合は処理を抜ける
    if (audioOutputHelper == null)
    {
        return;
    }

    // アプリケーション終了時に AudioOutputHelper のインスタンスを破棄する
    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 といった設定ではハンズフリーは利用できません。

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

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

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

参考:overrideOutputAudioPort(_:)

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 を設定している コードのリンクはこちらです。

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 は macOS と iOS、Android でのみ利用できます。

トラックに紐づくコネクション 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;
        }
    }
}
© Copyright 2023, Shiguredo Inc. Created using Sphinx 7.2.6