Проблема с пропуском кадров при воспроизведении видео

У меня проблема с пропуском кадров при воспроизведении видео. Мы только что перешли с ICS на KK4.4. Видео очень маленькое, разрешение 320х240. Нет звука, чтобы упростить задачу.

Systrace находится по следующему адресу: https://www.dropbox.com/s/bee6xymg3kpn4ft/mytrace2.html?dl=0

Я включил тройную буферизацию, и hwcomposer генерирует поддельные vsync для SurfaceFlinger.

Я вижу следующие проблемы:

  1. Тройная буферизация не включена должным образом, так как видеодекодер выделяет очередь из 7 буферов. В случае, если тройная буферизация работала нормально для каждого кадра, поставленного в очередь из TimedEventQueue(OnVideoEvent), буфер, который должен быть исключен из очереди, должен отставать на 2 слота. Например: если мы ставим в очередь buf 4, то buf 2 должен быть исключен из очереди, но то, что удаляется из очереди, — это непосредственный предыдущий буфер, который SurfaceFlinger освобождает только тогда, когда у него появляется возможность запуститься в следующий раз. Отсюда задержка, которая, в свою очередь, приводит к отмене буферов для видео.

  2. Сам SurfaceFlinger требует некоторого времени для завершения.

  3. Vsync не включается в подходящее время, скажем, каждые 33 мс для видео с частотой 30 кадров в секунду. Проблема с логикой генерации vsync в HWComposer или vsync, не включенной eventControl из-за того, что фактические буферы не поставлены в очередь?

Обновление из приведенного ниже комментария: Другие вещи, которые я отметил, это то, что флаги async и mDequeueBufferCannotBlock являются ложными, и, следовательно, getMinUndequeuedBufferCount() возвращает 1, и, таким образом, мы видим, что непосредственный предыдущий буфер запрашивается для удаления из очереди, а не буфер 2 слота позади . Пожалуйста, дайте мне знать, если есть дыра в понимании выше. И все, что я могу сделать, чтобы обойти это

Любая помощь приветствуется.


person Vineet Bajaj    schedule 15.09.2015    source источник


Ответы (1)


  1. Видеокодеки решают, сколько буферов им нужно. Конфигурация BufferQueue — это согласование.

  2. Я не вижу, где SurfaceFlinger занимает много времени, чтобы закончить. Посмотрите на строку /system/bin/surfaceflinger — она работает быстро.

  3. Нет смысла просыпаться и делать работу, когда делать нечего, поэтому VSYNC отключается, если ничего не происходит. Ваше последнее предположение верно — если вы посмотрите на строку SurfaceView, вы увидите корреляцию между отсутствием доступных буферов и отсутствием пробуждения в SurfaceFlinger.

Я вижу 180 мс между поступлением кадров в SurfaceView BufferQueue, что составляет около 5,5 кадров в секунду. В процессе медиасервера есть несколько длинных onVideoEvent разделов — какой кодек вы используете?

Вы описали это как проблему «пропадания кадров» — какой плеер вы используете?

person fadden    schedule 16.09.2015
comment
Спасибо за ответ. Мы используем кодек OMX и стандартный видеоплеер для Android. Теперь OnVideoEvent занимает больше времени, потому что dequeuebuffer большую часть времени занимает много времени. Теперь DequeueBuffer занимает много времени, так как SurfaceView, который он пытается удалить из очереди, все еще удерживается поверхностным отражателем. Поверхностный отражатель выпустил его только в следующем своем экземпляре после того, как он получил следующий буфер. - person Vineet Bajaj; 17.09.2015
comment
Еще я заметил, что флаги async и mDequeueBufferCannotBlock оба являются ложными, и, следовательно, getMinUndequeuedBufferCount() возвращает 1, и, таким образом, мы видим, что для удаления из очереди запрашивается непосредственный предыдущий буфер, а не буфер на 2 слота позади. Пожалуйста, дайте мне знать, если есть дыра в понимании выше. И все, что я могу сделать, чтобы обойти это. - person Vineet Bajaj; 17.09.2015
comment
Все, что может мне помочь.. :) - person Vineet Bajaj; 18.09.2015
comment
Получите системную трассу проигрывателя Grafika на том же видео (или используйте тестовый клип с установленным флажком воспроизведения при 60 кадрах в секунду). Сравните поведение и попытайтесь понять, чем они отличаются. (Если они не отличаются, это тоже интересно.) Запланированная операция подкачки полезна в качестве генератора тона SurfaceFlinger+systrace, если вы хотите увидеть, как система выглядит при разных частотах кадров. Суть в том, что можно воспроизводить видео со скоростью 60 кадров в секунду, поэтому, если я не склонен смотреть на источник (кодек / декодер), а не на части в середине или конце. - person fadden; 18.09.2015