android - Android 3.x/Google TV/SDK 上的视频处理 : Video frame to SurfaceTexture/OpenGL/GLSL

标签 android opengl-es glsl google-tv android-3.2-honeycomb

在花了一些时间之后,问问可能会更好。感谢您的帮助,伙计们!

问题

  • 如何将视频帧从 MediaPlayer 或 VideoView 渲染到 SurfaceTexture 或 OpenGL 纹理,以便通过 GLSL 更改纹理/fragment 颜色? (我们需要它来执行精美的 GLES/GLSL 视频处理例程。)

上下文

a) Google TV(LG G2 2012 设备)是一款仅支持 SDK(无 NDK)的 Android 3.2 设备

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

也比较这个:

因此,主要问题仍然是:如何使用 Android 3.x 访问和操作视频帧?也许是不同的解决方案?花了太多时间后,我错过了什么吗?考虑到 Google TV 上根本不支持 NDK,如果我们试图操纵视频数据,我们的能力非常有限。

最佳答案

Megha 很友好地帮我调查了这件事。我们在适用于 ARM 的 Google TV 上不支持此功能。这对于我们当前的 SOC(片上系统)来说是不可能的。

关于android - Android 3.x/Google TV/SDK 上的视频处理 : Video frame to SurfaceTexture/OpenGL/GLSL,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11812066/

相关文章:

c - 打开 gl 计算着色器和帧缓冲区

Android:手机重启后恢复应用程序变量

android - 为什么重力在应用于相对布局时不起作用?

java - openGL以伪3D视角绘制扭曲的 Sprite (图像)

ios - GPUImage 着色器因 "ERROR: One or more attached shaders not successfully compiled"而崩溃

GLSL 定义计算还是替换文本?

android - 自定义着色器不适用于 Android 设备(使用 LibGDX)

java - Retrofit 2 onResponse 方法从未被调用

java - 广播接收器: Why it doesn't work?

c# - 为什么我的 OpenGL ES 应用程序在 glDrawElements 上崩溃?