CainKernel / CainCamera

CainCamera is an Android Project to learn about development of beauty camera, image and short video
2.84k stars 777 forks source link

使用 MediaEncoder 录制视频久了会出现 E/SurfaceFlinger: GL error 0x0505 #96

Closed Jimmy-J closed 12 months ago

Jimmy-J commented 4 years ago

请教一下大佬,我在 MediaEncoder 中使用 MediaCodec 编码后的 H264 数据通过 RTMP 来推流实现直播功能,在运行了 12 小时左右会出现 E/SurfaceFlinger: GL error 0x0505 这个问题,导致系统直接死机了,使用的系统是 aosp 上 Android 5.1.1 的平板,大佬遇到过这个问题吗,可以给一些解决思路吗 image

CainKernel commented 4 years ago

GL_OUT_OF_MEMORY(0x505),显存泄漏问题,检查一下你的OpenGLRenderer每次用完是否被释放了。

Jimmy-J commented 4 years ago

非常感谢大佬回复,请问要排查的话是从 EGLSurface、WindowSurface 这块开始排查吗,整个项目我没有改动哪里只是把 MediaCodec 编码后的数据改成用 rtmp 传输了。现在没有使用任何滤镜,之前我尝试使用 GLSufaceView 配合 GPUImageFilter 来获取数据推流也是跑的时间长会出现显存不足问题。

CainKernel commented 4 years ago

这些都不是问题产生的根本原因。你需要查找shader、纹理资源是否及时释放了。shader和纹理资源是跟EGLContext绑定的,如果不断创建新的纹理又不释放,等GPU显存消耗完之后就会出现显存泄漏的问题。你要检查的是,你用的Filter是否是每次都重新创建,包括FBO不断创建等,这样显存肯定是会被不断消耗,而不是固定的一个Filter的显存大小,故久而久之,显存就被消耗完,此时就会爆出显存泄漏的错误。我建议你用GPU调试工具来看下哪个步骤泄漏了,常用的像Snapdragon Profiler之类的工具都可以分析出来。