Unity + Android SurfaceTexture更新错误

时间:2016-03-28 06:48:46

标签: android unity3d android-mediaplayer exoplayer

我正在尝试创建一个基于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之外不起作用。

2 个答案:

答案 0 :(得分:1)

我没有让这个工作,并决定采用不同的方法。但是,我从实际确实使用此系统的人那里学到的是,您无法使用Unity Textures - 您需要将GL_TEXTURE_EXTERNAL_OESSurfaceTexture一起使用。

首先必须执行以下操作:

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()正常工作,但不确定。