2012-11-26 149 views
7

我想通過RTP發送多媒體數據。我想知道的是如何用Python發送和接收RTP包。我找到了python類DPKT。但無法找到一個很好的參考來展示如何在RTP中生成每個字段。Python發送和接收RTP包

如果有人能夠幫助我在服務器上生成和接收rtp數據包,我將不勝感激。

+0

我發現GSteamer是一個很好的選擇。必須閱讀才能瞭解管道的基本知識。使用gstreamer,我可以通過TCP從一臺機器發送音頻並從另一臺機器收聽。現在我試圖通過RTP發送視頻。任何幫助真的很感激。 –

+0

經過幾天的研究,我能夠在Ubuntu終端中使用gstreamer來完成上述任務。我的主要範圍是瞭解流的同步。我在gstreamer中使用了RTP和RTCP功能。我將視頻垂直分成四部分,從一臺PC發送到另一臺,並顯示在第二臺PC上。以下是使用的代碼。 –

回答

5

經過幾天的研究,我能夠在Ubuntu終端中使用gstreamer來完成上述任務。我的主要範圍是瞭解流的同步。我在gstreamer中使用了RTP和RTCP功能。我將視頻垂直分成四部分,從一臺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 

我能收到四流在一個窗口預期。但是仍然流不完全同步。

+0

來吧朋友,atleast發表您的代碼意味着什麼或添加一個鏈接,瞭解gstreamer的基礎知識 – repzero

0

您還可以將來自RTP流的音頻有效載荷與rtpdump一起傳輸到SoX。我最近寫了一個小Python腳本來做到這一點。

https://github.com/kylophone/xplay