Android MediaCodec асинхронное время декодирования / кодирования зависит от синхронизации кадров - PullRequest
0 голосов
/ 08 апреля 2019

Мы создали асинхронный транскодер MediaCodec, который использует поверхность, сгенерированную из декодера MediaCodec с использованием более новых асинхронных обратных вызовов API 21+ (onInputBufferAvailable и onOutputBufferAvailable). Он полностью функционален, но мы заметили, что скорость декодирования / кодирования напрямую связана с данными синхронизации кадров PTS. То есть если исходный файл составляет 1 кадр / с, транскодер работает довольно медленно, но для файла со скоростью 60 кадр / с он работает намного быстрее. Поскольку это дизайн транскодирования (скорее воспроизведение в реальном времени), мы рассчитываем декодировать / кодировать так быстро, как система может справиться, и быть полностью независимыми от частоты кадров источника / назначения.

Нам удалось обойти эту проблему с помощью ключа KEY_OPERATING_RAT E MediaFormat (т. Е. Установить его на 10x FPS), но это похоже на сбой MediaCodec при использовании высоких соотношений, и мы обеспокоены тем, что может быть какое-то конкретное устройство Поведение здесь. В соответствии с документами API кажется, что мы должны иметь возможность использовать releaseOutputBuffer() с отметкой времени, находящейся на расстоянии 1+ секунд от текущего системного времени, для принудительной немедленной визуализации кадра, но, похоже, это не имеет никакого эффекта. Мы также попробовали клавиши MediaFormat KEY_LATENCY и KEY_PRIORITY, но они также, похоже, не действуют.

Это как и ожидалось? Есть ли способ заставить кодер / декодер MediaCodec выводить кадры немедленно (независимо от синхронизации кадров) при использовании асинхронного режима?

...