У меня есть пример приложения (full source), который кодирует кадры камеры с MediaCodec, показывая их на GLSurfaceView.Проблемы с частотой кадров в GLSurfaceView на Nexus 5
Systrace подтверждает 30 чертежных вызовов выполняются каждую секунду:
Однако запись screenrecord (.mp4, YouTube) показывает очевидный фреймрейт быть значительно ниже.
В двух словах, моя кодирование & петля дисплея выполняет следующие действия:
- Делает MediaCodec входной поверхность EGL контекста текущего
- рисует рамку камеры к поверхности MediaCodec EGL
- Делает GLSurfaceView EGL Контекст тока
- рисует один и тот же кадр камеры к GLSurfaceView
На Galaxy Nexus LTE и Nexus 7 (оба с AOSP 4.4) приложение работает так, как ожидалось. Пока только Nexus 5 испытывает это несоответствие между количеством кадров, нарисованных на экране, и количеством видимых кадров ...
Я молюсь, чтобы я не был сумасшедшим.
Команда 'screenrecord' добавляет значительные накладные расходы - для поверхностного рисования необходимо собрать все слои для виртуального дисплея с использованием GLES - что может негативно повлиять на частоту кадров. Взгляните на systrace, пока запущен 'screenrecord'. – fadden
Я испытываю проблему без screenrecord. Это абсолютно ночь и день между N5 и другими устройствами, которые я пробовал. – dbro
Анимированная стрелка в верхнем левом углу, кажется, оживляет чаще, чем дисплей камеры, поэтому это не проблема композиции. Я пытаюсь исследовать некоторые ужасающие результаты glReadPixels() в http://bigflake.com/mediacodec/#ExtractMpegFramesTest на Nexus 5 (177 мс для одного кадра 720p, который уменьшается до 6 мс, если видеодекодер не является участвует); возможно, это связано. – fadden