0

我正在尝试使用MediaMuxer. 这Grafika例子是一个很好的努力,但是当我尝试扩展它时,我遇到了一些问题。

我正在尝试在电影中绘制一些基本形状,例如正方形、三角形、线条。如果我将形状绘制到屏幕上,我的 openGL 代码运行良好,但我无法将相同的形状绘制到视频中。

我也有关于设置 openGL 矩阵、程序、着色器和视口的问题。通常,有类似的方法onSurfaceCreatedonSurfaceChanged以便我可以设置这些东西。最好的方法是什么GeneratedMovie

任何人都有写入具有更复杂形状的视频的示例将受到欢迎

4

1 回答 1

1

您绘制的内容的复杂性无关紧要。你画你要画的任何东西,然后调用eglSwapBuffers()提交缓冲区。无论您绘制一个平面阴影三角形还是 100K 超级阴影三角形,您仍然只是将数据缓冲区提交给视频编码器或表面合成器。

没有等效于 SurfaceView 的surfaceCreated()and surfaceChanged(),因为 Surface 是由创建的MediaCodec#createInputSurface()(所以你知道它是什么时候创建的),并且 Surface 不会改变。

使用 GeneratedMovie 的代码进行了一些相当简单的渲染(设置 scissor rect,调用 clear)。RecordFBOActivity 中的代码可能是您应该看到的——它有一个弹跳的矩形和一个旋转的三角形,并演示了三种不同的方法来处理您必须渲染两次的事实。

(HardwareScalerActivity 中的代码使用相同的 GLES 例程并演示纹理,但它不进行记录。)

关键是要仔细管理您的 EGLContext 和 EGLSurfaces。GLES 状态的各个位保存在 EGLContext 中,一次只能在一个线程上保持当前状态。使用单个上下文并为每个 Surface 设置单独的 EGLSurface 是最简单的,但您也可以创建单独的上下文(有或没有共享)并在它们之间切换。

一些额外的背景材料可在此处获得

于 2014-05-14T01:08:41.707 回答