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)

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();

还比较一下:

> CameraTexture用于相机(我需要这个用于MediaPlayer或VideoView!):Using SurfaceTexture in Android
>视频到GLView(通过GLSL无纹理访问!):Playing video in a GLSurfaceView instead of 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支持,如果我们试图操纵视频数据,我们就非常有限.

最佳答案
Megha非常友好地为我调查这个.我们不支持在Google TV for ARM上使用此功能.我们目前的SOC(片上系统)是不可能的.

转载注明原文:Android 3.x / Google TV / SDK上的视频处理:SurfaceTexture / OpenGL / GLSL的视频帧 - 代码日志