ビデオストリーミング
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]
)をご覧ください。
ビデオの受信
ビデオトラックをビデオの受信に利用できます。
受信用のビデオトラックは 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
イベントのトラックを利用する必要があります。