3

Gstreamerを使用したRTCPを使用したさまざまなストリームの同期について詳しく知りたいです。レシーバーで同期をよりよく観察できるように、ビデオは垂直方向に4つの部分に分割されました。以下は、送信者と受信者に使用されるコードです。

送信者:

gst-launch -v \
\
gstrtpbin name=rtpbin1 \
filesrc location=/home/chinthaka/Desktop/MageHeenaye101.avi ! decodebin ! x264enc ! rtph264pay ! rtpbin1.send_rtp_sink_0 \
rtpbin1.send_rtp_src_0 ! udpsink host=192.168.1.100 port=5011 \
rtpbin1.send_rtcp_src_0 ! udpsink host=192.168.1.100 port=5012 \
udpsrc port=5013 ! rtpbin1.recv_rtcp_sink_0 \
\
gstrtpbin name=rtpbin2 \
filesrc location=/home/chinthaka/Desktop/MageHeenaye102.avi ! decodebin ! x264enc ! rtph264pay ! rtpbin2.send_rtp_sink_0 \
rtpbin2.send_rtp_src_0 ! udpsink host=192.168.1.100 port=5021 \
rtpbin2.send_rtcp_src_0 ! udpsink host=192.168.1.100 port=5022 \
udpsrc port=5023 ! rtpbin2.recv_rtcp_sink_0 \
\
gstrtpbin name=rtpbin3 \
filesrc location=/home/chinthaka/Desktop/MageHeenaye103.avi ! decodebin ! x264enc ! rtph264pay ! rtpbin3.send_rtp_sink_0 \
rtpbin3.send_rtp_src_0 ! udpsink host=192.168.1.100 port=5031 \
rtpbin3.send_rtcp_src_0 ! udpsink host=192.168.1.100 port=5032 \
udpsrc port=5033 ! rtpbin3.recv_rtcp_sink_0 \
\
gstrtpbin name=rtpbin4 \
filesrc location=/home/chinthaka/Desktop/MageHeenaye104.avi ! decodebin ! x264enc ! rtph264pay ! rtpbin4.send_rtp_sink_0 \
rtpbin4.send_rtp_src_0 ! udpsink host=192.168.1.100 port=5041 \
rtpbin4.send_rtcp_src_0 ! udpsink host=192.168.1.100 port=5042 \
udpsrc port=5043 ! rtpbin4.recv_rtcp_sink_0

受信者:

gst-launch -v \
videomixer name=mix ! ffmpegcolorspace ! autovideosink sync=false async=false \
\
gstrtpbin name=rtpbin1 \
udpsrc port=5011 caps = "application/x-rtp, media=(string)video, clock-rate=(int)90000, encoding-name=(string)H264, sprop-parameter-sets=(string)\"Z01AFeygbCPNLgIgAAADAC7msoAB4sWywA\\=\\=\\,aOvssg\\=\\=\", payload=(int)96, ssrc=(uint)861153369, clock-base=(uint)4026289255, seqnum-base=(uint)30449" ! rtpbin1.recv_rtp_sink_0 rtpbin1. ! rtph264depay ! queue ! ffdec_h264 ! videobox border-alpha=0 top=0 left=0 ! mix. \
udpsrc port=5012 ! rtpbin1.recv_rtcp_sink_0 \
rtpbin1.send_rtcp_src_0 ! udpsink port=5013 host=192.168.1.104 \
\
gstrtpbin name=rtpbin2 \
udpsrc port=5021 caps = "application/x-rtp, media=(string)video, clock-rate=(int)90000, encoding-name=(string)H264, sprop-parameter-sets=(string)\"Z01AFeygbCPNLgIgAAADAC7msoAB4sWywA\\=\\=\\,aOvssg\\=\\=\", payload=(int)96, ssrc=(uint)861153369, clock-base=(uint)4026289255, seqnum-base=(uint)30449" ! rtpbin2.recv_rtp_sink_0 rtpbin2. ! rtph264depay ! queue ! ffdec_h264 ! videobox border-alpha=0 top=-120 left=0 ! mix. \
udpsrc port=5022 ! rtpbin2.recv_rtcp_sink_0 \
rtpbin2.send_rtcp_src_0 ! udpsink port=5023 host=192.168.1.104 \
\
gstrtpbin name=rtpbin3 \
udpsrc port=5031 caps = "application/x-rtp, media=(string)video, clock-rate=(int)90000, encoding-name=(string)H264, sprop-parameter-sets=(string)\"Z01AFeygbCPNLgIgAAADAC7msoAB4sWywA\\=\\=\\,aOvssg\\=\\=\", payload=(int)96, ssrc=(uint)861153369, clock-base=(uint)4026289255, seqnum-base=(uint)30449" ! rtpbin3.recv_rtp_sink_0 rtpbin3. ! rtph264depay ! queue ! ffdec_h264 ! videobox border-alpha=0 top=-240 left=0 ! mix. \
udpsrc port=5032 ! rtpbin3.recv_rtcp_sink_0 \
rtpbin3.send_rtcp_src_0 ! udpsink port=5033 host=192.168.1.104 \
\
gstrtpbin name=rtpbin4 \
udpsrc port=5041 caps = "application/x-rtp, media=(string)video, clock-rate=(int)90000, encoding-name=(string)H264, sprop-parameter-sets=(string)\"Z01AFeygbCPNLgIgAAADAC7msoAB4sWywA\\=\\=\\,aOvssg\\=\\=\", payload=(int)96, ssrc=(uint)861153369, clock-base=(uint)4026289255, seqnum-base=(uint)30449" ! rtpbin4.recv_rtp_sink_0 rtpbin4. ! rtph264depay ! queue ! ffdec_h264 ! videobox border-alpha=0 top=-360 left=0 ! mix. \
udpsrc port=5042 ! rtpbin4.recv_rtcp_sink_0 \
rtpbin4.send_rtcp_src_0 ! udpsink port=5043 host=192.168.1.104

同じビデオで4つのビデオを受信できますが、各ストリームの同期は完全ではありません。

  • すべてのレシーバーに同じキャップを使用しました。毎回生成される上限が送信者で異なることがわかりました。生成されたキャップをレシーバーに送信して、レシーバーで同じキャップを使用できるようにする良い方法はありますか?

  • RTCPを使用して複数のストリームを同期するための最良の方法はありますか?

  • ここでは、さまざまなポートがさまざまなRTPおよびRTCPセッションに使用されます。1つはRTP用、もう1つはRTCP用の2つのポートのみを使用することをお勧めしますか。

親切にアドバイスしてください。私はGstreamerにまったく慣れておらず、同期に慣れるために最善を尽くしています。

4

1 に答える 1

5

代わりに、コードでこれを開始することを強くお勧めします。起動ラインはプロトタイピングに最適ですが、同期などのきめ細かい制御に関しては、代わりにコードを使用する必要があります。

GStreamers rtpbinは、RTCP同期を美しく処理します。2つ以上のストリームが同じcnameを持っている場合、送信側で見られるようにこれらのストリーム間の相対的なタイムスタンプの差を計算し(RTCPを使用)、gstrtpjitterbuffersts-offsetを使用してこれを受信側で複製します。理論的には、メディアが送信時に同期されていれば、受信側でも同期させることができるはずです。

于 2013-06-26T22:12:57.810 に答える