#android #android-mediacodec #video-encoding #transcoding
#Android #android-mediacodec #кодирование видео #перекодирование
Вопрос:
Мы создали асинхронный транскодер MediaCodec, который использует поверхность, сгенерированную декодером MediaCodec с использованием более нового API 21 асинхронных обратных вызовов ( onInputBufferAvailable
и onOutputBufferAvailable
). Он полностью функционален, но мы заметили, что скорость декодирования / кодирования напрямую связана с данными синхронизации кадров PTS. Т.Е. Если исходный файл имеет скорость 1 кадр / с, транскодер работает довольно медленно, но с файлом 60 кадров в секунду он работает намного быстрее. Поскольку это дизайн транскодирования (скорее воспроизведение в реальном времени), мы стремимся декодировать / кодировать так быстро, как может обрабатывать система, и быть полностью независимыми от частоты кадров источника / назначения.
Нам удалось обойти эту проблему, используя ключ KEY_OPERATING_RAT
E MediaFormat (т. Е. Установив для него значение 10x FPS), но, похоже, это приводит к сбою MediaCodec при использовании высоких коэффициентов, и мы обеспокоены, что здесь может быть какое-то поведение, зависящее от устройства. Согласно документам API, похоже, что мы должны иметь возможность использовать releaseOutputBuffer()
временную метку, которая находится на расстоянии более 1 секунды от текущего системного времени, чтобы заставить кадр отображаться немедленно, но это, похоже, не имеет никакого эффекта. Мы также пробовали ключи KEY_LATENCY
и KEY_PRIORITY
MediaFormat, но они также, похоже, не имеют никакого эффекта.
Это так, как ожидалось? Есть ли какой-либо способ заставить кодировщик / декодер MediaCodec выводить кадры немедленно (независимо от синхронизации кадров) при использовании асинхронного режима?
Комментарии:
1. Вы проверили структуру GOP вывода? IIRC, MediaCodec использует значения PTS для подгонки потока к настроенному максимальному битрейту. При 1 кадре в секунду он может выдавать сплошной поток I-кадров, который может быть больше и обрабатываться медленнее, чем набор кадров. Быстрый эксперимент: разделите PTS на 30 при подаче его в MediaCodec, затем умножьте на 30 перед передачей его в MediaMuxer (или куда бы вы ни отправляли выходные данные). (PTS не включается в элементарный поток, выводимый MediaCodec.)
2. На самом деле мы всегда кодируем до 100% I кадров с помощью кодировщика MediaCodec, поэтому я не верю, что это так. Извиняюсь за то, что не прояснил это. Кроме того, источником является длинный элементарный поток GOP h264 (всегда использующий один и тот же тестовый файл для отладки и вручную устанавливающий ключ FPS и данные PTS в кадре). Тем не менее, спасибо за предложение. Любые другие вещи приходят на ум?