# FAQ

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

解像度は変更できます。

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

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

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

`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 を設定して送受信できます。

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

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

Sora.Config にて HTTP Proxy の設定を行うことで Proxy を利用して接続できます。

**ProxyUrl**: Proxy の URL とポート番号を指定します (例 : )
**ProxyUsername**: Proxy の認証に利用するユーザーを指定します
**ProxyPassword**: Proxy の認証に利用するパスワードを指定します

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

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

```bash
sudo apt-get install libdrm2 libva2 libva-drm2
```

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

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

- `Config.VideoH264Params` を設定する
- Sora の設定を変更する

Sora の設定については [Sora のドキュメント](https://sora-doc.shiguredo.jp/SORA_CONF#1581db) をご確認ください。

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

Sora の TURN 機能を無効にして利用することはできません。

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

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

NVIDIA ビデオカード搭載の Windows で 128x128 未満の VP9 の映像を受信することはできません。
詳細は [Sora C++ SDK の FAQ](https://github.com/shiguredo/sora-cpp-sdk/blob/develop/doc/faq.md#nvidia-%E6%90%AD%E8%BC%89%E3%81%AE-windows-%E3%81%A7-128x128-%E6%9C%AA%E6%BA%80%E3%81%AE-vp9-%E3%81%AE%E6%98%A0%E5%83%8F%E3%82%92%E5%8F%97%E4%BF%A1%E3%81%A7%E3%81%8D%E3%81%BE%E3%81%9B%E3%82%93) をご確認ください。

## リアルタイムメッセージング機能を利用するにはどうすればよいですか？

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

- dataChannelSignaling を有効にする必要があります
- DataChannels で label を設定する必要があります- ラベルは `#` から始める必要があります
  - これは送受信するお互いが同一のラベルである必要があります
- DataChannels の Direction で Sendrecv / Sendonly / Recvonly のいずれかを設定する必要があります

詳細は Sora のドキュメントの [リアルタイムメッセージング機能](https://sora-doc.shiguredo.jp/MESSAGING) をご確認ください。

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

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

- DataChannel シグナリングの設定
- リアルタイムメッセージングの設定

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


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

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

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

- ヘッドセットが接続されていない場合は通話用スピーカーと通常のスピーカーが切り替わります
- ヘッドセットが接続されている場合は、ヘッドセットのスピーカーとマイクから端末の通常のスピーカーとマイクへ切り替わります
- マイクなしイヤホン接続時の動作は考慮されておらず、イヤホンによりマイクが利用できなくなることがあります

ハンズフリーの詳細は [ハンズフリー](functions_iaudiooutputhelper.html) をご覧ください。

## 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 のソースコードにアクセスする](https://github.com/shiguredo/sora-cpp-sdk/blob/develop/src/device_list.cpp)

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

モノラルの音声を送信することはできません。

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

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

カメラデバイスを変更することができます。

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

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

```csharp
// 指定したいカメラデバイスの 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 を取得することはできますか？

接続している URL を取得することができます。

`SelectedSignalingURL` と `ConnectedSignalingURL` を使用することで取得ができます。

`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 を設定している場所へアクセスする](https://github.com/shiguredo/sora-unity-sdk/blob/develop/src/mac_helper/ios_audio_init.mm)

## 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 定義へアクセスする](https://github.com/shiguredo/sora-unity-sdk/blob/develop/SoraUnitySdkExamples/Assets/SoraUnitySdk/Sora.cs)

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

- デバイスカメラ: 実行している端末に組み込まれた物理的なカメラデバイスです。これは、スマートフォンやタブレットの背面カメラやフロントカメラなどが含まれます
- Unity カメラ: Unity のシーン内に設定されたカメラです。これは、Unity の `Camera` コンポーネントを使用して作成されたカメラです
- Texture: Unity で生成・管理している任意の `Texture` です。 `RenderTexture` の利用を推奨します

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

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

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

```csharp
// ここでは例としてユーザーがカメラ切り替えボタンをクリックしたときの処理を示します。
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 Unitay SDK では、 `Sora.VideoCodecImplementation` パラメーターを使用することでハードウェアエンコーダーの利用を制御できます。
詳細は [エンコーダー / デコーダーの指定](functions_hardware_acceleration.html) をご確認ください。

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

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

- Multi_Sendonly
- Multi_Recvonly
- Multi_Sendrecv

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

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

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

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

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

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

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

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

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

Native コードを作成するには様々な方法がありますが、例えば Unity の [AndroidJavaClass](https://docs.unity3d.com/ja/2019.4/ScriptReference/AndroidJavaClass.html) を使用して、作成することができます。

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

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

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

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

- Disconnect を呼び出す
- OnDisconnect を待つ
- Dispose を呼び出す

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

[SoraSample.cs のコードへアクセスする](https://github.com/shiguredo/sora-unity-sdk/tree/master/SoraUnitySdkExamples/Assets/SoraSample.cs)

## H.265 を利用できますか？

H.265 は 以下のプラットフォームで利用できます。
Windows と Ubuntu は 以下に記載する GPU を利用した環境で利用できます。

> **注意**
>
> AMD AMF はドライバーが不安定なため、現在非推奨です。

- macOS
- iOS
- Android
- Windows- Intel VPL を利用した環境
  - AMD AMF を利用した環境
  - NVIDIA Video Codec を利用した環境
- Ubuntu 22.04 / Ubuntu 24.04- Intel VPL を利用した環境
  - AMD AMF を利用した環境
  - NVIDIA Video Codec を利用した環境

GPU の HWA を利用しない Windows や Ubuntu 22.04 / 24.04 で H.265 を利用した場合は
接続時にエラーとはなりませんが、映像の送受信は行われません。

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

音声と映像のトラックに紐づくコネクション ID を取得することができます。

[映像の送信と受信](functions_video.html) と [音声の送信と受信](functions_audio.html) をご確認ください。

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

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

[Sora Unity SDK Samples で Unity Camera の映像キャプチャを行っている箇所へアクセスする](https://github.com/shiguredo/sora-unity-sdk/tree/master/SoraUnitySdkExamples/Assets/SoraSample.cs#L230-L235)

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

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

- フレームカウンターを追加
- フレームカウンターの値を見て偶数フレームのみでキャプチャを行うように修正
- オーバーフローを避けるためのリセット処理を追加

```csharp
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 証明書ファイルやクライアント証明書ファイルの指定や無視することはできますか？

CA 証明書ファイルやクライアント証明書ファイルの指定、および証明書の検証を行わない設定ができます。

Sora Unity SDK では証明書の検証について以下の設定を用意しています。

- `Insecure` : サーバー証明書の検証を行わないようにするフラグです。デフォルトは `false` で証明書の検証を行います。
- `CACert` : string で CA 証明書ファイルの内容を指定します。
- `ClientCert` : string でクライアント証明書ファイルの内容を指定します。
- `ClientKey` : string でクライアントプライベートキーファイルの内容を指定します。

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

詳細は [証明書の指定](functions_ca_cert.html) をご確認ください。

## 受信した音声の音量を調整することはできますか？

受信した音声の音量を調整することができます。

詳細は [音声の送信と受信](functions_audio.html) をご確認ください。

## Android の 16 KB ページサイズには対応していますか？

Sora Unity SDK の 2025.2.0 以降で対応しています。

Plugins も 16 KB のページサイズでビルドされています。

もし Sora Unity SDK の 2025.2.0 以降をインストールしても Unity Editor 上で警告が出ている場合は以下の手順で `.meta` ファイルの再生成を試してみてください。

1. Plugins/SoraUnitySDK/android の `.meta` ファイルを削除します。
2. Unity Editor を再起動します。

これにより `.meta` ファイルが再生成されます。

16 KB ページサイズの Unity の仕様は公式のドキュメントをご確認ください。

[Unity の 16 KB ページサイズの仕様](https://docs.unity3d.com/6000.0/Documentation/Manual/android-requirements-and-compatibility.html)

## Unity 内の音声を Sora に送信することはできますか？

はい。Unity 内の音声を Sora に送信することができます。
AudioSource を利用して Unity の音声を Sora に送信することができます。

## Unity 内の映像を Sora に送信することはできますか？

はい。Unity 内の映像を Sora に送信することができます。
Hierarchy に Unity の Camera を配置し、Sora の設定で Unity Camera を指定することで映像を送信することができます。

[映像の送信と受信](functions_video.html) をご確認ください。

## Direct3D 12 をサポートしていますか？

Sora Unity SDK は Direct3D 12 をサポートしています。
Windows では Direct3D 11 と Direct3D 12 に対応しています。

## OpenGL ES 2.0 をサポートしていますか？

Sora Unity SDK は OpenGL ES 2.0 をサポートしていません。
OpenGL ES 3.0 以降をサポートしているため、OpenGL ES 2.0 のみをサポートしている端末では Unity Camera を利用した映像の送信ができません。

## Unity カメラキャプチャを使うにあたって注意点はありますか？

Unity カメラキャプチャを使う場合、対応プラットフォームごとに必要なグラフィックス API を確認してください。

詳細は [Sora Unity SDK 概要](overview.html) の `対応グラフィックス API` をご確認ください。

## RenderTexture をインプットとして送信できますか？

RenderTexture をインプットとして送信できます。詳細は [映像の送信と受信](functions_video.html) をご確認ください。
