Gstreamer, rtspsrc и тип полезной нагрузки

У меня возникают трудности при получении потока rtsp с определенной камеры, потому что тип полезной нагрузки rtp, который предоставляет камера, равен 35 (неназначенный), а типы полезной нагрузки, принятые плагином rtph264depay, находятся в диапазоне [96-127]. В результате gstreamer отображает ошибку ann, например:

<udpsrc0> error: Internal data flow error.
<udpsrc0> error: streaming task paused, reason not-linked (-1)

Другие камеры, которые я протестировал, работают, потому что они определяют хороший тип полезной нагрузки.

FFmpeg, MPlayer и другие инструменты воспроизводят поток, хотя они могут отображать предупреждение для неизвестного типа, например, в Mplayer:

rtsp_session: unsupported RTSP server. Server type is 'unknown'

Есть ли в gstreamer способ подделать тип полезной нагрузки, игнорировать свойство несоответствия, принудительно связать плагины или иным образом создать обходной путь для моей проблемы?

Трубопровод, который я использую, это:

gst-launcg-0.10 rtspsrc location="..." ! rtph264depay ! capsfilter caps="video/x-h264,width=1920,height=1080,framerate=(fraction)25/1" ! h264parse ! matroskamux ! filesink location="test.mkv"

2 ответа

Решение

Я понял это и заставил это работать. Размещать ответ здесь в надежде, что это может кому-то помочь. Существует множество похожих вопросов, но на них нет правильных ответов.

Следующее делает трюк:

GstElement* depay = gst_element_factory_make("rtph264depay", "video_demux");
assert(depay);
GstPad* depay_sink = gst_element_get_static_pad(depay, "sink");
GstCaps* depay_sink_caps = gst_caps_new_simple("application/x-rtp",
        "media", G_TYPE_STRING, "video",
        "encoding-name", G_TYPE_STRING, "H264",
        NULL);
gst_pad_use_fixed_caps(depay_sink);
gst_pad_set_caps(depay_sink, depay_sink_caps);
gst_object_unref(depay_sink);

он переопределяет ограничения на пусковые площадки приемника плагина rtph264depay, чтобы быть менее ограничительным, теперь он принимает любой тип полезной нагрузки (и любую тактовую частоту), если он является rtp и имеет кодировку H.264.

Я не думаю, что это возможно с GST-запуска.

E сть select-stream сигнал в rtspsrc модуль задокументирован здесь http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gst-plugins-good-plugins/html/gst-plugins-good-plugins-rtspsrc.html

это обратный вызов, где вы проверяете поток, и если вы вернетесь trueстример будет SETUP а также PLAY поток, если вы вернетесь false он будет игнорировать это, это должно позволить вам игнорировать неподдерживаемый поток, в моем случае у меня возникают проблемы с потоком метаданных ONVIF, он всегда пытается воспроизвести его, и для него нет парсера, я действительно хотел бы, чтобы gstreamer просто игнорировал потоки который не может играть и работать с тем, что у него есть, или, по крайней мере, с флажком для переключения этого поведения.

Другие вопросы по тегам