从webrtc的统一获得android EGL共享上下文

卜拉欣·哈德里奇

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

更新:好吧,我为此创建了一个存储库,但在渲染纹理时仍然遇到怪异的伪像,我不知道原因。如果有人想看看。

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

由于WebRTC能够将VideoTracks中的帧作为纹理提供,因此我认为最好以统一的方式共享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就很有意义了。但是它们没有渲染。我认为这与传递给的config属性有关EglBase.createEgl14否则这可能也是线程问题?

卜拉欣·哈德里奇

所以诀窍是使用GLES 2,因为这就是EGLBase所做的(现在,让我们看看它是否在官方仓库中得到了更新)

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

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

一个有效的演示在这里https://github.com/iBicha/WebRTC-for-Unity/

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章