LINUX.ORG.RU

Qt Phonon video player в отдельном потоке.

 , ,


0

3

Есть приложение, выводящее несколько видео на одном экарне, по сути используется фононовский плеер, в несколько фреймов(ну несколько в ряд, скажем). Каждый фрейм - отдельный объект фононоского плеера. Видео принимается по сети в rtmp, и по этому случаются подвисания при переключении видео источника(ну ссылка там меняется когда например). Всё это дело крутится в одном главном потоке с GUI. Логично было бы убрать их в отдельные потоки, но тут сразу ограниение Qt, все виджеты должны быть в главном потоке.

Посмотрел поподробнее Phonon, а точнее на Phonon::MediaObject и Phonon::VideoWidget, подумал что неплохо бы вынести Phonon::MediaObject в поток, вынес. Видео виджет тем временем живет в основном потоке. Далее связываем видеовиджет с медиаобджек с помощью Phonon::createPath. Всё компилится, но при запуске в логи сыпятся ошибки данного содержания :

QObject: Cannot create children for a parent that is in a different thread.
(Parent is Phonon::MediaObject(0xab5004c8), parent's thread is QThread(0x9c505f0), current thread is QThread(0x921d250)

и вместо видео на виджет выводится белая картинка, хоть и с нужными размерами. Вопрос: кто-то занимался подобным, пробовал вынести объект источника в отдельный поток? Может есть другие варианты?



Последнее исправление: Blastbit (всего исправлений: 1)

Забыл небольшую деталь. Это всё дело я использую в QML через QGraphicsProxywidget. Если создать объект виджета отдельно, то так же ругается в логи, но видео выводит.

Blastbit
() автор топика
Ответ на: комментарий от NoMasters

Разьве? ну странно тогда, т.к. у меня при переключении иногда(но часто) подвисает интерфейс, и мне кажется это не с отрисовкой связано.

Blastbit
() автор топика
Ответ на: комментарий от NoMasters

Вот я допустим подрубил к фреймам rtmp потоки, но допустим они не качаются из-за чего то(либо канал узкий, либо ещё что), я меняю ссылки(сразу пачкой у скажем 9 плееров) и отправляю на play, апликуха виснет на секунд 5, и только потом отпускает и например в логи сыпется мат от Gstreamer, такой например

ERROR: RTMP_ReadPacket, failed to read RTMP packet header

Оно поянтно что тут поток битый и тд, но как мне убрать такую задержку? Если ссылки не битые и всё ок, то обычно зависонов таких нет.

Blastbit
() автор топика
Ответ на: комментарий от vladimirsmirnov9

всё бы ничего, да вот кутэ 5 не могу использовать, надо на 4.8

Сколько не рыл - другого способа не нашел, вроде даже на оф сайтах так говорят делать. Я ещё не пробовал по нормальному копнуть QtMultimedia но примеры по ним ничего интересного не показали, если есть какие то с приемом потокового вещания - поделитесь.

Blastbit
() автор топика

Тебе надо читать основы Qt. В часности про QObject и QThread, а также про потоковую модель в Qt. Без понимания принципов работы Qt у тебя всегда будут вылезать подобные грабли с потоками.

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

Я конечно извиняюсь, но с Qt я достаточно поработал и основы этих вещей я уж точно знаю, в противном случае я не смог бы работать на проектах с плюсами и кутэ. Конечно я может и ошибаюсь, но дело тут не в этом. Меня интересует именно мультимедийная часть, и данная проблема.

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

Дело не в мультимедийной части, а в базовых принципах.

alpha4
()

На сколько я понял это не возможно сделать таким образом. Надо чтоб эти объекты были в одном потоке, ну и соответственно в итоге всё это дело будет работать только в GUI потоке. Сейчас пробую ковырять сам GStreamer (Qt биндинг), хорошо бы было с него получать просто картинки (в raw или ещё как), чтоб дальше из не основного потока отправлять их просто сигналом. Есть мысли по данному поводу?

Blastbit
() автор топика

Ну а вообще конечно главная проблема в том, что фонон (ну так то на самом деле GStreamer, плеер на нем ведет себя так же) при битом потоке виснет на долго, подвешивая главный поток. Точнее если поток битый(да или просто канал «плохой») и пробовать остановить или переназначить адрес, ну или заново запустить.

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