我正在尝试创建一个基于Unity的VR应用程序,该应用程序使用Android ExoPlayer进行视频播放。像“EasyMovieTexture”这样的Unity资产非常适合MediaPlayer,但我需要使用ExoPlayer。我基本上有以下内容:
Java(Android库):
public void setSurfaceFromTexture(int textureHandle) {
this.surfaceTexture = new SurfaceTexture(textureHandle);
this.surface = new Surface(surfaceTexture);
}
public void updateSurfaceImage() {
this.surfaceTexture.updateTexImage();
}
C#(Unity):
mediaPlayer.Call("setSurfaceFromTexture", texture.GetNativeTexturePtr().ToInt32());
但是,当我每帧调用updateSurfaceImage
时,我一直收到以下错误:
错误:java.lang.IllegalStateException:无法更新纹理内容(有关详细信息,请参阅logcat)
知道可能出现什么问题吗?
注意:我使用了Oculus MoviePlayerSample并使其与ExoPlayer一起使用。但Oculus库在GearVR之外不起作用。
答案 0 :(得分:1)
我没有让这个工作,并决定采用不同的方法。但是,我从实际确实使用此系统的人那里学到的是,您无法使用Unity Textures - 您需要将GL_TEXTURE_EXTERNAL_OES
与SurfaceTexture
一起使用。
首先必须执行以下操作:
glGenTextures(1, &uiTextureID);
glBindTexture(GL_TEXTURE_EXTERNAL_OES, uiTextureID);
glTexParameterf(GL_TEXTURE_EXTERNAL_OES, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
glTexParameterf(GL_TEXTURE_EXTERNAL_OES, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
glTexParameteri(GL_TEXTURE_EXTERNAL_OES, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
glTexParameteri(GL_TEXTURE_EXTERNAL_OES, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
然后使用FBO将SurfaceTexture复制到Unity纹理。每一帧。使用Oculus Mobile SDK(在MediaSurface.cpp文件中)提供了在C ++中执行此操作的示例
答案 1 :(得分:0)
SurfaceTexture in Android Docs说
updateTexImage()只能在包含纹理对象的OpenGL ES上下文的线程上调用
另外,我认为您必须在该线程上设置setOnFrameAvailableListener
以使updateTexImage()
正常工作,但不确定。