По умолчанию, инициализация объектов рендеринга видео при публикации и проигрывании производится автоматически. Однако на некоторых версиях Android в этом случае требуется явное указание контекста для графики OpenGL, в противном случае инициализации рендерера приведет к крашу приложения с android.opengl.GLException
, например
2024-06-13 15:57:47.006 32017-646/com.flashphoner.wcsexample.screencapture I/EglBase14Impl: Using OpenGL ES version 2 2024-06-13 15:57:47.013 32017-646/com.flashphoner.wcsexample.screencapture E/SurfaceTextureHelper: CaptureThread create failure 2024-06-13 15:57:47.013 32017-646/com.flashphoner.wcsexample.screencapture E/SurfaceTextureHelper: android.opengl.GLException: Failed to create EGL context: 0x3000 2024-06-13 15:57:47.015 32017-646/com.flashphoner.wcsexample.screencapture E/SurfaceTextureHelper: [1/2] android.opengl.GLException: Failed to create EGL context: 0x3000 at org.webrtc.EglBase14Impl.createEglContext(EglBase14Impl.java:336) at org.webrtc.EglBase14Impl.-$$Nest$smcreateEglContext(Unknown Source:0) at org.webrtc.EglBase14Impl$EglConnection.<init>(EglBase14Impl.java:66) at org.webrtc.EglBase14Impl.<init>(EglBase14Impl.java:142) at org.webrtc.EglBase.createEgl14(EglBase.java:263) at org.webrtc.EglBase.create(EglBase.java:206) at org.webrtc.SurfaceTextureHelper.<init>(SurfaceTextureHelper.java:187) at org.webrtc.SurfaceTextureHelper.<init>(Unknown Source:0) at org.webrtc.SurfaceTextureHelper$1.call(SurfaceTextureHelper.java:75) at org.webrtc.SurfaceTextureHelper$1.call(SurfaceTextureHelper.java:70) at org.webrtc.ThreadUtils$3.run(ThreadUtils.java:173) at android.os.Handler.handleCallback(Handler.java:874) at android.os.Handler.dispatchMessage(Handler.java:100) at android.os.Looper.loop(Looper.java:198) at android.os.HandlerThread
Чтобы избежать подобного исключения, в сборке Android SDK 1.1.0.65 добавлена возможность явной инициализации объектов рендеринга с указанием единого OpenGL контекста приложения Flashphoner.eglBaseContext
.
Для этого необходимо отключить автоматическую инициализацию рендереров при создании сессии
sessionOptions = new SessionOptions(mWcsUrlView.getText().toString()); sessionOptions.setLocalRenderer(localRender); sessionOptions.setRemoteRenderer(remoteRender); sessionOptions.setAutoInitRenderers(false); ... session = Flashphoner.createSession(sessionOptions);
и проинициализировать объекты рендеринга явным образом
localRender = (SurfaceViewRenderer) findViewById(R.id.local_video_view); remoteRender = (SurfaceViewRenderer) findViewById(R.id.remote_video_view); ... localRender.init(Flashphoner.eglBaseContext, null); remoteRender.init(Flashphoner.eglBaseContext, null);