4

我在尝试通过 Oculus mobile sdk MediaSurfacePlugin for Unity 播放视频时遇到了一些问题。我尝试了很多不同的想法,但总是回到同样的问题;Android 媒体播放器似乎找不到该文件。这些是我遇到的最常见的错误:

Unity:无法使用消息 java.io.IOException 启动 mediaPlayer:setDataSource 失败。

团结:

统一:(文件名:./artifacts/generated/common/runtime/UnityEngineDebugBindings.gen.cpp 行:37)

团结:

MediaPlayer:无法创建媒体播放器

Unity:无法启动 mediaPlayer 并显示消息 java.io.IOException: setDataSourceFD failed.: status=0x80000000

团结:

统一:(文件名:./artifacts/generated/common/runtime/UnityEngineDebugBindings.gen.cpp 行:37)

团结:

也; 媒体播放器准备失败。状态=0x1。

据我所知,它们都意味着媒体播放器无法访问文件或找不到文件,或者由于格式不兼容而无法播放文件(我相当确定我的文件是兼容的;.ogv 格式,我也试过.mp4)。我一直将我的文件存储在统一的流资产文件夹中,我认为这是放置它们的正确位置吗?

我的软件版本是;ovr_sdk_mobile_1.0.3 和 Unity v5.3.6f1、Oculus Utilities v1.7.0、OVRPlugin v1.5.0、SDK v1.0.3.1。

我试过的:

  • 不同的视频格式:试过 big_buck_bunny.mp4,没有区别
  • 添加视频格式/将其删除:没有区别
  • 我还尝试使用媒体播放器的文件描述符构造函数而不是字符串,这通过统一来实现很尴尬,而且似乎没有什么区别,这是我用于此的代码,尝试使用和不使用附加文件扩展名:

    AndroidJavaClass unityPlayer = new AndroidJavaClass("com.unity3d.player.UnityPlayer");
    AndroidJavaObject activity = unityPlayer.GetStatic<AndroidJavaObject>("currentActivity");
    AndroidJavaObject context = activity.Call<AndroidJavaObject>("getApplicationContext");
    AndroidJavaObject assets = context.Call<AndroidJavaObject>("getAssets");
    AndroidJavaObject descriptor = assets.Call<AndroidJavaObject>("openFd", movieName+".ogv");
    mediaPlayer.Call("setDataSource", new object[]{descriptor.Call<object>("getFileDescriptor"),descriptor.Call<object>("getStartOffset"),descriptor.Call<object>("getLength")});
    
  • 它在 sdk 自述文件中说要使用 MediaSurfacePluginIntPtr androidSurface = OVR_Media_Surface(textureId, 2880, 1440);

但是这种方法似乎不存在(?),所以我使用了以下似乎有效的代码:

OVR_Media_Surface_SetTextureId(texId);
OVR_Media_Surface_SetTextureParms(960, 540);//960/540 is the video resolution
IntPtr androidSurface =  OVR_Media_Surface_GetObject();
  • 不久前 oculus 论坛上的一篇文章提到尝试使用 callvoidmethod 而不是 callobjectmethod,尝试过,似乎没有改变任何东西:

    AndroidJNI.CallObjectMethod(mediaPlayer.GetRawObject(), setSurfaceMethodId, parms);
    // AndroidJNI.CallVoidMethod(mediaPlayer.GetRawObject(), setSurfaceMethodId, parms);
    
  • 我还看到有人建议在 Android 的 Unity 设置中关闭多线程;再次,这似乎没有什么不同。

我真的很感谢这里的任何帮助,我觉得我现在已经尝试了一切!

有没有人成功地得到这个工作?

4

0 回答 0