Отметка времени собственного окна Android
У меня есть простой код Android NDK для декодирования и воспроизведения простого видеофайла. Я заметил, что в Android есть native_window_set_buffers_timestamp(ANativeWindow, int64_t); метод.
Я прочитал, что это дает метки времени для кадров, добавленных в очередь. Есть ли возможность использовать эти штампы для снятия очереди и рендеринга кадров в запланированные мной моменты времени? У меня есть код, похожий на описанный: в этом примере я устанавливаю метки времени представления, как в примере (я уверен, что у меня есть правильные значения, я установил их в наносекундах), но видео отображается так же быстро, как и сейчас. расшифрован (слишком быстро). Установка меток времени не имеет никакого эффекта. У кого-нибудь есть решение этой проблемы?
1 ответ
Поле существует как способ передачи временных меток через систему. Это может повлиять или не повлиять на то, как обрабатывается кадр.
IIRC, первоначальное использование поля было для кадров видео, снятых камерой. Включая метку времени, когда был сделан кадр, приложение, которое генерирует закодированное видео, может выводить точные метки времени. Если бы приложение использовало время получения кадра приложением, вы бы получили значительное изменение значений времени.
Более старые версии Android игнорируют метки времени при отображении кадров. В Android 4.4 ("KitKat") в композитор SurfaceFlinger добавлена функция, позволяющая удерживать или отбрасывать кадры на основе отметки времени. Целью этого было облегчить синхронизацию аудио / видео. Это подробно обсуждается в комментариях к работе Графика по "запланированному обмену", особенно над doFrame()
метод.
Короче говоря, цель этой функции состояла в том, чтобы позволить видеопроигрывателю отправлять каждый кадр немного раньше, чтобы он был готов и ожидал в очереди композиции, когда воспроизведение звука достигнет подходящего времени. Попытка выполнить детальную синхронизацию в самом приложении проблематична, когда система загружена. (SurfaceFlinger работает с повышенным приоритетом.)
Обеспечение правильного воспроизведения, когда приложение спамит весь видеофайл, не было целью. Для обеспечения обратной совместимости с приложениями, которые снабжают кадры встроенным PTS, и во избежание очень длительных задержек, если приложение отправляет временную метку, которая представляет собой годы в будущем, SurfaceFlinger игнорирует временные метки, которые не находятся в пределах секунды или около того текущего времени. Таким образом, вы все равно должны кормить кадры ложкой, но временные метки могут помочь избежать срывов и падений.
Так что... если вы хотите управлять своим собственным воспроизведением видео, вам придется самостоятельно изменять темп вывода. Вы можете увидеть пример в классе Grafika SpeedControlCallback.