8

我想通过 RTP 发送多媒体数据。我想知道的是如何使用 Python 发送和接收 RTP 数据包。我找到了python类DPKT。但是无法找到一个很好的参考来可视化如何在 RTP 中生成每个文件。

如果有人可以帮助我在服务器上生成和接收 rtp 数据包,我将不胜感激。

4

2 回答 2

5

经过几天的学习,我能够在 ubuntu 终端中使用 gstreamer 来完成上述任务。我的主要范围是了解流的同步。我在 gstreamer 中使用了 RTP 和 RTCP 功能。我将视频垂直分成四部分,然后从一台 PC 发送到另一台 PC,然后在第二台 PC 上显示。以下是使用的代码。

发件人:

gst-launch -v \
\
gstrtpbin name=rtpbin1 \
filesrc location=/home/x101.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/x102.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/x103.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/x104.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

我能够按预期在一个窗口中接收四个流。但是流仍然不能完美同步。

于 2012-12-04T12:44:49.153 回答
0

您还可以将 RTP 流中的音频有效负载通过管道传输rtpdumpSoX. 我最近写了一个小的 Python 脚本来做这件事。

https://github.com/kylophone/xplay

于 2014-08-07T20:06:44.963 回答