2017-08-01 160 views
1

我試圖在Unity和WebRTC之間架起橋樑。從統一獲取android EGL共享上下文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是有意義的。但他們沒有渲染。我認爲它與配置屬性im傳遞到EglBase.createEgl14。否則這可能也是一個線程化的東西?

+0

我才意識到,實際問題是** EGL14.eglGetCurrentContext()** **返回** EGL_NO_CONTEXT這意味着團結球員並沒有叫** ** eglMakeCurrent。這是否意味着無法讓上下文創建共享上下文來傳遞數據? –

+0

好吧,我爲此創建了一個回購,仍然遇到渲染紋理的奇怪的工件,我無法弄清楚原因。如果有人想看看。 https://github.com/iBicha/WebRTC-for-Unity/ –

回答

0

所以訣竅是使用GLES 2,因爲這是EGLBase正在做(現在,讓我們看看它是否在官方回購被更新)

而且團結方面需要正確地獲得性,並用作共享上下文,以便能夠傳遞紋理。

最後,需要使用特殊的GLSL着色器渲染紋理,並將紋理視爲採樣器外部OES(類似於隱藏/ VideoDecodeAndroid着色器)。可以使用這個着色器將其渲染爲RenderTexture,然後使用任何材質/着色器在場景上渲染該紋理。

的工作演示是在這裏https://github.com/iBicha/WebRTC-for-Unity/