#video-streaming #gstreamer #python-gstreamer
#потоковое видео #gstreamer #python-gstreamer
Вопрос:
Я пытаюсь заменить playbin
в приложении свой собственный конвейер, потому что мне нужно добавить фильтры к видео. Вот что я пробовал:
# self.pipeline = gst.ElementFactory.make("playbin", None)
# self.pipeline.set_property("uri", "appsrc://")
self.pipeline = gst.Pipeline.new("player")
source = gst.ElementFactory.make("uridecodebin", "decodebin")
source.set_property("uri", "appsrc://")
self.pipeline.add(source)
aqueue = gst.ElementFactory.make("queue", "aqueue")
aconverter = gst.ElementFactory.make("audioconvert", "aconverter")
asink = gst.ElementFactory.make("autoaudiosink", "audiosink")
self.pipeline.add(aqueue)
self.pipeline.add(aconverter)
self.pipeline.add(asink)
source.link(aqueue)
aqueue.link(aconverter)
aconverter.link(asink)
vqueue = gst.ElementFactory.make("queue", "vqueue")
vconverter = gst.ElementFactory.make("videoconvert", "vconverter")
vsink = gst.ElementFactory.make("autovideosink", "videosink")
self.pipeline.add(vqueue)
self.pipeline.add(vconverter)
self.pipeline.add(vsink)
source.link(vqueue)
vqueue.link(vconverter)
vconverter.link(vsink)
Позже я подключаюсь к сигналу источника source-setup
, а затем к need-data
сигналу, чтобы передать ему данные. Это работает playbin
, т.Е. Открывается окно вывода и показывает видео. С моим пользовательским конвейером ничего не происходит — окно не открывается, и, конечно, я ничего не вижу.
Почему это так и как я могу это исправить?
Я также попытался удалить все аудио материалы и использовать только видеоэлементы с тем же результатом. Мне даже не нужен звук для этого приложения.
Ответ №1:
Uridecodebin имеет динамические пэды. Они создаются только при запуске потоковой передачи, потому что ему необходимо демультировать / декодировать, чтобы узнать, сколько пэдов ему нужно выставить. Проверьте https://gstreamer.freedesktop.org/data/doc/gstreamer/head/manual/html/chapter-pads.html#section-pads-dynamic
Для отладки также рекомендуется просматривать журналы gstreamer или проверять шину конвейера на наличие сообщений об ошибках. Вероятно, он сообщил бы о несвязанной ошибке. Или проверка возврата для вызовов link покажет вам, что произошел сбой.
В любом случае, вы можете просто использовать playbin и установить video-filter
свойство.
Комментарии:
1. Динамическое связывание работало хорошо, теперь я вижу окно вывода. Настройка свойств playbin пока не сработала, но я постараюсь сделать и это, просто чтобы посмотреть, какой способ больше подходит для моего приложения
2. Проверьте журналы отладки, чтобы узнать, помогает ли это понять проблему со свойством
3. вывод отладки говорит, что такого свойства нет. Я думаю, это должно перейти к другому вопросу.