RTP映像入力を利用する

SkyWay Linux®︎ SDK (以下、Linux SDK ) では、v3.0.0 から外部から受信した RTP を入力にして映像の送信が行えます。

注意 RTP映像入力機能はβ版です。

本ドキュメントはクイックスタートを実施済みの方を対象としております。

利用方法

RtpCapturerVideoSource を作成し、 skyway::media::StreamFactory::CreateVideoStream に渡すことで RTP 映像を入力とした Stream を生成し、 Publish できます。

下記のコードは外部から H.264でエンコードされた RTP 映像を入力とする例です。

以下のヘッダーを追加してください。

#include <skyway/media/rtp/rtp_capturer_video_source.hpp> #include <skyway/media/codec/h264.hpp>

skyway::Context::Setup を行う時に設定する skyway::Context::SkyWayOptions を以下のように設定してください。

skyway::Context::SkyWayOptions options; // RTP映像入力を有効にします。 options.rtp.input.video.enabled = true; // RTP映像入力のコーデックを設定します。 options.rtp.input.video.codec = std::make_shared<skyway::media::codec::H264>();

注意 RTP映像入力モードを設定する場合は codec を必ず設定してください。

利用できるコーデックは1つだけです。

RTP映像入力モードを設定した場合、OpenCVなど他の映像入力ソースは利用できません。

H.264コーデックの場合、デフォルトの profile-level-id は 多くの環境で受信可能な 42e01f (Constrained Baseline, Level 3.1) を利用します。入力側のエンコーダの設定も 42e01f に合わせる必要がありますのでご注意ください。

他の profile-level-id をコンストラクタ引数に設定することで指定できますが、受信側の環境によっては描画できない可能性があります。

また、本ドキュメントではH.264を例にしておりますが、Linux SDK ではH.264をデコードすることができないためSubscribeできません。 お試しいただく場合は、JS SDK等のSDKをSubscribe側としてご利用ください。

各SDKが対応するコーデックについてはこちらに記載しております。

skyway::Context::Setup が完了後、 RtpCapturerVideoSourceOptions で外部 RTP の入力情報を設定し、 skyway::media::rtp::RtpCapturerVideoSource::CreateRtpCapturerVideoSource を生成します。

その後、 StartReceiving をコールして RTP 映像の受信を開始します。

skyway::media::rtp::interface::RtpCapturerVideoSourceOptions options { // SkyWayが外部RTP映像入力を受け付けるIP .recv_rtp_ipv4 = "127.0.0.1", // SkyWayが外部RTP映像入力を受け付けるPort .recv_rtp_port = 50000 }; auto rtp_source = skyway::media::rtp::RtpCapturerVideoSource::Create(options); // RTP映像の受信を開始します。 auto is_receiving = rtp_source->StartReceiving(); if(!is_receiving) { std::cerr << "受信開始処理失敗: IPとポートが利用可能か確認してください。" << std::endl; return; }

注意 設定するポートが利用可能かどうか事前に確認してください。

skyway::media::StreamFactory::CreateVideoStreamStream を生成し、この StreamLocalRoomMemberPublish できます。

auto stream = skyway::media::StreamFactory::CreateVideoStream(rtp_source);

例として、GStreamer の udpsink を利用した RTP 入力の場合は以下のようなパイプラインで入力できます。

デフォルト設定の H.264の場合、Constrained Baseline, Level 3.1でエンコードします。

$ gst-launch-1.0 videotestsrc is-live=true \ ! video/x-raw,width=640,height=480,framerate=30/1 \ ! x264enc tune=zerolatency bitrate=1500 key-int-max=30 byte-stream=true \ ! video/x-h264,profile=constrained-baseline \ ! rtph264pay config-interval=1 \ ! udpsink host=127.0.0.1 port=50000

StartReceiving 後に StopReceiving をコールすることで、入力を一時停止でき、再度 StartReceiving をコールすることで入力を再開できます。

// RTP映像入力の停止 // RTP映像入力に利用しているポートが解放されます。 rtp_source->StopReceiving(); ... // RTP映像の受信を再開します。 rtp_source->StartReceiving();

RTCPの利用

Linux SDK では v3.1.0 からRTCPによるPLI送信機能が利用可能です。こちらを利用することにより、パケットロス時の映像の乱れからの回復がより効果的に行えます。

RTCPにおけるPLI(Picture Loss Indication)メッセージは受信側から送信側に対して送られるフィードバックメッセージです。

  • 映像は通常、キーフレーム送信後、次のキーフレームまでの間は差分フレームを送信します。
  • 差分フレームだけでは復元できないほど 映像が乱れている, 映像が壊れている 場合、受信側は PLI を送信します。
  • 送信側が PLI を受信すると、次のフレームをキーフレームに切り替え、受信側の映像の乱れ、破損を解消します。

Linux SDKでは、下記のオプションを設定することで、受信側から送信されたPLIを指定されたIPアドレス/ポートに対して転送します。

skyway::media::rtp::interface::RtpCapturerVideoSourceOptions options{ .recv_rtp_ipv4 = "127.0.0.1", .recv_rtp_port = 50000, // 以下のオプションを環境に合わせて設定してください .send_rtcp_ipv4 = "127.0.0.1", .send_rtcp_port = 50001 };

GStreamer の rtpbin を利用した場合、RTP入力と併せて RTCP を受け取るパイプラインは以下のようになります。

$ gst-launch-1.0 -v \ rtpbin name=rtpbin \ videotestsrc is-live=true \ ! video/x-raw,width=640,height=480,framerate=30/1 \ ! openh264enc complexity=0 gop-size=30 \ ! video/x-h264,level=3.1 \ ! rtph264pay config-interval=1 \ ! rtpbin.send_rtp_sink_0 \ rtpbin.send_rtp_src_0 \ ! udpsink host=127.0.0.1 port=50000 sync=false \ udpsrc address=127.0.0.1 port=50001 caps="application/x-rtcp" \ ! rtpbin.recv_rtcp_sink_0

商標

Linux®︎は、米国およびその他の国における Linus Torvalds の登録商標です。