Воспроизведение входящего потока RTP с помощью GStreamer

Я разрабатываю приложение GStreamer и немного борюсь с реализацией проигрывателя для входящих потоков RTP. Я пытаюсь построить конвейер вокруг элемента gstrtpbin. Я пытаюсь смоделировать конвейер, используя конструкцию gst-launch:

VIDEO_CAPS="application/x-rtp,media=(string)video,clock-rate=(int)90000,encoding-name=(string)H264"

gst-launch -v udpsrc caps=$VIDEO_CAPS port=4444 \
              ! gstrtpbin .recv_rtp_sink_0 \
              ! rtph264depay ! ffdec_h264 ! xvimagesink

Когда я запускаю скрипт, GStreamer сообщает об этих ошибках:

Setting pipeline to PAUSED ...
Pipeline is live and does not need PREROLL ...
Setting pipeline to PLAYING ...
/GstPipeline:pipeline0/GstRtpBin:rtpbin0/GstRtpSession:rtpsession0: ntp-ns-base = 3469468914024449000
New clock: GstSystemClock
/GstPipeline:pipeline0/GstRtpBin:rtpbin0/GstRtpSession:rtpsession0.GstPad:recv_rtp_sink: caps = application/x-rtp, media=(string)video, clock-rate=(int)90000, encoding-name=(string)H264
/GstPipeline:pipeline0/GstRtpBin:rtpbin0.GstGhostPad:recv_rtp_sink_0: caps = application/x-rtp, media=(string)video, clock-rate=(int)90000, encoding-name=(string)H264
/GstPipeline:pipeline0/GstRtpBin:rtpbin0.GstGhostPad:recv_rtp_sink_0.GstProxyPad:proxypad0: caps = application/x-rtp, media=(string)video, clock-rate=(int)90000, encoding-name=(string)H264
/GstPipeline:pipeline0/GstRtpBin:rtpbin0/GstRtpSession:rtpsession0.GstPad:recv_rtp_src: caps = application/x-rtp, media=(string)video, clock-rate=(int)90000, encoding-name=(string)H264
/GstPipeline:pipeline0/GstRtpBin:rtpbin0/GstRtpSsrcDemux:rtpssrcdemux0.GstPad:sink: caps = application/x-rtp, media=(string)video, clock-rate=(int)90000, encoding-name=(string)H264
/GstPipeline:pipeline0/GstRtpBin:rtpbin0/GstRtpJitterBuffer:rtpjitterbuffer0.GstPad:src: caps = application/x-rtp, media=(string)video, clock-rate=(int)90000, encoding-name=(string)H264
/GstPipeline:pipeline0/GstRtpBin:rtpbin0/GstRtpJitterBuffer:rtpjitterbuffer0.GstPad:sink: caps = application/x-rtp, media=(string)video, clock-rate=(int)90000, encoding-name=(string)H264
/GstPipeline:pipeline0/GstRtpBin:rtpbin0/GstRtpPtDemux:rtpptdemux0.GstPad:sink: caps = application/x-rtp, media=(string)video, clock-rate=(int)90000, encoding-name=(string)H264
/GstPipeline:pipeline0/GstRtpBin:rtpbin0.GstGhostPad:recv_rtp_src_0_960476599_33.GstProxyPad:proxypad1: caps = application/x-rtp, media=(string)video, clock-rate=(int)90000, encoding-name=(string)H264, payload=(int)33
ERROR: from element /GstPipeline:pipeline0/GstUDPSrc:udpsrc0: Internal data flow error.
Additional debug info:
gstbasesrc.c(2378): gst_base_src_loop (): /GstPipeline:pipeline0/GstUDPSrc:udpsrc0:
streaming task paused, reason not-linked (-1)
Execution ended after 209381685 ns.
Setting pipeline to PAUSED ...
Setting pipeline to READY ...
/GstPipeline:pipeline0/GstRtpBin:rtpbin0.GstGhostPad:recv_rtp_src_0_960476599_33: caps = NULL
/GstPipeline:pipeline0/GstRtpBin:rtpbin0/GstRtpPtDemux:rtpptdemux0.GstPad:src_33: caps = NULL
/GstPipeline:pipeline0/GstRtpBin:rtpbin0/GstRtpPtDemux:rtpptdemux0.GstPad:sink: caps = NULL
/GstPipeline:pipeline0/GstRtpBin:rtpbin0/GstRtpJitterBuffer:rtpjitterbuffer0.GstPad:sink: caps = NULL
/GstPipeline:pipeline0/GstRtpBin:rtpbin0/GstRtpJitterBuffer:rtpjitterbuffer0.GstPad:src: caps = NULL
/GstPipeline:pipeline0/GstRtpBin:rtpbin0/GstRtpSsrcDemux:rtpssrcdemux0.GstPad:src_960476599: caps = NULL
/GstPipeline:pipeline0/GstRtpBin:rtpbin0/GstRtpSsrcDemux:rtpssrcdemux0.GstPad:sink: caps = NULL
/GstPipeline:pipeline0/GstRtpBin:rtpbin0/GstRtpSession:rtpsession0.GstPad:recv_rtp_src: caps = NULL
/GstPipeline:pipeline0/GstRtpBin:rtpbin0/GstRtpSession:rtpsession0.GstPad:recv_rtp_sink: caps = NULL
/GstPipeline:pipeline0/GstRtpBin:rtpbin0.GstGhostPad:recv_rtp_sink_0: caps = NULL
/GstPipeline:pipeline0/GstUDPSrc:udpsrc0.GstPad:src: caps = NULL
Setting pipeline to NULL ...
Freeing pipeline ...

Я должен отметить, что он работает с файлом playbin и SDP. Например этот файл:

v=0
o=- 1188340656180883 1 IN IP4 127.0.0.1
s=Session streamed by GStreamer
i=server.sh
t=0 0
a=tool:GStreamer
a=type:broadcast
m=video 4444 RTP/AVP 96
c=IN IP4 127.0.0.1
a=rtpmap:96 H264/90000

Можно использовать для воспроизведения потока следующим образом:

gst-launch -vvv playbin uri=file://`pwd`/stream.sdp

Для полноты: я использую VLC для отправки данных. Это команда:

vlc -I rc /usr/local/movies/sample.mp4 \
    --screen-fps=10 :screen-caching=100 \
    --sout='#transcode{vcodec=h264,venc=x264{bframes=0,keyint=40},vb=512}:\
                   rtp{mux=ts,dst=127.0.0.1,port=4444}'

Кто-нибудь поможет мне понять, почему происходит сбой сценария gst-launch? Ошибка «причина не связана» заставляет меня думать, что связь между gstrtpbin и элементами rtph264depay нарушена. Но я не знаю, как это исправить.

Изменить
По совету RAOF я исправил несколько ошибок в своей команде. Однако я использую ffdec_h264 и autovideosink, потому что в моей системе Windows не установлены плагины Fluh264dec и xvimage:

gst-launch-0.10 udpsrc port=4444 caps="application/x-rtp,media=(string)video,clock-rate=(int)90000,encoding-name=(string)H264" ! .recv_rtp_sink_0 gstrtpbin ! rtpmp2tdepay ! mpegtsdemux ! ffdec_h264 ! autovideosink 

Что приводит к новым ошибкам:

0:00:00.743000000   516   024070A8 ERROR                 ffmpeg .:0:: non-existing PPS referenced
0:00:00.744000000   516   024070A8 ERROR                 ffmpeg .:0:: non-existing PPS referenced
0:00:00.745000000   516   024070A8 ERROR                 ffmpeg .:0:: decode_slice_header error
0:00:00.745000000   516   024070A8 ERROR                 ffmpeg .:0:: no frame!
0:00:00.812000000   516   024070A8 ERROR                 ffmpeg .:0:: non-existing PPS referenced
0:00:00.813000000   516   024070A8 ERROR                 ffmpeg .:0:: non-existi
...
ERROR: from element /GstPipeline:pipeline0/GstUDPSrc:udpsrc0: Internal data flow
 error.
Additional debug info:
..\Source\gstreamer\libs\gst\base\gstbasesrc.c(2378): gst_base_src_loop (): /Gst
Pipeline:pipeline0/GstUDPSrc:udpsrc0:
streaming task paused, reason not-negotiated (-4)
Execution ended after 4790000000 ns.
Setting pipeline to PAUSED ...
Setting pipeline to READY ...
Setting pipeline to NULL ...
Freeing pipeline ...

Я все еще пытаюсь понять, как это исправить. Если вы можете помочь, то не стесняйтесь сделать это.

Редактировать 2
Я снова провел тестирование с использованием решения SDP и заметил, что также возникают ошибки "несуществующие PPS", но видео воспроизводится. С другой стороны, фатальная «внутренняя ошибка потока данных» появляется только при использовании пользовательского конвейерного решения. Я подозреваю, что ошибки «несуществующие PPS» вызваны кодировщиком x264. «Внутренняя ошибка потока данных» должна быть вызвана ошибкой в ​​моем конвейере или, возможно, ошибкой в ​​каком-то плагине Windows. Я проведу дополнительные исследования...


person StackedCrooked    schedule 10.12.2009    source источник


Ответы (3)


Насколько я могу судить, у вас есть две проблемы:

Во-первых, кажется, важен порядок спецификации стока: вместо ... ! gstrtpbin .recv_rtp_sink_0 ! ... нужно иметь ... ! .recv_rtp_sink_0 gstrtpbin ! ....

Во-вторых, vlc отправляет транспортный поток MPEG2 — у вас есть mux=ts в дескрипторе вывода потоковой передачи rtp — но вы пытаетесь загрузить необработанный поток h264. Вам нужно выгрузить поток ts, а затем демультиплексировать его, чтобы получить данные потока h264.

Итак, наконец, трубопровод

gst-launch-0.10 -v udpsrc port=4444 \
caps="application/x-rtp,media=(string)video,clock-rate=(int)90000,encoding-name=(string)H264" \
! .recv_rtp_sink_0 gstrtpbin ! rtpmp2tdepay \
! mpegtsdemux ! fluh264dec ! xvimagesink

у меня работает, используя демультиплексор TS (mpegtsdemux) и декодер h264 (fluh264dec).

person RAOF    schedule 22.12.2009
comment
Сейчас я установил gstreamer-ffmpeg и попробовал его с ffdec_h264 и autovideosink. Мой конвейер работает для меня с этими элементами вместо fluh264dec и xvimagesink. Я не уверен, в чем заключается ваша проблема, сейчас. - person RAOF; 23.12.2009
comment
Я подозреваю, что это проблема, связанная с Windows, я проверю на своем компьютере с Linux. Если вам интересно, я обновлю свой прогресс в этом посте. Спасибо, вы очень помогли. - person StackedCrooked; 23.12.2009

gst-launch-0.10 -vvvv rtspsrc location=rtsp://192.168.250.100:554 latency=100 ! \
application/x-rtp,media="video",payload=99,clock-rate=90000,encoding-name="H264"  ! \
rtph264depay !  ffdec_h264 ! ffmpegcolorspace ! xvimagesink

это сработало для меня с "Grandtec Electronic MegaPixel WIFI CAM"

person O A U    schedule 04.05.2012

Вы также можете попробовать этот.

gst-launch-0.10 -v rtspsrc location="rtsp://10.107.2.217/StreamingSetting?version=1.0&action=getRTSPStream&ChannelID=1&ChannelName=Channel1" user-id=admin user-pw=admin123 caps=" application/x-rtp,media=(string)video,clock-rate=(int)90000,encoding-name=(string)H264,payload=(int)96,ssrc=(uint)237526004,clock-base=(uint)1584170994,seqnum-base=(uint)42626" port=554 ! rtph264depay queue-delay=0 ! h264parse ! decodebin2 ! queue leaky=1 ! autovideosink

Это также работает, когда ваша потоковая передача в сети защищена, и она работает на

rtsp://10.107.2.217

RTSP Port : 554

Video Codec : H.264

Надеюсь, это полезно для вас, ребята.

person AB Bolim    schedule 26.03.2014