У меня есть специальное настраиваемое устройство, которое принимает любой видеовход (например, 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
, и мне нужно изменить его, чтобы использовать мой конвейер, но это, вероятно, прервало бы воспроизведение с исходного потокового устройства.