2017-08-01 4 views
1

J'essaie de faire un pont entre Unity et WebRTC.get android EGL contexte partagé de l'unité pour webrtc

Mise à jour: D'accord, je créé une prise en pension pour cela, rencontrez toujours des artefacts étranges avec le rendu des textures, que je ne peux pas comprendre la raison pour laquelle. Si quelqu'un veut jeter un coup d'oeil.

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

Depuis WebRTC est capable de fournir des cadres de VideoTracks comme une texture, je pensais que ce serait mieux si elle partage le contexte EGL avec l'unité, donc je peux le rendre directement dans le moteur. Je pensais que ce serait en définissant les options d'accélération matérielle vidéo sur PeerConnectionFactory. comme suit:

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()); 

Bien sûr, ce n'est que quelques hypothèses sur la façon dont cela devrait fonctionner.

Depuis setVideoHwAccelerationOptions prend un EglBase.Context cela signifie que j'ai besoin de trouver le contexte de Unity et de le convertir en cela.

Pour ce faire, j'ai trouvé que EglBase.createEgl14 pourrait faire l'affaire, mais j'ai besoin des attributs de configuration corrects, que je ne peux pas trouver. Essayé quelques conbinations, mais cela n'a pas fonctionné.

Je suis fondamentalement coincé, je ne sais pas où aller à partir d'ici. Une autre option est d'obtenir le ByteBuffer à partir des trames, et de les passer à Unity, mais cela va être un coup de performance et un gaspillage de ressources, puisque Unity et WebRTC parlent tous les deux OpenGL. Je pense que je suis très proche de la réponse, mais il manque quelque chose.

Mise à jour: Je pensais que eglGetCurrentContext() ne retournerait pas le contexte, car il n'a pas été appelé depuis le thread principal de l'unité. Maintenant que j'ai le contexte, le textureId des cadres I420Frame a du sens. Mais ils ne rendent pas. Je pense que cela a à voir avec les attributs de config im passant à EglBase.createEgl14. Ou bien cela pourrait être aussi une chose de filetage?

+0

Je viens de réaliser que le problème réel est ** EGL14.eglGetCurrentContext() ** ** rendement EGL_NO_CONTEXT ** qui signifie que le joueur de l'unité ne demande pas ** eglMakeCurrent **. Est-ce que cela signifie qu'il n'y a aucun moyen d'obtenir un contexte pour créer un contexte partagé pour transmettre des données? –

+0

Très bien, j'ai créé un repo pour cela, en expérimentant toujours des artefacts bizarres avec le rendu des textures, dont je n'arrive pas à comprendre la raison.Si quelqu'un veut jeter un coup d'oeil. https://github.com/iBicha/WebRTC-for-Unity/ –

Répondre

0

Donc, l'astuce est d'utiliser GLES 2 parce que ce EGLBase fait (pour l'instant, nous allons voir si elle est mise à jour dans le dépôt officiel)

De plus, le contexte de l'unité doit être aquired correctement, et utilisé comme le contexte de partage, pour pouvoir passer des textures. Enfin, la texture doit être restituée avec un shader GLSL spécial, et la texture doit être traitée comme un samplerExternalOES (similaire au shader Hidden/VideoDecodeAndroid). On pourrait le rendre à une RenderTexture en utilisant ce shader, puis utiliser n'importe quel matériau/shader pour rendre cette texture sur la scène.

Une démonstration de travail est ici https://github.com/iBicha/WebRTC-for-Unity/