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
. Это даст вам все кадры, включая последний.