Почему декодер H265 должен ждать десятки кадров данных, прежде чем начать декодирование? - PullRequest
0 голосов
/ 23 января 2019

Я пытаюсь создать приложение потокового видео в реальном времени на C ++ на основе кодека H265. Моему приложению очень важна производительность в реальном времени, и я построил однопоточную программу для тестирования кодеков H265. Программа имеет простой конвейер:

  1. Схватить один кадр;
  2. Подача на энкодер;
  3. Подача закодированных данных в декодер;
  4. Показать декодированный результат или уведомление о выходе, если нет декодированного кадра.

Я попробовал комбинацию X265/DE265 и кодер и декодер AV_CODEC_ID_HEVC в комбинации avcodec, и я обнаружил явление, при котором декодер не будет декодировать "сразу" после поступления данных первого кадра, и у него есть ждать около 30 кадров данных, прежде чем начать вывод декодированного результата. Ситуация выглядит так:

              **encoding**       **decoding**
frame 1:      succeeded      ->  no frame decoded
frame 2:      succeeded      ->  no frame decoded
frame 3:      succeeded      ->  no frame decoded
...
frame 30:     succeeded      ->  no frame decoded
frame 31:     succeeded      ->  frame 1 outputted
frame 32:     succeeded      ->  frame 2 outputted
...

Это приведет к задержке от 1 до 2 секунд от датчика. Мне интересно, почему и если есть способ избежать этого.

Спасибо!

1 Ответ

0 голосов
/ 27 января 2019

Одной из причин может быть прямая ссылка в B-слайсах.

Например, выбрав Group Of Picture (GOP) размером 32 с иерархической структурой, вы можете наложить задержку декодирования около 1 секунды (при условии 25 кадров в секунду).

Точнее, восстановление вашего второго кадра (первый кадр - Intra, следовательно, независимо декодируемый) может косвенно зависеть от вашего 32-го кадра.

Этот режим кодирования обычно называется произвольным доступом. Поищи это. Вы можете избежать этого, используя режим LowDelayP. Или все внутри. Другими словами, задержка зависит от вашей структуры GOP.

...