В настоящее время я пишу приложение для Android, в котором мне нужно кэшировать видеокадры, чтобы я мог легко перемещаться вперед и назад с минимальной задержкой или без нее.
Прямо сейчас я разрешаю Android декодировать видеокадр, предоставляя Surface для вызова Configure объекта MediaCodec
и вызывая releaseOutputBuffer
с флагом рендеринга, установленным на true
.
Единственный способ, который я нашел для доступа к декодированным данным поверхности (помимо декодирования возвращенного байтового буфера, формат которого, по-видимому, зависит от устройства), - это вызвать updateTeximage
на SurfaceTexture
, связанном с поверхностью, прикрепить его к цели GL_TEXTURE_EXTERNAL_OES
и отобразить в GL_TEXTURE2D
Целевая текстура, которую я создал сам, чтобы кэшировать.
Я хотел бы оптимизировать этот процесс кеширования и иметь возможность декодировать кадры в другом потоке. Используя мой текущий метод, это означает, что мне придется создать еще один контекст EGL для видеодекодера, поделиться контекстом и т. Д.
У меня вопрос: Можно ли получить доступ к EGL-изображению или собственным данным буфера, связанным с Surface, без вызова updateTexImage
?
Таким образом я мог кэшировать изображение egl (которое не требует контекста EGL согласно EGL_ANDROID_image_native_buffer
). Это также будет кешировать в формате YUV, который будет намного более эффективным с точки зрения хранения, чем необработанные текстуры RGB, которые я кэширую сейчас.