LINUX.ORG.RU

Как выводить динамический контент/видео в Qt?

 , ,


0

2

Название темы тупое, но лучше не придумал…

Имеем QScrollArea, на которой находятся 4-е «mpv виджета», вертикальным списком.

  • Если используем вариант отрисовки на нативном виджете - видео «рвётся» при прокрутке.
  • Если используем вариант отрисовки на OpenGL виджете - GUI начинает лагать. Я так понимаю, что обновление контекстов блочит основной поток.

Может кто-то сталкивался с подобным? Есть ли смысл бороться с Qt или стоит сразу делать viewport на GL? Если да, то с чего начать? SDL?

Задача состоит в отображении n роликов одновременно с динамическим изменением их позиций. При этом сами ролики живут сами по себе и синхронизировать их нельзя (типа выводить все 4-е за раз).

★★★★★

Последнее исправление: RazrFalcon (всего исправлений: 1)
Ответ на: комментарий от annulen

Так обновление QOpenGLWidget в текущем же происходит.

И получаем 25fps * 4 - 100 обновлений в секунду. Отсюда и тормоза.

RazrFalcon ★★★★★
() автор топика
Последнее исправление: RazrFalcon (всего исправлений: 1)
// If the Qt window is not visible, Qt's update() will just skip rendering.
// This confuses mpv's opengl-cb API, and may lead to small occasional
// freezes due to video rendering timing out.
// Handle this by manually redrawing.

Какой-то костыль. Проблема в mpv, а не qt.

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

Проблема в mpv, а не qt.

Это комплексная проблема. Любой проигрыватель будет тупить в таких условиях. Значит, проигрывателю надо создать такие условия, чтобы он думал, что все что он отображает выстреливалось на экран. Может быть, поиграться с setUpdateBehavior() для QOpenGLWidget? Хотя нет, это из другой оперы.

Xintrea ★★★★★
()

А что ты делаешь? Видеонаблюдение? Управление камерами огромных человекоподобных роботов?

Xintrea ★★★★★
()

1) Купить процессор мощнее :)

2) Использовать ускорение декодирования и отрисовки, например VAAPI

Harald ★★★★★
()

При этом сами ролики живут сами по себе и синхронизировать их нельзя (типа выводить все 4-е за раз).

а что принципиально мешает-то? Декодируешь все 4 кадра (либо оставляешь предыдущий, если где-то нового нет), ресайзишь, склеиваешь в одну картинку и вот её целиком за один раз рисуешь

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

Использовать ускорение декодирования и отрисовки, например VAAPI

Чтобы от VAAPI был толк, нужно не только декодировать аппаратно, но и правильно выводить на экран без лишних копирований обратно в ОЗУ. Иначе прирост будет мизерным.

ox55ff ★★★★★
()
Ответ на: комментарий от Xintrea

Сложно объяснить, но нужно очень быстро выводить несколько видеопотоков, при этом сами виджеты тоже постоянно перемещаются.

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

Проблема не в декодировании, а в Qt. У меня нагрузка на про 2%, но она лагает, так как постоянно блочится основной поток. Даже 4-е ролика, каждый 24fps - это уже почти 100 обновлений в секунду в худшем случае.

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

Даже 4-е ролика, каждый 24fps - это уже почти 100 обновлений в секунду в худшем случае.

100фпс и близко не должно быть проблемой

Проблема не в декодировании, а в Qt

Даже если декодрование без ускорения - это, действительно, не проблема, т.к. оно, очевидно, выполняется не в главном потоке. Проблема, скорее всего в том, что ты делаешь что-то лишнее в главном потоке помимо отрисовки того, что выдает mpv. Есть минимальный пример?

Кстати, opengl-cb объявлено устаревшим. Но и с ним тормозить не должно.

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

Есть минимальный пример?

Да. QScrollArea с 4-я mpv виджетами. Всё. 10 строк кода.

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

Что это у тебя за ролики? 240p порно что ли? Так сейчас и порно 60 фпс уже лет 10, хватит дрочить на пиксели. С камер тоже 60 фпс идёт, если это не убогое 2кадравсекунду CCTV и кто-то решил экономить.

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

Каждое виде в отдельном треде, рендерит в композитное окно. Хоть 10, хоть 20 видео. Проблем быть не должно.

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