Python отправляет и получает RTP-пакеты

Я хочу отправить мультимедийные данные по RTP. Что мне нужно знать, так это как отправлять и получать RTP-пакеты с помощью Python. Я нашел класс Python DPKT. Но не смог найти хорошую ссылку, чтобы визуализировать, как генерировать каждое поле в RTP.

Я был бы признателен, если бы кто-нибудь помог мне генерировать и получать rtp-пакеты на сервере.


person Huá dé ní 華得尼    schedule 26.11.2012    source источник
comment
Я узнал, что GSteamer — очень хорошая альтернатива. Пришлось читать, чтобы понять основы пайплайна. С помощью gstreamer я мог отправлять аудио с одной машины и слушать с другой через TCP. Теперь я пытаюсь отправить видео через RTP. Любая помощь очень ценится.   -  person Huá dé ní 華得尼    schedule 28.11.2012
comment
После нескольких дней исследований я смог использовать gstreamer в терминале Ubuntu для выполнения вышеуказанной задачи. Моей основной целью было узнать о синхронизации потоков. Я использовал функции RTP и RTCP в gstreamer. Я разделил видео на четыре части по вертикали и отправил с одного компьютера на другой, а затем отобразил на втором компьютере. Ниже приведен используемый код.   -  person Huá dé ní 華得尼    schedule 04.12.2012


Ответы (2)


После нескольких дней исследований я смог использовать gstreamer в терминале Ubuntu для выполнения вышеуказанной задачи. Моей основной целью было узнать о синхронизации потоков. Я использовал функции RTP и RTCP в gstreamer. Я разделил видео на четыре части по вертикали и отправил с одного компьютера на другой, а затем отобразил на втором компьютере. Ниже приведен используемый код.

Отправитель:

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

Я смог получить четыре потока в одном окне, как и ожидалось. Но все же потоки не синхронизируются идеально.

person Huá dé ní 華得尼    schedule 04.12.2012
comment
Давай, друг, хотя бы опубликуй, что означают твои коды, или добавь ссылку, чтобы изучить основы gstreamer. - person repzero; 13.01.2017

Вы также можете передать звуковую полезную нагрузку из потока RTP с помощью rtpdump в SoX. Недавно я написал небольшой скрипт на Python, который делает именно это.

https://github.com/kylophone/xplay

person Kyle Swanson    schedule 07.08.2014