Обработка видео на Android 3.x/Google TV/SDK: видеокадр для SurfaceTexture/OpenGL/GLSL
Потратив некоторое время на это, лучше спросить. Спасибо за помощь, ребята!
Вопрос
- Как визуализировать видеокадр из MediaPlayer или VideoView в SurfaceTexture или OpenGL текстуру, чтобы изменить цвет текстуры / фрагмента с помощью GLSL? (Нам это нужно для необычных процедур обработки видео GLES/GLSL.)
контекст
a) Google TV (устройство LG G2 2012) - это устройство Android 3.2 с поддержкой только SDK (без NDK)
б) Легко рендериться с камеры в SurfaceTexture, но как сделать видео в SurfaceTexture в Android 3.x? Для решения камеры, см. Ниже.
c) Я уже отрисовываю видеокадры в GLView/GLRenderer, но я не беру кадр, чтобы изменить его через GLSL. Кажется, не работает. Но мне нужны доступные GLES/GLSL текстуры с видеоданными для обработки видео:
Класс MainActivity:
public void onCreate(Bundle state) {
super.onCreate(state);
m_View = new GLSimpleView(this);
setContentView(m_View);
m_Holder = m_View.getHolder();
m_Holder.addCallback(this);
m_Holder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);
}
Класс GLSimpleView:
public GLSimpleView(Context context) {
super(context);
m_Renderer = new GLTextureRenderer(context);
this.setRenderer(m_Renderer);
}
Класс GLTextureRender:
int[] textures = new int[1];
GLES20.glGenTextures(1, textures, 0);
m_SurfaceTexture = textures[0];
GLES20.glBindTexture(GL_TEXTURE_EXTERNAL_OES, mTextureID);
GLES20.glTexParameterf(GL_TEXTURE_EXTERNAL_OES, GLES20.GL_TEXTURE_MIN_FILTER, GLES20.GL_NEAREST);
GLES20.glTexParameterf(GL_TEXTURE_EXTERNAL_OES, GLES20.GL_TEXTURE_MAG_FILTER, GLES20.GL_LINEAR);
GLES20.glTexParameteri(GL_TEXTURE_EXTERNAL_OES, GLES20.GL_TEXTURE_WRAP_S, GLES20.GL_CLAMP_TO_EDGE);
GLES20.glTexParameteri(GL_TEXTURE_EXTERNAL_OES, GLES20.GL_TEXTURE_WRAP_T, GLES20.GL_CLAMP_TO_EDGE);
m_Surface = new SurfaceTexture(m_SurfaceTexture);
m_Surface.setOnFrameAvailableListener(this);
// THIS ONE DOESN'T WORK WITH ANDROID 3.x!
// HOW TO BIND m_Surface TO m_MediaPlayer?
//Surface surface = new Surface(m_Surface);
//m_MediaPlayer.setSurface(surface);
//surface.release();
Также сравните это:
SurfaceTexture для камеры (мне нужен этот для MediaPlayer или VideoView!): Использование SurfaceTexture в Android
Видео в GLView (нет доступа к текстуре через GLSL!): Воспроизведение видео в GLSurfaceView вместо SurfaceView
Пример Android 4.x SDK VideoSurfaceTexture (несовместим с 3.2!): http://source-android.frandroid.com/cts/tests/src/android/media/cts/VideoSurfaceView.java
Android MediaPlayer (в Android 3.x нет поддержки setSurface ()!): http://developer.android.com/reference/android/media/MediaPlayer.html
Поэтому главный вопрос по-прежнему: как получить доступ к видеокадру и управлять им с помощью Android 3.x? Возможно другое решение? Я что-то упустил, потратив слишком много времени? Учтите, что на Google TV вообще нет поддержки NDK, что мы очень ограничены, если пытаемся манипулировать видеоданными.
1 ответ
Мегха была достаточно любезна, чтобы разобраться в этом для меня. Мы не поддерживаем это на Google TV для ARM. Это невозможно с нашими текущими SOC (система на чипе).