RTP映像入力を利用する
SkyWay Linux®︎ SDK (以下、Linux SDK ) では、v3.0.0 から外部から受信した 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を必ず設定してください。RTP映像入力モードを設定した場合、OpenCVなど他の映像入力ソースは利用できません。
利用できるコーデックは1つだけです。
H.264コーデックは SFU Room では利用できません。
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::Create で RtpCapturerVideoSource を生成します。
その後、 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::CreateVideoStream で Stream を生成し、この Stream を LocalRoomMember が Publish できます。
auto stream = skyway::media::StreamFactory::CreateVideoStream(rtp_source);例として、GStreamer の openh264enc プラグインを利用した RTP 入力の場合は以下のようなパイプラインで入力できます。
デフォルト設定の H.264の場合、Constrained Baseline, Level 3.1でエンコードします。
$ 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=falseStartReceiving 後に StopReceiving をコールすることで、入力を一時停止でき、再度 StartReceiving をコールすることで入力を再開できます。
// RTP映像入力の停止
// RTP映像入力に利用しているポートが解放されます。
rtp_source->StopReceiving();
...
// RTP映像の受信を再開します。
rtp_source->StartReceiving();
注意
StartReceivingはコールできる回数に制限があります。コールできる回数は最大65535回です。 65535回を超えてStartReceivingする場合は、skyway::Context::Disposeを実行したあとに、skyway::Context::Setupを再実行してください。
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 の登録商標です。