docs.unity3d.com
    目次を表示する/隠す

    ビデオストリーミング

    WebRTC はピア間での映像のストリーミングを可能にします。 Unity でレンダリングされた映像を同時に複数のブラウザに配信することが可能です。

    Note

    サンプル にはビデオストリーミングの機能を確認するための PeerConnection シーンが用意されています。

    StartCoroutine で Update を呼び出す

    はじめに、フレーム毎にテクスチャをビデオバッファにコピーするため、 WebRTC.Update メソッドを StartCoroutine で呼び出してください。

    void Start()
    {
        StartCoroutine(WebRTC.Update());
    }
    

    ビデオの送信

    VideoStreamTrack インスタンスを作成します。

    // Camera からトラックを生成
    var camera = GetComponnent<Camera>();
    var track = camera.CaptureStreamTrack(1280, 720);
    

    インスタンスの生成には、上記の方法以外に RenderTexture をコンストラクタの引数として設定する方法もあります。

    // 有効な RendertextureFormat を取得
    var gfxType = SystemInfo.graphicsDeviceType;
    var format = WebRTC.GetSupportedRenderTextureFormat(gfxType);
    
    // RenderTexture からトラックを生成
    var rt = new RenderTexture(width, height, 0, format);
    var track = new VideoStreamTrack("video", renderTexture);
    

    トラックの追加

    作成したビデオトラックを RTCPeerConnection インスタンスに追加します。AddTrack メソッドを使ってトラックを追加します。次に CreateOffer と CreateAnswer を実行して SDP を作成します。

    // トラックの追加
    peerConnection.AddTrack(track);
    
    // SDP の作成
    RTCAnswerOptions options = default;
    var op = pc.CreateAnswer(ref options);
    yield return op;
    

    複数トラック

    同時に複数のビデオトラックを利用することも可能です。AddTrack をトラック毎に呼び出して利用できます。

    // 複数のトラックを追加
    foreach(var track in listTrack)
    {
        peerConnection.AddTrack(track);
    }
    
    Note

    ハードウェアアクセラレーションを利用する場合、デバイスによっては利用可能なトラック数に制限がある場合があります。GPU に NVIDIA Geforce カードを利用している場合は、同時に利用可能なトラック数は、通常は 2 までになります。詳細は NVIDIA Codec SDK ドキュメント を確認してください。

    ビデオの受信

    VideoStreamTrack をビデオ受信に利用します。 受信用のインスタンスは RTCPeerConnection インスタンスの OnTrack イベントから取得します。 MediaStreamTrack をイベントから取得し、TrackKind.Video と比較することで、トラックの型を判定します。判定が通れば Track インスタンスは VideoStreamTrack クラスにキャストできます。

    
    var receiveStream = new MediaStream();
    receiveStream.OnAddTrack = e => {
        if (e.Track is VideoStreamTrack track)
        {
            // 受信したテクスチャは `track.Texture` プロパティで取得可能
        }
        else if(e.Track is AudioStreamTrack track)
        {
            // このトラックはオーディオ用
        }
    }
    
    var peerConnection = new RTCPeerConnection();
    peerConnection.OnTrack = (RTCTrackEvent e) => {
        if (e.Track.Kind == TrackKind.Video)
        {
            // 受信用 `MediaStream` にトラックを追加
            // この処理は `MediaStream` の `OnAddTrack` イベントを発火する
            receiveStream.AddTrack(e.Track);
        }
    };
    

    複数ビデオの受信

    1つの RTCPeerConnection に複数の受信用ビデオトラックを持たせることができます。 RTCPeerConnection インスタンスの AddTransceiver メソッドを必要なトラック数呼び出し、シグナリング処理を実行します。

    // トラックの数だけ AddTransceiver メソッドを呼び出す
    peerConnection.AddTransceiver(TrackKind.Video);
    // シグナリング処理を実行
    
    Note
    • 1つの VideoStreamTrack インスタンスで映像の送信と受信の両方を行うことはできません。
    • VideoStreamTrack を受信トラックとして使用するためには、 RTCPeerConnection.OnTrack コールバックからインスタンスを取得する必要があります。

    ビデオ設定

    開発者はビデオストリーミングの品質に関する設定をリアルタイムに変更することができます。

    • ビットレート
    • フレームレート
    • 解像度
    Note

    パッケージサンプルに含まれている Bandwidth シーンを使えば、これらの機能の動作を確認することができます。

    帯域制御

    ビデオストリームのビットレートを変更するには、RTCRtpSender インスタンスの SetParameters メソッドを使用します。RTCRtpSender インスタンスは RTCPeerConnection から取得できます。または AddTrack メソッドの戻り値としても取得できます。

    // `GetSenders` メソッドで取得
    var senders = peerConnection.GetSenders();
    
    // `AddTrack` メソッドで取得
    var sender = peerConnection.AddTrack(track);
    

    RTCRtpSender インスタンスを取得したあと、送信ストリームの現在の設定を GetParameters メソッドで取得できます。戻り値は RTCRtpSendParameters クラスで定義されています。SetParameters メソッドに変更した設定を渡すことで、設定を反映できます。

    // `RTCRtpSendParameters` を取得
    var parameters = sender.GetParameters();
    
    // 全てのエンコーダの最大ビットレートを変更
    foreach (var encoding in parameters.Encodings)
    {
        encoding.maxBitrate = bitrate;
    }
    
    // パラメータを反映
    sender.SetParameters(parameters);
    

    フレームレートの制御

    SetParameters メソッドを利用することで、エンコードのフレームレートを変更することができます。以下に示すサンプルコードでは、ビデオエンコーダのフレームレートをどのように変更するのかを示しています。パラメータにはApplication.targetFramerate より小さな値を設定してください。

    // Get `RTCRtpSendParameters`
    var parameters = sender.GetParameters();
    
    // Changing framerate of all encoders.
    foreach (var encoding in parameters.Encodings)
    {
        // Change encoding frequency 30 frame per second.
        encoding.maxFramerate = 30;
    }
    
    // Set updated parameters.
    sender.SetParameters(parameters);
    

    解像度の制御

    ネットワーク負荷を減らすために解像度を変更することが可能です。RTCRtpEncodingParameters クラスに含まれる scaleResolutionDownBy プロパティを利用することで、解像度のサイズを調整できます。プロパティは float 型の除数として表現されます。例えば、2.0 を指定したとき、ビデオサイズは縮小し、結果として元の解像度の 25% になります。

    // Get `RTCRtpSendParameters`
    var parameters = sender.GetParameters();
    
    // Changing framerate of all encoders.
    foreach (var encoding in parameters.Encodings)
    {
        // Change video size to half.
        encoding.scaleResolutionDownBy = 2.0f;
    }
    
    // Set updated parameters.
    sender.SetParameters(parameters);
    

    ビットレートの確認

    現在トラックで使用している帯域をブラウザ上で確認できます。Google Chrome では chrome://webrtc-internals にアクセスすると、現在動作している WebRTC の各種統計情報が表示されます。その中の RTCInboundRTPVideoStream の項目にある、単位時間当たりの受信バイト数のグラフ([bytesReceived_in_bits/s])をご覧ください。

    Chrome WebRTC Stats

    ビデオコーデック

    パッケージ内の複数のコーデックから選択可能です。なお、プラットフォームによって利用可能なコーデックは異なります。

    ビデオコーデックの選択

    ビデオコーデックを選択するには、まずはデバイス上で有効なコーデックのリストを取得するために GetCapabilities メソッドを呼び出します。デフォルトでは全ての有効なコーデックを他ピアとのネゴシエーションに利用します。ピア間のネゴシエーションでは、双方で利用可能なコーデックを検索し、優先度が高いものが選択されます。開発者は利用したいコーデックを選択するためには、コーデックのリストをフィルタし、優先度順にソートする必要があります。 以下の例では有効なコーデックのリストから H.264 コーデックを抽出しています。

    // 利用可能なビデオコーデックを取得
    var codecs = RTCRtpSender.GetCapabilities(TrackKind.Video).codecs;
    
    // コーデックをフィルタする
    var h264Codecs = codecs.Where(codec => codec.mimeType == "video/H264");
    

    作成したコーデックのリストを SetCodecPreferences メソッドに渡します。 利用できないコーデックを渡した場合は InvalidParameter が返ります。

    var error = transceiver.SetCodecPreferences(h264Codecs.ToArray());
    if (error != RTCErrorType.None)
        Debug.LogError("SetCodecPreferences failed");
    

    ビデオエンコーダ

    ビデオストリーミングのエンコーダは2種類に分けられます。ソフトウェア実装とハードウェア実装です。多くの場合、ハードウェア実装は H.264 コーデック、ソフトウェア実装は VP8, VP9, AV1 コーデックになります。

    ビデオデコーダ

    ビデオエンコーダと同様、H.264 デコーダ と VP8、VP9、AV1 デコーダを提供しています。

    ハードウェアコーデック

    ハードウェアアクセラレーション対応のコーデックの実装には以下の種類があります。

    • NVCODEC
    • VideoToolbox
    • MediaCodec

    ハードウェアアクセラレーションがサポートされているエンコーダの実装は以下の通り。

    プラットフォーム グラフィックス API NVCODEC VideoToolbox MediaCodec
    Windows x64 DirectX11 Y - -
    Windows x64 DirectX12 Y - -
    Windows x64 OpenGL Core N - -
    Windows x64 Vulkan Y - -
    Linux x64 OpenGL Core Y - -
    Linux x64 Vulkan Y - -
    MacOS Metal - Y -
    iOS Metal - Y -
    Android Vulkan - - Y
    Android OpenGL ES - - Y

    ハードウェアアクセラレーションがサポートされているデコーダの実装は以下の通り。

    プラットフォーム グラフィックス API NVCODEC VideoToolbox MediaCodec
    Windows x64 DirectX11 Y - -
    Windows x64 DirectX12 Y - -
    Windows x64 OpenGL Core N - -
    Windows x64 Vulkan Y - -
    Linux x64 OpenGL Core Y - -
    Linux x64 Vulkan Y - -
    MacOS Metal - Y -
    iOS Metal - Y -
    Android Vulkan - - Y
    Android OpenGL ES - - Y

    NVCODEC を利用するには NVIDIA ドライバがインストールされている必要があります。

    • Windows: NVIDIA ドライババージョンが 456.71 以上
    • Linux: NVIDIA ドライババージョンが 455.27 以上

    対応している NVIDIA のグラフィックスカードについては、NVIDIA VIDEO CODEC SDK のページをご覧ください。

    トップに戻る
    Copyright © 2023 Unity Technologies
    • Legal
    • Privacy Policy
    • Cookies
    • Do Not Sell or Share My Personal Information
    • Your Privacy Choices (Cookie Settings)
    "Unity", Unity logos, and other Unity trademarks are trademarks or registered trademarks of Unity Technologies or its affiliates in the U.S. and elsewhere (more info here). Other names or brands are trademarks of their respective owners.
    Generated by DocFX on Wednesday, November 1, 2023