Установите правильную метку времени для MediaCodec с захватом VirtualDisplay

Вот моя установка:

Я захватываю кадры из VirtualDisplay в SurfaceTexture, рисую какой-нибудь анимированный объект на самой текстуре с помощью OpenGL и отправляю его на входную поверхность MediaCodec. Но после рисования я должен правильно установить метку времени на EGL. Я пробовал два способа:

  1. Установить метку времени, полученную от SurfaceTexture. Это нормально работает, пока на экране есть обновления. Обычно частота кадров виртуального дисплея находится в диапазоне (0 - displayRefresh). Это приводит к тому, что кодировщик может ничего не делать в ожидании обновлений SurfaceTexture, и я не могу отправлять закодированные кадры по RTMP.
  2. Используя настраиваемую временную метку, рассчитанную из цикла с постоянным FPS и отрисовкой постоянно. Это приводит к задержкам видео из-за неправильной скорости кадров видео.

Я видел несколько приемов, например, использование анимированного представления на экране, чтобы заставить VirtualDisplay генерировать кадры, но это не похоже на хорошее решение. Также есть флаг для MediaCodec - KEY_REPEAT_PREVIOUS_FRAME_AFTER, но он не работает полностью.

Как правильно рассчитать временные метки в этом случае?

0 ответов

Другие вопросы по тегам