gstreamer - не может получить простой поток UDP с playbin, не может определить тип потока - PullRequest
0 голосов
/ 27 марта 2020

У меня есть специальное настраиваемое устройство, которое принимает любой видеовход (например, HDMI) и передает его с настроенными настройками несколькими доступными способами (rtmp, udp et c.). Я использую его для потоковой передачи по многоадресному адресу UDP 238.0.0.1:1234. Устройство потоковой передачи сконфигурировано для потоковой передачи с основным профилем H.264 на 1920x1080@30fps.

. Я могу легко воспроизвести этот поток с помощью playbin-файла gstreamer без проблем:

gst-launch-1.0 -v playbin uri=udp://238.0.0.1:1234

Я хотел сделать несколько ручная потоковая передача с одного устройства linux, которое работает в режиме консоли (без экранов) так же, как это делает стример, но с использованием обычных файлов mp4. Я построил такой конвейер для потоковой передачи:

gst-launch-1.0 -v filesrc location="test.mp4" ! qtdemux ! rtph264pay pt=96 config-interval=-1 ! udpsink host=238.0.0.1  multicast-iface=eth0 force-ipv4=true port=1234

И он работает, он потоковое видео без какой-либо перекодировки. Я могу воспроизвести этот поток, используя следующий конвейер:

gst-launch-1.0 -v udpsrc uri=udp://238.0.0.1:1234 caps = "application/x-rtp" ! rtpjitterbuffer ! rtph264depay ! queue ! decodebin ! autovideosink

Играет нормально. Однако, пытаясь воспроизвести его с помощью playbi (gst-launch-1.0 -v playbin uri=udp://238.0.0.1:1234), я получаю ошибку Could not determine type of stream:

Setting pipeline to PAUSED ...
Pipeline is live and does not need PREROLL ...
/GstPlayBin:playbin0/GstURIDecodeBin:uridecodebin0: ring-buffer-max-size = 0
/GstPlayBin:playbin0/GstURIDecodeBin:uridecodebin0: buffer-size = -1
/GstPlayBin:playbin0/GstURIDecodeBin:uridecodebin0: buffer-duration = -1
/GstPlayBin:playbin0/GstURIDecodeBin:uridecodebin0: use-buffering = false
/GstPlayBin:playbin0/GstURIDecodeBin:uridecodebin0: download = false
/GstPlayBin:playbin0/GstURIDecodeBin:uridecodebin0: uri = udp://238.0.0.1:1234
/GstPlayBin:playbin0/GstURIDecodeBin:uridecodebin0: connection-speed = 0
/GstPlayBin:playbin0/GstURIDecodeBin:uridecodebin0: source = "\(GstUDPSrc\)\ source"
Setting pipeline to PLAYING ...
New clock: GstSystemClock
ERROR: from element /GstPlayBin:playbin0/GstURIDecodeBin:uridecodebin0/GstDecodeBin:decodebin0/GstTypeFindElement:typefind: Could not determine type of stream.
Additional debug info:
gsttypefindelement.c(1002): gst_type_find_element_chain_do_typefinding (): /GstPlayBin:playbin0/GstURIDecodeBin:uridecodebin0/GstDecodeBin:decodebin0/GstTypeFindElement:typefind
Execution ended after 0:00:02.927938711
Setting pipeline to PAUSED ...
Setting pipeline to READY ...
Setting pipeline to NULL ...
Freeing pipeline ...

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

Мой исходный конвейер воспроизведения был длиннее, но я попытался максимально удалить свойства caps go, и у меня остался только application/x-rtp, так почему же не работает playbin, если я могу удалить практически все из конвейера, и он все еще хорошо воспроизводится?

Я хочу использовать playbin, потому что я хотел бы сделать свой поток универсальным, чтобы другие устройства может играть в нее, не зная точного конвейера. У меня также есть специальное приложение, использующее библиотеку gstreamer для воспроизведения потока с playbin, и мне нужно изменить его, чтобы использовать мой конвейер, но это, вероятно, прервало бы воспроизведение с исходного потокового устройства.

...