我设法写了一个视频录制的演示,我的实现是相同的连续捕获活动的格拉菲卡。
在continuouscaptureactivity.java中,作者在surfacecreated中创建egl对象,该对象在ui线程中运行,并在ui线程中调用drawframe。他在画框里做了两件事,画框到屏幕,把数据推到编码器。
请参见此处的代码:ContinuousCaptureActivity
因为我将编码视频大小设置为1280*720,这是很大的,相机预览不平滑,目标视频的fps很低。
我计划创建一个新线程来完成编码工作,但我不知道如何处理opengl es的多线程。谁能给点建议?
附加:我发现纹理2程序的DrawFrame使用了gles20.glDrawArrays,gles20.glDrawElements会得到更好的性能吗?

最佳答案

首先,1280x720不应该成为主流设备的问题。一些超便宜的低端设备可能会很难用,但如果硬件不能处理1280x720x30fps,你就无能为力了。
我所看到的720p的低fps最常见的原因是没有为相机配置合理的fps值(使用setPreviewFpsRange()getSupportedPreviewFpsRange()中的值),也没有调用setRecordingHint(true)(或同等的camera2)。后者可以从15fps到30fps,但可能会影响预览的纵横比。
视频编码在一个称为mediaserver的单独进程中执行,该进程管理与视频编码器硬件的所有交互。已经有多个线程在运行,因此添加另一个线程没有帮助。
gles代码正在绘制两个有纹理的三角形。使用不同的api不会改变差异。
如果您认为存在性能瓶颈,则需要使用systrace之类的工具来缩小它的范围。

07-24 09:47
查看更多