LINUX.ORG.RU

RTSP/ONVIF/gstreamer

 , ,


1

1

Возникла необходимость в воспроизведении видео с одновременным извлечением ONVIF-метаданных.

Имеем такой вот источник:

gst-launch-1.0 rtspsrc location="rtsp://user:pass@xxx.xxx.xxx.xxx:ppp/someurl" debug=true ! fakesink

на выходе (кроме всего прочего) получаем вот такой вот SDP-пакет:

v=0
o=- 1188340656180883 1 IN IP4 192.168.0.4
s=Session streamed with GStreamer
i=rtsp-server
t=0 0
a=tool:GStreamer
a=type:broadcast
a=control:*
a=range:npt=now-
m=video 0 RTP/AVP 96
c=IN IP4 0.0.0.0
a=rtpmap:96 H264/90000
a=control:stream=0
a=fmtp:96 sprop-parameter-sets=Z0IAH+KQCgC3YC3AQEB4eJEV,aM48gA==
m=application 0 RTP/AVP 96
c=IN IP4 0.0.0.0
a=rtpmap:96 vnd.onvif.metadata/90000
a=control:stream=1
sdp packet 0x7fc330012610:

Проблема раз: не получается выделить поток метаданных, то есть команда

gst-launch-1.0 rtspsrc location="rtsp://user:pass@xxx.xxx.xxx.xxx:ppp/someurl" ! application/x-rtp, media=application ! fakesink dump=true
завершается с ошибкой:
...
Progress: (request) SETUP stream 0
Progress: (request) SETUP stream 1
Progress: (open) Opened Stream
Setting pipeline to PLAYING ...
New clock: GstSystemClock
Progress: (request) Sending PLAY request
Progress: (request) Sending PLAY request
Progress: (request) Sent PLAY request
ERROR: from element /GstPipeline:pipeline0/GstRTSPSrc:rtspsrc0: Internal data flow error.
Additional debug info:
gstrtspsrc.c(4587): gst_rtspsrc_loop (): /GstPipeline:pipeline0/GstRTSPSrc:rtspsrc0:
streaming task paused, reason not-linked (-1)
...
Проблема 2: Помогите, плз, составить цепочку для gst-launch, которая, к примеру, однрвременно воспроизводила бы видеопоток и писала бы «медиапоток» в файл.

Ответ на: комментарий от Novell-ch

Пробовал:

gst-launch-1.0 rtspsrc location="rtsp://user:pass@xxx.xxx.xxx.xxx:ppp/someurl" ! tee name=t t. ! queue ! application/x-rtp, media=video ! fakesink t. ! queue ! application/x-rtp, media=application ! fakesink dump=true -vvv
получил такой вот выхлоп:
Setting pipeline to PAUSED ...
Pipeline is live and does not need PREROLL ...
Progress: (open) Opening Stream
Progress: (connect) Connecting to rtsp://...
Progress: (open) Retrieving server options
Progress: (open) Retrieving media info
Progress: (request) SETUP stream 0
Progress: (request) SETUP stream 0
Progress: (request) SETUP stream 0
/GstPipeline:pipeline0/GstRTSPSrc:rtspsrc0/GstRtpBin:manager: latency = 2000
/GstPipeline:pipeline0/GstRTSPSrc:rtspsrc0/GstRtpBin:manager: ntp-sync = false
/GstPipeline:pipeline0/GstRTSPSrc:rtspsrc0/GstRtpBin:manager: use-pipeline-clock = false
/GstPipeline:pipeline0/GstRTSPSrc:rtspsrc0/GstRtpBin:manager: drop-on-latency = false
/GstPipeline:pipeline0/GstRTSPSrc:rtspsrc0/GstRtpBin:manager: buffer-mode = Slave receiver to sender clock
Progress: (request) SETUP stream 1
Progress: (open) Opened Stream
Setting pipeline to PLAYING ...
New clock: GstSystemClock
Progress: (request) Sending PLAY request
Progress: (request) Sending PLAY request
Progress: (request) Sent PLAY request
/GstPipeline:pipeline0/GstRTSPSrc:rtspsrc0/GstRtpBin:manager/GstRtpSession:rtpsession0.GstPad:send_rtcp_src: caps = application/x-rtcp
/GstPipeline:pipeline0/GstRTSPSrc:rtspsrc0/GstRtpBin:manager.GstGhostPad:send_rtcp_src_0: caps = application/x-rtcp
/GstPipeline:pipeline0/GstRTSPSrc:rtspsrc0/GstRtpBin:manager.GstGhostPad:send_rtcp_src_0.GstProxyPad:proxypad2: caps = application/x-rtcp
/GstPipeline:pipeline0/GstRTSPSrc:rtspsrc0/GstRtpBin:manager.GstGhostPad:recv_rtp_src_0_3544281827_96: caps = application/x-rtp, media=(string)video, payload=(int)96, clock-rate=(int)90000, encoding-name=(string)H264, sprop-parameter-sets=(string)"Z0IAH+KQCgC3YC3AQEB4eJEV\,aM48gA\=\=", a-tool=(string)GStreamer, a-type=(string)broadcast, clock-base=(uint)2032600381, seqnum-base=(uint)27277, npt-start=(guint64)0, play-speed=(double)1, play-scale=(double)1
/GstPipeline:pipeline0/GstRTSPSrc:rtspsrc0.GstGhostPad:recv_rtp_src_0_3544281827_96: caps = application/x-rtp, media=(string)video, payload=(int)96, clock-rate=(int)90000, encoding-name=(string)H264, sprop-parameter-sets=(string)"Z0IAH+KQCgC3YC3AQEB4eJEV\,aM48gA\=\=", a-tool=(string)GStreamer, a-type=(string)broadcast, clock-base=(uint)2032600381, seqnum-base=(uint)27277, npt-start=(guint64)0, play-speed=(double)1, play-scale=(double)1
/GstPipeline:pipeline0/GstRTSPSrc:rtspsrc0.GstGhostPad:recv_rtp_src_0_3544281827_96.GstProxyPad:proxypad4: caps = application/x-rtp, media=(string)video, payload=(int)96, clock-rate=(int)90000, encoding-name=(string)H264, sprop-parameter-sets=(string)"Z0IAH+KQCgC3YC3AQEB4eJEV\,aM48gA\=\=", a-tool=(string)GStreamer, a-type=(string)broadcast, clock-base=(uint)2032600381, seqnum-base=(uint)27277, npt-start=(guint64)0, play-speed=(double)1, play-scale=(double)1
/GstPipeline:pipeline0/GstRTSPSrc:rtspsrc0/GstRtpBin:manager.GstGhostPad:recv_rtp_src_0_3544281827_96.GstProxyPad:proxypad3: caps = application/x-rtp, media=(string)video, payload=(int)96, clock-rate=(int)90000, encoding-name=(string)H264, sprop-parameter-sets=(string)"Z0IAH+KQCgC3YC3AQEB4eJEV\,aM48gA\=\=", a-tool=(string)GStreamer, a-type=(string)broadcast, clock-base=(uint)2032600381, seqnum-base=(uint)27277, npt-start=(guint64)0, play-speed=(double)1, play-scale=(double)1
ERROR: from element /GstPipeline:pipeline0/GstRTSPSrc:rtspsrc0: Internal data flow error.
Additional debug info:
gstrtspsrc.c(4587): gst_rtspsrc_loop (): /GstPipeline:pipeline0/GstRTSPSrc:rtspsrc0:
streaming task paused, reason not-linked (-1)
Execution ended after 0:00:02.031626501
Setting pipeline to PAUSED ...
Setting pipeline to READY ...
Setting pipeline to NULL ...
Freeing pipeline ...
Видимо, пока не решу проблему раз, ко второй переходить бессмысленно ((

kai666_73 ()
Ответ на: комментарий от urquan
GST_DEBUG=4 gst-launch-1.0 rtspsrc location="rtsp://user:pass@xxx.xxx.xxx.xxx:ppp/someurlB" ! application/x-rtp, media=application ! fakesink dump=true

... не влазит (может на почту?) по мне дак самый цинус здесь

0:00:00.019119842 17417      0x17c3a00 INFO        GST_ELEMENT_PADS gstutils.c:1543:gst_element_link_pads_full: trying to link element rtspsrc0:(any) to element capsfilter0:sink
0:00:00.019134246 17417      0x17c3a00 INFO        GST_ELEMENT_PADS gstelement.c:897:gst_element_get_static_pad: found pad capsfilter0:sink
0:00:00.019173944 17417      0x17c3a00 INFO                GST_PADS gstpad.c:3675:gst_pad_peer_query:<capsfilter0:src> pad has no peer
0:00:00.019217704 17417      0x17c3a00 INFO        GST_ELEMENT_PADS gstelement.c:894:gst_element_get_static_pad: no such pad 'stream_%u' in element "rtspsrc0"
0:00:00.019240727 17417      0x17c3a00 INFO        GST_ELEMENT_PADS gstutils.c:1123:gst_element_get_compatible_pad:<rtspsrc0> Could not find a compatible pad to link to capsfilter0:sink
0:00:00.019252763 17417      0x17c3a00 INFO        GST_ELEMENT_PADS gstutils.c:1543:gst_element_link_pads_full: trying to link element capsfilter0:src to element fakesink0:(any)
0:00:00.019264007 17417      0x17c3a00 INFO        GST_ELEMENT_PADS gstelement.c:897:gst_element_get_static_pad: found pad capsfilter0:src
0:00:00.019276109 17417      0x17c3a00 INFO                GST_PADS gstutils.c:936:gst_pad_check_link: trying to link capsfilter0:src and fakesink0:sink
0:00:00.019290053 17417      0x17c3a00 INFO                GST_PADS gstpad.c:3675:gst_pad_peer_query:<capsfilter0:sink> pad has no peer
0:00:00.019343462 17417      0x17c3a00 INFO                GST_PADS gstutils.c:1443:prepare_link_maybe_ghosting: capsfilter0 and fakesink0 in same bin, no need for ghost pads
0:00:00.019389112 17417      0x17c3a00 INFO                GST_PADS gstpad.c:2120:gst_pad_link_prepare: trying to link capsfilter0:src and fakesink0:sink
0:00:00.019436955 17417      0x17c3a00 INFO                GST_PADS gstpad.c:3675:gst_pad_peer_query:<capsfilter0:sink> pad has no peer
0:00:00.019468059 17417      0x17c3a00 INFO                GST_PADS gstpad.c:2322:gst_pad_link_full: linked capsfilter0:src and fakesink0:sink, successful
...

kai666_73 ()
Ответ на: комментарий от kai666_73

Судя по 0:00:00.019240727 17417 0x17c3a00 INFO GST_ELEMENT_PADS gstutils.c:1123:gst_element_get_compatible_pad:<rtspsrc0> Could not find a compatible pad to link to capsfilter0:sink он пытается линковать rtpsrc0. Возможно, это первый по счёту «m=» в sdp'шке. Может поможет явно использовать rtpsrc1, но я не знаю как это сделать в command-line.

urquan ()
Ответ на: комментарий от urquan

Из командной строки никак, rtspsrc это компонент высокого уровня. Другое дело, что, судя по документации, rtspsrc на каждый поток должен был создать по отдельному PAD-у, но в моем случае вместо двух был создан один для видеопотока.

Таким образом, можно попытаться: 1. Использовать более низкоуровневые компоненты, ака rtpbin и сотоварищи. Но я не нашел никаких гайдов как связать его с RTSP источником. 2. Написать свой appsrc на основе av-библиотек. Тот еще костыль. 3. Ковырять исходники rtspsrc -> реализовать кастомный плагин для своих целей. 4. Попробовать использовать самую последнюю версию gstreamer-а. В моем случае, не вариант, - ограничение целевой платформы.

В любом случае, без акваланга не обойтись )

Предложения?

kai666_73 ()
Ответ на: комментарий от kai666_73

У rtspsrc срабатывает хук pad-added при добавлении пада для нового потока. Я бы подписался на хук и в нём бы линковал нужный пад

Как-то так: g_signal_connect(rtspsrc, «pad-added», G_CALLBACK(cb_new_rtspsrc_pad),fakesink);

urquan ()
Ответ на: комментарий от urquan

Уже... Собрал тестовое приложение, вставил отладочную печать в callback с выводом всех caps-ов нового pad-а... и убедился, что создается только один pad с caps=«application/x-rtp,media=video...» (о чем выше уже писал)

Так что, копаю дальше

kai666_73 ()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.