Android - получить кадры из MediaPlayer, играющего на SurfaceView, для передачи их в собственный код C++

Как описано в заголовке, я пытаюсь получить MediaPlayer кадры (во время воспроизведения) и передать их в мой собственный код C++ (используя JNI).

Итак, я использую MediaPlayer а также "setDisplay(SurfaceView)"метод рисования видео пикселей на SurfaceView,

Во время воспроизведения видео я используюgetDrawingCacheметод SurfaceView чтобы получить последние пиксели видеокадра. Но я читал, что растровое изображение всегда будет черным.

Поэтому мой вопрос: возможно ли получить последний кадр, отображаемый MediaPlayer, чтобы передать его в C++ код?

PS: я должен использовать API уровня 8

Спасибо

1 ответ

Решение

Начиная с Android 4.1 они добавили MediaCodec Api, который позволяет вам получить доступ практически ко всему.

А в Android 4.3 добавлена ​​возможность получать поток с поверхности.

http://developer.android.com/reference/android/media/MediaCodec.html

До этого вы в значительной степени застряли. Вы можете попробовать использовать ffmpeg + JNI через решение NDK. Это кажется довольно трудным для выполнения, но хорошая новость в том, что если вы сделаете это, ваши фреймы будут уже прочитаны на уровне C++.

Конечно, не для уровня API 8, но для уровня API 19+ вы можете получить поверхность из вида поверхности и передать ее в ImageReader.

Класс ImageReader обеспечивает прямой доступ приложения к данным изображения, отображаемым в поверхности.

Вы можете установить слушателя на ImageReader, используя setOnImageAvailableListener. Это даст вам все кадры, включая последний.

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