時間をかけてから聞いたほうがいいかもしれません。助けてくれてありがとう、みんな!
質問
- GLSL 経由でテクスチャ/フラグメントの色を変更するために、MediaPlayer または VideoView から SurfaceTexture または OpenGL テクスチャにビデオ フレームをレンダリングする方法は? (派手な 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();
これも比較してください:
カメラ用の SurfaceTexture (MediaPlayer または VideoView 用にこれが必要です!): Android での SurfaceTexture の使用
GLView へのビデオ (GLSL 経由のテクスチャ アクセスなし!): SurfaceView の代わりに GLSurfaceView でビデオを再生する
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 がまったくサポートされていないことを考慮してください。ビデオ データを操作しようとすると、非常に制限されます。