java android unity3d android-mediaplayer

¿Puede un complemento de Android(Java no C/C++) alterar las texturas de la unidad?



unity3d android-mediaplayer (2)

Intento usar un complemento de Android para evitar el hecho de que Unity no admite texturas de video en dispositivos móviles. Hago esto obteniendo el ID de textura de la textura que se usará para el video (proporcionado por Texture2D.GetNativeTextureID() ) que paso luego al plugin de Java.

Luego, el complemento sigue una implementación estándar de MediaPlayer para reproducir el video en una textura de superficie, a la que se le ha asignado la ID de textura antes mencionada.

Cuando llamo al método MediaPlayer.Start() , LogCat sale como si el reproductor multimedia funcionara normalmente / como se esperaba, sin embargo, la textura nunca cambia en la aplicación. Estoy llamando al plugin (e incluso inicializándolo) del método OnPreRender() de una secuencia de comandos de comportamiento único, junto con asegurarse de llamar a GL.InvalidateState() también.

Aquí hay un vistazo al código relevante:

Constructor:

public VideoPlayer(String _path, Context _cont) { m_MediaPlayer = new MediaPlayer(); try { Uri uri = Uri.parse(_path); m_MediaPlayer.setDataSource(_cont, uri); m_MediaPlayer.setOnPreparedListener(this); } catch (IOException e) { Log.e(TAG, "Error setting data source: " + e.getMessage()); } }

Preparación de la textura de la superficie:

public void PrepareVideo(int _texPtr) { try { m_SurfTex = new SurfaceTexture(_texPtr); m_SurfTex.setOnFrameAvailableListener(this); Log.i(TAG, "Surface Texture ready"); Surface surface = new Surface(m_SurfTex); m_MediaPlayer.setSurface(surface); Log.i(TAG, "Surface Ready"); surface.release(); m_Ready = true; m_MediaPlayer.prepare(); } catch (IOException | IllegalStateException e) { Log.e(TAG, "Error preparing player: " + e.getMessage()); m_Ready = false; } }

Me gustaría saber si este tipo de proceso es posible con mi configuración actual, o tendré que considerar escribir algo usando el NDK. Específicamente, ¿puede una textura superficial alterar una textura producida en Unity?


Parecería que, aunque no he encontrado nada, explícitamente que se puede hacer esto, no hay información real ni ejemplos de que se haya hecho antes.

Intentaré volver a trabajar con esto en el código nativo de C ++.


¿Intentó crear la textura de la superficie en el hilo de renderizado de la unidad, por ejemplo, anulando el comando runglthreadsjobs en un UnityPlayer extendido? Eso aseguraría que se vincule al glcontext correcto AFAIK.

Intenté compartir contextos, pero no pude hacerlo funcionar porque la documentación es escasa y la unidad está bastante cerrada.

En la unidad 4.2 es aparentemente mucho más fácil.