媒体编解码器和渲染使用GLSurfaceview,优化OnDrawFrame

时间:2013-12-12 08:51:12

标签: opengl-es opengl-es-2.0 android-4.3-jelly-bean mediacodec

我正在使用媒体编解码器来编码来自相机的帧并使用gl表面视图渲染它。

我的ondrawframe看起来像这样

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();

}

所以这里我们做两次Draw(表面)渲染到表面。这将在系统中产生开销。有什么地方我只能做一次Ondraw吗?使用肛门两次是昂贵的操作 我们有什么办法可以在渲染和编码器之间共享曲面吗?

1 个答案:

答案 0 :(得分:2)

如果您的draw()功能很昂贵 - 除了在视频帧上进行渲染之外,您还渲染了一个复杂的场景 - 您可以使用FBO渲染到纹理,然后只将该纹理渲染两次。如果你的draw()主要只是视频纹理blit,那么就无法让它更快。

底线是您渲染到两个不同的表面,并且目前(Android 4.4)无法将相同的缓冲区发送给两个不同的消费者。最新设备上的硬件应该可以顺利运行。

(无论如何,渲染屏幕和编码视频都有一些限制,除非您正在录制屏幕,因此希望显示尺寸和视频大小完全相同。通常可以方便地将屏幕显示放入用户界面,而编码的视频与来自相机的内容匹配。)

BTW,请注意this issue

更新: Grafika现在包含使用两种方法绘制+录制的示例(绘制两次,绘制到FBO和blit)。见RecordFBOActivity.