【问题标题】:Android MediaMuxer with openGL带有 openGL 的 Android MediaMuxer
【发布时间】:2014-05-14 00:34:18
【问题描述】:
我正在尝试使用MediaMuxer 生成电影。 Grafika 示例非常出色,但是当我尝试扩展它时,我遇到了一些问题。
我正在尝试在电影中绘制一些基本形状,例如正方形、三角形、线条。如果我将形状绘制到屏幕上,我的 openGL 代码运行良好,但我无法在视频中绘制相同的形状。
我还有关于设置 openGL 矩阵、程序、着色器和视口的问题。通常,有onSurfaceCreated 和onSurfaceChanged 之类的方法,以便我可以设置这些东西。在GeneratedMovie 中最好的方法是什么?
欢迎任何人写成更复杂形状的视频的例子
【问题讨论】:
标签:
android
android-mediacodec
mediamuxer
【解决方案1】:
您所绘制内容的复杂性无关紧要。你画你要画的任何东西,然后调用eglSwapBuffers() 提交缓冲区。无论您绘制一个平面着色三角形还是 100K 超级着色三角形,您仍然只是将数据缓冲区提交给视频编码器或表面合成器。
SurfaceView 的surfaceCreated() 和surfaceChanged() 没有等价物,因为Surface 是由MediaCodec#createInputSurface() 创建的(所以你知道它是什么时候创建的),而且Surface 不会改变。
使用 GeneratedMovie 的代码进行了一些相当简单的渲染(设置 scissor rect,调用 clear)。 RecordFBOActivity 中的代码可能是您应该看到的——它有一个弹跳的矩形和一个旋转的三角形,并演示了三种不同的方法来处理您必须渲染两次的事实。
(HardwareScalerActivity 中的代码使用相同的 GLES 例程并演示纹理,但它不进行记录。)
关键是要仔细管理您的 EGLContext 和 EGLSurfaces。 GLES 状态的各个位保存在 EGLContext 中,一次只能在一个线程上保持当前状态。使用单个上下文并为每个 Surface 设置单独的 EGLSurface 是最简单的,但您也可以创建单独的上下文(有或没有共享)并在它们之间切换。
一些额外的背景材料是available here。