QT большая задержка в RTSP стриме при использовании стандарта H264

Написал небольшой код для отображения видео с камер и столкнулся с проблемой задержек при трансляции, растующих в арифметической прогрессии. На камере используется стандарт H264 для кодирования, в случае MJPEG проблема отсутствует Во время работы ПО отслеживается 90-100% нагрузка на процессор.

_player.setMedia(QUrl(URI));
QVideoWidget* videoWidget = new QVideoWidget();
_ui->videoLayout->addWidget(videoWidget);
_player.setVideoOutput(videoWidget);
_player.play();

Player - объект класса QMediaPlayer. При просмотре потока в других ПО, эта задержка так же отсутствует. Как я понял, на разных системах используется разный бэк для работы в аудио или видео. Мной используется система elementary


Ответы (1 шт):

Автор решения: gbg

Есть два источника задержек, которые вносит сама технология H264.

  1. Задержка, связянная с частотой появления в потоке ключевых кадров - отобрачать поток можно начать только с ключевого кадра, так что декодер будет всегда ждать его появления.
  2. Задержка, вызванная буферизацией данных, причем иногда возможность конфигурирования этого буфера запрятана очень глубоко.

Очевидно, что оба этих источника поддаются коррекции путем настройки.

Есть еще одна беда, которая может все испортить - это недостаток системных ресурсов. Судя по вашим симптомам (прогрессирование проблемы со временем и полная загрузка процессора) - это ваш кейс.

Вероятно, другой софт, который не тормозит, использует аппаратное декодирование видео.

Беглый поиск показывает, что в Qt по этой теме все более-менее может заработать на QML, а для обычного приложения придется использовать gstreamer / libavcodec.

→ Ссылка