在花了一些时间之后,最好问一下。谢谢你们的帮助,伙计们!
问题
- 如何将 MediaPlayer 或 VideoView 中的视频帧渲染到 SurfaceTexture 或 OpenGL 纹理,以便通过 GLSL 更改纹理/片段颜色?(我们需要它用于花哨的 GLES/GLSL 视频处理例程。)
语境
a) Google TV(LG G2 2012 设备)是 Android 3.2 设备,仅支持 SDK(无 NDK)
b) 从相机渲染到 SurfaceTexture 很容易,但是如何在 Android 3.x 中将视频渲染到 SurfaceTexture?有关相机解决方案,请参见下文。
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!):在 Android 中使用 SurfaceTexture
视频到 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,如果我们试图操纵视频数据,我们会受到很大的限制。