我正在尝试在Unity和WebRTC之间架起桥梁。
更新:好吧,我为此创建了一个存储库,但在渲染纹理时仍然遇到怪异的伪像,我不知道原因。如果有人想看看。
由于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,然后使用任何材质/着色器在场景上渲染该纹理。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句