Мы создали асинхронный транскодер 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 выводить кадры немедленно (независимо от синхронизации кадров) при использовании асинхронного режима?