无法创建EGL上下文

5

我在一些设备上遇到以下崩溃,而在另一些设备上代码可以正常工作。我不明白是代码的哪个部分导致了这个崩溃。 几天前它还能正常运行,但突然出现了这个崩溃。请问有人能指导我是什么原因导致了这个崩溃吗?请帮助我。

以下是堆栈跟踪:

java.lang.RuntimeException: java.lang.RuntimeException: Failed to create EGL context: 0x3003                                                                                at org.webrtc.EglBase14.createEglContext(EglBase14.java:260)
at org.webrtc.EglBase14.<init>(EglBase14.java:58)
at org.webrtc.EglBase.create(EglBase.java:86)
at org.webrtc.EglRenderer$3.run(EglRenderer.java:194)
at org.webrtc.ThreadUtils$5.call(ThreadUtils.java:208)
at org.webrtc.ThreadUtils$5.call(ThreadUtils.java:205)
at org.webrtc.ThreadUtils$4.run(ThreadUtils.java:182)
at android.os.Handler.handleCallback(Handler.java:742)
at android.os.Handler.dispatchMessage(Handler.java:95)
at android.os.Looper.loop(Looper.java:154)
at android.os.HandlerThread.run(HandlerThread.java:61)
at org.webrtc.ThreadUtils.invokeAtFrontUninterruptibly(ThreadUtils.java:193)
at org.webrtc.ThreadUtils.invokeAtFrontUninterruptibly(ThreadUtils.java:205)
at org.webrtc.EglRenderer.init(EglRenderer.java:183)
at org.webrtc.SurfaceViewRenderer.init(SurfaceViewRenderer.java:101)
at org.webrtc.SurfaceViewRenderer.init(SurfaceViewRenderer.java:82)
at com.twilio.video.VideoView.setupRenderer(VideoView.java:158)
at com.twilio.video.VideoView.onAttachedToWindow(VideoView.java:91)
at android.view.View.dispatchAttachedToWindow(View.java:14538)
at android.view.ViewGroup.dispatchAttachedToWindow(ViewGroup.java:2844)
at android.view.ViewGroup.dispatchAttachedToWindow(ViewGroup.java:2844)
at android.view.ViewGroup.dispatchAttachedToWindow(ViewGroup.java:2844)
at android.view.ViewGroup.addViewInner(ViewGroup.java:4349)
at android.view.ViewGroup.addView(ViewGroup.java:4146)
at android.view.ViewGroup.addView(ViewGroup.java:4087)
at android.support.v7.widget.RecyclerView$5.addView(RecyclerView.java:676)
at android.support.v7.widget.ChildHelper.addView(ChildHelper.java:107)
at android.support.v7.widget.RecyclerView$LayoutManager.addViewInt(RecyclerView.java:7399)
at android.support.v7.widget.RecyclerView$LayoutManager.addView(RecyclerView.java:7357)
at android.support.v7.widget.RecyclerView$LayoutManager.addView(RecyclerView.java:7345)
at android.support.v7.widget.LinearLayoutManager.layoutChunk(LinearLayoutManager.java:1459)
at android.support.v7.widget.LinearLayoutManager.fill(LinearLayoutManager.java:1408)
at android.support.v7.widget.LinearLayoutManager.onLayoutChildren(LinearLayoutManager.java:580)
at android.support.v7.widget.RecyclerView.dispatchLayoutStep2(RecyclerView.java:3374)
at android.support.v7.widget.RecyclerView.onMeasure(RecyclerView.java:2901)
at android.view.View.measure(View.java:18811)
at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:5952)
at android.widget.LinearLayout.measureChildBeforeLayout(LinearLayout.java:1465)
at android.widget.LinearLayout.measureHorizontal(LinearLayout.java:1112)
at android.widget.LinearLayout.onMeasure(LinearLayout.java:632)
at android.view.View.measure(View.java:18811)
at android.widget.RelativeLayout.measureChildHorizontal(RelativeLayout.java:716)
at android.widget.RelativeLayout.onMeasure(RelativeLayout.java:462)
at android.view.View.measure(View.java:18811)
at android.widget.RelativeLayout.measureChildHorizontal(RelativeLayout.java:716)
at android.widget.RelativeLayout.onMeasure(RelativeLayout.java:462)
at android.view.View.measure(View.java:18811)
at android.widget.RelativeLayout.measureChildHorizontal(RelativeLayout.java:716)
at android.widget.RelativeLayout.onMeasure(RelativeLayout.java:462)
at android.view.View.measure(View.java:18811)
at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:5952)
at android.widget.FrameLayout.onMeasure(FrameLayout.java:194)
at android.support.v7.widget.ContentFrameLayout.onMeasure(ContentFrameLayout.java:139)
at android.view.View.measure(View.java:18811)
at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:5952)
at android.widget.LinearLayout.measureChildBeforeLayout(LinearLayout.java:1465)
at android.widget.LinearLayout.measureVertical(LinearLayout.java:748)
at android.widget.LinearLayout.onM

你找到任何答案了吗? - Aashit Shah
@AashitShah 是的,解决方案是避免创建多个 EGL 上下文。 - keshav kowshik
3个回答

6
问题与创建的上下文数量有关。多次创建EGL上下文导致在达到限制点时,在 EglBase.create() 方法上崩溃。 确保不要创建太多的 Egl 上下文。在我的设备上,限制似乎是 30。 根据 WebRTC 的文档,调用 .release() 应该解决这个问题,但不幸的是它并没有起到作用。

1
我遇到了同样的问题,在不同的设备上,连接失败之前的连接数是不同的。但是我解决了它。这是所有webrtc对象dispose方法顺序错误导致的。这个顺序对我起作用。 - 我正在将其用于将屏幕镜像到另一个设备,对于相机可能会略有不同。
这是伪代码。实际上,所有调用都在单独的try catch和null检查中,以防某些内容已被处理或已被多次调用。
而且全部在新线程中运行,不能直接从连接关闭处理程序中调用,否则会挂起或崩溃。
new Thread(() -> {
  VideoCapturer.stopCapture();
  PeerConnection.dispose();
  VideoTrack.dispose();
  VideoSource.dispose();
  AudioTrack.dispose();
  AudioSource.dispose();
  MediaStream.dispose();
  VideoCapturer.dispose();
  SurfaceTextureHelper.dispose();
  PeerConnectionFactory.dipose();
}).start();

我正在处理整个连接工厂,但可能可以安全地重复使用。


-4

您可以在 GitHub 上查看 此问题

0x3003EGL_BAD_ALLOC

这是已知的。存在一个全局 EGL 上下文,如果您在调试模式下重新加载应用程序包,则会泄漏该上下文。在发布模式下不会发生这种情况,因为该上下文将在应用程序的生命周期内保持活动状态。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接