我使用媒体编解码器对来自相机的帧进行编码,并使用gl曲面视图进行渲染。
我的画框看起来像这个
public void onDrawFrame(GL10 unused)
{
float[] mtx = new float[16];
GLES20.glClear(GLES20.GL_COLOR_BUFFER_BIT | GLES20.GL_DEPTH_BUFFER_BIT);
surface.updateTexImage();
surface.getTransformMatrix(mtx);
mDirectVideo.draw(surface);
saveRenderState();
delegate.mInputSurface.makeCurrent();
mDirectVideo.draw(surface);
delegate.swapBuffers();
restoreRenderState();
}
所以这里我们做了两次绘制(曲面),这将渲染到曲面。这将增加系统的开销。有什么地方我只能画一次Ondraw吗?两次使用shadder是一项成本高昂的操作有什么方法可以在渲染器和编码器之间共享曲面吗?
如果draw()
函数很昂贵——除了对视频帧进行闪电扫描外,还需要渲染复杂的场景——则可以使用FBO对纹理进行渲染,然后只对该纹理进行两次闪电扫描。如果你的draw()
主要只是视频纹理闪电战,那么你不能让它更快。
最重要的是,你要渲染到两个不同的表面,目前(Android 4.4)没有办法将相同的缓冲区发送给两个不同用户。最新设备上的硬件应该不会出现问题。
(无论如何,渲染屏幕和编码视频在一定程度上是有限制的,除非你正在录制屏幕,因此希望显示大小和视频大小完全相同。通常情况下,将屏幕显示与用户界面相匹配是很方便的,而编码视频与相机输出的内容相匹配。)
顺便说一句,注意这个问题。
更新:Grafika现在包含了一个使用两种方法绘制+记录的示例(绘制两次、绘制到FBO和blit)。参见RecordFBOActivity.