Перейти к содержанию

Инициализация объектов рендеринга видео

По умолчанию, инициализация объектов рендеринга видео при публикации и проигрывании производится автоматически. Однако на некоторых версиях 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.

Для этого необходимо отключить автоматическую инициализацию рендереров при создании сессии

code

sessionOptions = new SessionOptions(mWcsUrlView.getText().toString());
sessionOptions.setLocalRenderer(localRender);
sessionOptions.setRemoteRenderer(remoteRender);
sessionOptions.setAutoInitRenderers(false);
...
session = Flashphoner.createSession(sessionOptions);

и проинициализировать объекты рендеринга явным образом

code

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