【问题标题】:get android EGL shared context from unity for webrtc从统一为 webrtc 获取 android EGL 共享上下文
【发布时间】:2018-01-08 12:54:38
【问题描述】:

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

更新:好的,我为此创建了一个 repo,但在渲染纹理时仍然遇到奇怪的伪影,我无法弄清楚 之所以。如果有人想看看。

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 是有意义的。但他们没有渲染。我认为这与我传递给EglBase.createEgl14 的配置属性有关。否则这可能也是一个线程的事情?

【问题讨论】:

  • 我刚刚意识到实际问题是 EGL14.eglGetCurrentContext() 返回 EGL_NO_CONTEXT 这意味着统一播放器没有调用 eglMakeCurrent。这是否意味着无法获取上下文来创建共享上下文来传递数据?
  • 好吧,我为此创建了一个存储库,但在渲染纹理时仍然遇到奇怪的伪影,我无法弄清楚原因。如果有人想看看。 github.com/iBicha/WebRTC-for-Unity

标签: android unity3d webrtc egl


【解决方案1】:

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

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

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

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

【讨论】:

    【解决方案2】:

    我遇到过类似的情况,EGL14.eglGetCurrentContext 总是返回 EGL_NO_CONTEXT。原来是因为默认使用了 Vulkan。解决方案也是将Graphics APIs 更改为Player Settings。可能与原帖中的问题不一样,但写下来以防万一对某人有帮助。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-07-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-06-01
      • 1970-01-01
      • 1970-01-01
      • 2011-09-24
      相关资源
      最近更新 更多