我正在尝试使用MediaMuxer
生成电影。 Grafika
示例非常出色,但是当我尝试扩展它时,我遇到了一些问题。
我试图在电影中绘制一些基本形状,如方形,三角形,线条。如果我将形状绘制到屏幕中,但我无法在视频中绘制相同的形状,那么我的openGL代码效果很好。
我也有关于设置openGL矩阵,程序,着色器和视口的问题。通常,有onSurfaceCreated
和onSurfaceChanged
等方法,以便我可以设置这些内容。在GeneratedMovie
中执行此操作的最佳方式是什么?
任何人都有可以写入更复杂形状的视频的例子
答案 0 :(得分:1)
你所画的内容的复杂性无关紧要。您绘制要绘制的任何内容,然后调用eglSwapBuffers()
提交缓冲区。无论您绘制一个平面阴影三角形还是100K超级阴影三角形,您仍然只是向视频编码器或表面合成器提交数据缓冲区。
没有等效于SurfaceView的surfaceCreated()
和surfaceChanged()
,因为Surface是由MediaCodec#createInputSurface()
创建的(因此您知道它何时创建),而Surface不会更改。
使用GeneratedMovie的代码做了一些相当简单的渲染(设置scissor rect,call clear)。 RecordFBOActivity中的代码是你应该看到的 - 它有一个弹跳矩形和一个旋转三角形,并演示了三种不同的方法来处理你必须渲染两次的事实。
(HardwareScalerActivity中的代码使用相同的GLES例程并演示纹理,但它不进行录制。)
关键是要仔细管理您的EGLContext和EGLSurfaces。 GLES状态的各个位保存在EGLContext中,EGLContext一次只能在一个线程上进行当前操作。最简单的方法是使用单个上下文并为每个Surface设置单独的EGLSurface,但您也可以创建单独的上下文(有或没有共享)并在它们之间切换。
其他一些背景材料是available here。