Самый быстрый способ нарисовать MediaCodec-декодированный видеокадр на экране?

Я ищу самый быстрый способ взять кадр изображения, полученный от декодера MediaCodec, и нарисовать его на экране устройства Android. Важные ограничения и объяснения:

  1. Невозможно использовать MediaPlayer. Не допускается промежуточное приложение.

  2. Необходимо выводить выходные кадры из декодера MediaCodec на экран как можно быстрее (минимизировать задержку).

  3. Доступны следующие форматы вывода декодера:
    ColorFormat [0] 0x00000013 COLOR_FormatYUV420Planar
    ColorFormat [1] 0x00000015 COLOR_FormatYUV420SemiPlanar
    ColorFormat [2] 0x7F000001 OMX_SEC_COLOR_FormatNV12TPhysicalAddress
    ColorFormat [3] 0x7FC00002 OMX_SEC_COLOR_FormatNV12Tiled

  4. Разрешение видео и, следовательно, разрешение каждого выходного кадра, составляет 960x720.

  5. Целевой платформой является Galaxy Note II, и подход может быть специфичным для этой платформы (например, использовать преимущества доступного аппаратного обеспечения). Это не должно работать на других платформах или быть универсальным решением.

Подход, который занимает менее 66 мс, был бы хорош. Менее 33 мс было бы здорово. Мой текущий подход занимает 80-90мс, что отстой. (Я не буду описывать это, поскольку не хочу искажать ответы в каком-либо конкретном направлении.)

1 ответ

Решение

Лучше всего декодировать прямо на Surface, Декодирование в ByteBuffer собирается немного замедлить вас. Ряд примеров на Bigflake (например, ExtractMpegFramesTest) отправьте вывод декодера на экранную поверхность и проверьте его с помощью GLES, но это простое изменение, чтобы заставить его работать с экранным SurfaceView.

Обновление: Grafika имеет два разных видеопроигрывателя на основе MediaCodec, которые отправляют вывод в SurfaceView и TextureView соответственно.

Другие вопросы по тегам