ビデオストリーミング
WebRTC はピア間での映像のストリーミングを可能にします。 Unity でレンダリングされた映像を同時に複数のブラウザに配信することが可能です。
Note
サンプル にはビデオストリーミングの機能を確認するための PeerConnection シーンが用意されています。
ビデオの送信
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])をご覧ください。

ビデオコーデック
パッケージ内の複数のコーデックから選択可能です。なお、プラットフォームによって利用可能なコーデックは異なります。
ビデオコーデックの選択
ビデオコーデックを選択するには、まずはデバイス上で有効なコーデックのリストを取得するために 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 のページをご覧ください。