2015-07-06 3 views
1

У меня есть простой код Android NDK для декодирования и воспроизведения простого видеофайла. Я заметил, что Android имеет native_window_set_buffers_timestamp (ANativeWindow, int64_t); способ.Временная отметка времени для Android для Android

Я читал, что он дает метки времени для кадров, добавленных в очередь. Есть ли возможность использовать эти штампы для того, чтобы вызвать деактивацию и рендеринг кадров в запланированные мной моменты времени? У меня есть код, похожий на описанный: in this example Я устанавливаю метки времени презентации, как в примере (я уверен, что у меня есть правильные значения, я установил их в наносекундах), но видео отображается так же быстро, как и декодировано (слишком быстро). Установка временных меток не имеет никакого эффекта. У кого-нибудь есть решение этой проблемы?

ответ

2

Поле существует как способ передачи временных меток через систему. Это может повлиять или не повлиять на обработку кадра.

IIRC, начальное использование поля предназначено для видеокадров, захваченных камерой. Включив временную метку с момента захвата кадра, приложение, которое генерирует закодированное видео, может выводить точную метку времени. Если приложение использовало время приема фреймом приложения, вы получите значительное изменение значений времени.

Старые версии Android игнорируют метку времени при отображении фреймов. В Android 4.4 («KitKat») композитор SurfaceFlinger добавил функцию, которая позволяла удерживать или отбрасывать кадры на основе метки времени. Целью этого было упростить A/V-синхронизацию. Это подробно обсуждается в комментариях в Grafika's активности «запланированного свопа», в частности, выше метода doFrame().

Короче говоря, целью этой функции было позволить видеоплееру подавать каждый кадр чуть раньше, чтобы он был готов и ожидал в очереди композиций, когда воспроизведение звука достигнет соответствующего времени. Попытка выполнить мелкомасштабную синхронизацию в самом приложении проблематична, когда система становится занятой. (SurfaceFlinger работает с повышенным приоритетом.)

Обеспечение должным образом воспроизводимого воспроизведения, когда приложение спамает весь видеофайл, не было целью. Для обратной совместимости с приложениями, которые поддерживают встроенный PTS с фреймами, и чтобы избежать слишком длинных ларьков, если приложение отправляет отметку времени, которая будет годом в будущем, SurfaceFlinger игнорирует отметки времени, которые не находятся в пределах секунды или около того текущего времени. Таким образом, вам все равно придется ломать кормы, но метки могут помочь избежать киосков и капель.

Итак ... если вы хотите управлять своим собственным воспроизведением видео, вам нужно будет самостоятельно выполнить выход. Вы можете увидеть пример в классе Grafika SpeedControlCallback.