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

    ビデオストリーミング

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

    コーデック

    エンコード

    ビデオストリーミングで利用するエンコーダーには、ハードウェアでエンコードするものと、ソフトウェアでエンコードするものがあります。利用するコーデックは、ハードウェアエンコーダーの場合には H.264 を利用し、ソフトウェアエンコーダーの場合は、VP8 コーデックを利用します。

    WebRTC.Initialize メソッドの引数に EncoderType を指定することで、 ソフトウェアエンコーダーとハードウェアエンコーダーのいずれかを選択することができます。

    // ソフトウェアエンコーダーを使用
    WebRTC.Initialize(EncoderType.Software);
    
    注記

    このオプションはハードウェアを利用する/利用しないを選択するオプションです。 コーデックを明示的に指定する方法は、現在提供していません。

    WebRTC をサポートしている主要なブラウザでは H.264 及び VP8 が利用できるため、多くのブラウザで Unity から配信されるビデオストリーミングを受信することができます。

    デコード

    現在、ソフトウェアデコーダのみ利用可能です。VP8 及び VP9 をコーデックとして利用可能です。

    注記

    現在、ハードウェアデコーダはサポートしていません。 ハードウェアデコーダは将来サポートされる予定です。

    ビデオトラック

    ビデオストリーミングを実装するには、ビデオトラック 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 メソッドを呼び出すことでトラックを追加できます。その後 SDP を生成するために RTCPeerConnection の CreateOffer もしくは CreateAnswer を呼び出します。

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

    複数トラック

    ビデオトラックは複数同時に利用することが可能です。 RTCPeerConnection の AddTrack メソッドを複数回呼び出してトラックを追加します。

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

    ハードウェアエンコーダーを選択している場合、グラフィックデバイスの制約によって、同時に利用可能なトラック数が制限される場合があります。一般的に NVIDIA Geforce で同時に利用可能なビデオトラック数は 2本 までです。詳しくは NVDIA Codec SDK のドキュメント を参照してください。

    ブラウザ側でトラックを同時に受信する方法については、MDN ドキュメント RTCPeerConnection.addTrack の Streamless tracks の項目を参照してください。

    帯域制御

    ビデオトラックの帯域を制御するには、 RTCRtpSender の SetParameter メソッドを利用します。RTCRtpSender は RTCPeerConnection から取得することができます。

    var senders = peerConnection.GetSenders();
    

    あるいは AddTrack の戻り値として取得できます。

    var sender = peerConnection.AddTrack(track);
    

    RTCRtpSender インスタンスを取得した後、送信ストリームの設定を取得するには GetParameter メソッドを呼び出します。また、SetParameter メソッドを呼び出すことで設定を変更することができます。

    var parameters = sender.GetParameters();
    foreach (var encoding in parameters.Encodings)
    {
        encoding.maxBitrate = bitrate;
    }
    sender.SetParameters(parameters);
    
    注記

    設定に含まれる値の中で、 maxFramerate は現在未対応です。 scaleResolutionDownBy は、ソフトウェアエンコーダでのみ動作します。

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

    Chrome WebRTC Stats

    ビデオの受信

    ビデオトラックをビデオの受信に利用できます。 受信用のビデオトラックは PeerConnection インスタンスの OnTrack イベントから取得することができます。 イベントから受け取った MediaStreamTrack をビデオ受信に利用するには、、 VideoStreamTrack クラスにキャストする必要があります。そして InitializeReceiver メソッドを呼び出すことで RenderTexture を取得することができます。RenderTextureの解像度は InitializeReceiver メソッドの引数から指定することができ、これによって受信した映像を拡大縮小できます。

    var peerConnection = new RTCPeerConnection();
    peerConnection.OnTrack = (RTCTrackEvent e) => {
        if (e.Track.Kind == TrackKind.Video)
        {
            var videoTrack = (VideoStreamTrack) e.Track;
            var receiveRender = videoTrack.InitializeReceiver(1280, 720);
        }
        // or
        if (e.Track is VideoStreamTrack videoTrack)
        {
            var videoTrack = (VideoStreamTrack) e.Track;
            var receiveRender = videoTrack.InitializeReceiver(1280, 720);
        }
        // Set RenderTexture to some Image class
    };
    

    複数ビデオの受信

    複数のビデオトラックを単一のピアで受信することができます。 RTCPeerConnection のインスタンスで AddTransceiver メソッドをトラックの個数に応じて実行して、シグナリングを行います。

    // call AddTransceiver as needed track count
    peerConnection.AddTransceiver(TrackKind.Video);
    // Do process signaling
    

    注意事項

    • 1つの VideoStreamTrack インスタンスで、ビデオの送信と受信の両方を行うことはできません。

    • VideoStreamTrack でビデオを受信するには、PeerConnection.OnTrack イベントのトラックを利用する必要があります。

    トップに戻る
    Copyright © 2023 Unity Technologies — 商標と利用規約
    • 法律関連
    • プライバシーポリシー
    • クッキー
    • 私の個人情報を販売または共有しない
    • Your Privacy Choices (Cookie Settings)