Аппаратное ускорение декодирования видео H.264 / HEVC на Android до OpenGL FBO или текстуры - PullRequest
0 голосов
/ 25 апреля 2018

Я хочу декодировать видеопоток и записать декодированные кадры в текстуру FBO opengl или другое представление памяти, которое OpenGL может легко использовать для применения к нему дополнительных фильтров или преобразования (через шейдеры).

Использует ли MediaCodec ускоренный стандарт в текущей версии Android? Могу ли я использовать полученную поверхность в качестве входных данных для OpenGL?

Исходя из этого при разработке десктопов, я знаю много способов, которыми этот процесс может быть излишне замедлен (например, использование CPU вместо выделенного кремния или GPU для декодирования, декодирование в GPU и выгрузка результатов в системную память для последующего копирования снова в VRAM и т. д.). Я не уверен, имеют ли значение эти проблемы на Android. Например, существует ли высокая стоимость копирования между памятью, используемой java, и памятью, используемой opengl, или она незначительна?

Ответы [ 3 ]

0 голосов
/ 25 апреля 2018

Да, вы можете настроить декодер MediaCodec с выходной поверхностью и использовать GLSurfaceView для применения изменений через шейдеры, это лучший способ, потому что вы используете только необходимую память, особенно для преобразования цвета (вы можетене знаю заранее, какой цвет использует ваш декодер), и для преобразования YUV2RGB.

Вы можете посмотреть здесь или здесь , если вы хотите сделать это вродной

0 голосов
/ 26 апреля 2018

Как правило, для OpenGL ES вы можете импортировать видеоповерхности YUV напрямую и получать к ним доступ напрямую, если вы импортируете поверхность как внешнее изображение EGL (см. Расширение здесь https://www.khronos.org/registry/OpenGL/extensions/OES/OES_EGL_image_external.txt).

Графический драйвер будет обрабатывать преобразование цветов из YUV в RGB в правильном цветовом пространстве (при условии, что декодер в любом случае сообщает правильное цветовое пространство ...), и это все с нулевой копией, поэтому, безусловно, правильный подход и многое другое эффективнее, чем использование собственных шейдеров преобразования цветов, если вы хотите использовать OpenGL ES.

В Android эта функция импорта внешней поверхности в Java-land предоставляется через класс SurfaceTexture (https://developer.android.com/reference/android/graphics/SurfaceTexture).

0 голосов
/ 25 апреля 2018

Вы должны использовать MediaCodec для доступа к аппаратным декодерам (это будет сделано через libstagefright и OpenMAX - под капотом).

  • Если вы хотите сделать какую-либо обработку, то нужно получить декодированное изображение (как правило, типа YUV420p) и выполняйте YUV2RGB и любую другую необходимую обработку, которую можно выполнить как OGL-текстура / GLSL и т. д. перед передачей вашей текстуры потребителю. Тем не менее, это означает, что вы должны выполнять синхронизацию аудио и видео и т. Д. Избегайте, если это не требуется.

  • Если вы хотите убедиться, что это авторское право и контент DRM, тогда вам необходимо использовать интерфейс Surface и DRM, не может выполнять какую-либо обработку.

  • Если вы просто хотите сделать прямое отображение, то можете использовать поверхность, которая может тоже сделайте YUV2RGB или просто используйте ExoPlayer.

Я не знаю, можете ли вы прочитать текстуру Поверхности в любую текстуру OGL. Я реализовал первый вариант выше.

...