从webrtc的unity获取android EGL共享上下文

时间:2017-08-01 15:09:20

标签: android unity3d webrtc egl

我正在尝试在Unity和WebRTC之间架起桥梁。

  

更新:好吧,我为此创建了一个repo,仍然会遇到渲染纹理的怪异文物,我无法弄清楚   之所以。如果有人想看看。

     

https://github.com/iBicha/WebRTC-for-Unity/

由于WebRTC能够将VideoTracks中的帧作为纹理提供,我认为如果它与Unity共享EGL上下文最好,所以我可以将它直接渲染到引擎中。

我想通过在PeerConnectionFactory上设置视频硬件加速选项。如下:

    PeerConnectionFactory.initializeAndroidGlobals(mainActivity.getApplicationContext(), true);
    PeerConnectionFactory factory = new PeerConnectionFactory(new PeerConnectionFactory.Options());
    EglBase rootEglBase = EglBase.createEgl14(EGL14.eglGetCurrentContext(), EglBase.CONFIG_PIXEL_RGBA_BUFFER);
    factory.setVideoHwAccelerationOptions(rootEglBase.getEglBaseContext(),rootEglBase.getEglBaseContext());

当然,这只是关于它应该如何运作的几个假设。

由于setVideoHwAccelerationOptions需要EglBase.Context,这意味着我需要从Unity中找到上下文并将其转换为该内容。

为了做到这一点,我发现EglBase.createEgl14可能会做到这一点,但我需要正确的配置属性,这是我找不到的。试过很少的结合,但那没用。

我基本上被卡住了,我不知道从哪里开始。

另一个选择是从帧中获取ByteBuffer,并将它们传递给Unity,但由于Unity和WebRTC都使用OpenGL,因此会受到性能损失和资源浪费。我觉得我非常接近答案,但缺少一些东西。

更新:我认为eglGetCurrentContext()没有返回上下文,因为它没有从主Unity线程调用。现在我得到了上下文,I420Frame帧的textureId是有意义的。但他们没有渲染。我认为它与传递给EglBase.createEgl14的配置属性有关。或者这可能也是一个线程?

2 个答案:

答案 0 :(得分:1)

所以诀窍是使用GLES 2,因为那是EGLBase正在做的事情(现在,让我们看看它是否在官方回购中更新)

同样需要正确获取统一上下文,并将其用作共享上下文,以便能够传递纹理。

最后,需要使用特殊的GLSL着色器渲染纹理,并将纹理视为samplerExternalOES(类似于Hidden / VideoDecodeAndroid着色器)。可以使用此着色器将其渲染为RenderTexture,然后使用任何材质/着色器在场景上渲染该纹理。

这里有一个工作演示https://github.com/iBicha/WebRTC-for-Unity/

答案 1 :(得分:0)

我有类似的情况,EGL14.eglGetCurrentContext总是返回EGL_NO_CONTEXT。原来是因为默认使用Vulkan。解决方案还是更改Graphics APIs中的Player Settings。可能与原始帖子中的问题不同,但请写下来,以防对他人有所帮助。

相关问题