Android MediaPlayer - 有时即使播放音频也没有播放视频

spe*_*ane 20 java video android media-player

我正在开发一个Android应用程序,我正在使用Android SDK MediaPlayer在我的应用程序中播放一些视频.当我在我的应用程序中播放视频时,大约五分之一,视频播放没有视频.这不是一个简单的编码错误,因为大多数时候视频播放都很完美.

我认为我的代码中的竞争条件导致了这个错误.但是,我添加了许多调试语句,当视频无法播放时,所有内容似乎都已正确设置.

我已经扫描了网络,并试图寻找解决方案,但没有一个是足够的(见下文).

有没有人遇到过这类问题?如果是这样,你做了什么?

类似问题:

MediaPlayer视频未播放

Android媒体播放器显示音频但没有视频

安卓视频,听到声音,但没有视频

更多细节:

  • 我在两部手机上遇到过这个漏洞.在三星充电视频播放80%的时间和20%的时间有音频,但没有视频.在T-Mobile Comet上,它更糟糕; 视频只播放约10%的时间.
  • 这不是文件的问题,我尝试了各种视频文件和编解码器,并得到了同样的问题.
  • 这对存储介质来说不是问题.我已经尝试播放存储在内部存储和SD卡上的视频,但两者都没有区别.我甚至尝试在播放之前阅读一些文件,希望系统会缓存它,但这似乎也没有帮助.

更新:

我一直在调试这个并查看logcat.我发现当视频工作时,logcat中出现如下内容:

09-28 00:09:03.651: VERBOSE/PVPlayer(10875): setVideoSurface(0x65638)
Run Code Online (Sandbox Code Playgroud)

但是当视频没有播放时,它看起来像是一个空条目:

09-28 00:03:35.284: VERBOSE/PVPlayer(10875): setVideoSurface(0x0)
Run Code Online (Sandbox Code Playgroud)

更新2:

当视频无法播放时,函数MediaPlayer.OnInfoListener带参数 what==MEDIA_ERROR_UNKNOWN(0x1)extra==35.我查看了Android代码库,试图确定未知错误35的含义.我遇到了文件pv_player_interface.h,它表明错误代码35对应于一个名为a的东西PVMFInfoTrackDisable.我用谷歌搜索了那个把我带到一个叫做文件的文章 pvmf_return_codes.pdf.该文件给了我以下难以理解的解释:

4.34.PVMFInfoTrackDisable

禁用特定轨道的通知.这个是基于每个轨道.对于未压缩的音频/视频格式,在选择内容中可用的轨道的过程中,如果解码器不支持轨道,则发送PVMFInfoTrackDisable事件.如有必要,该活动将在每个赛道发送一次.

我觉得我已经走了很长的路,但我没有找到答案......仍然在调查.

spe*_*ane 18

我解决了这个问题,虽然完全是一种黑客的方式.实际上有两个问题:

  1. 邪恶的信息35消息:我发现有时会使用extra == 35调用MediaPlayer.OnInfoListener.发生这种情况时,您已经搞砸了,视频无法正常播放.我不知道是什么原因造成的.我找到的唯一解决方法是尝试重新启动视频并重新完成整个prepareAsync过程.视频播放通常是第二次播放.

  2. 视频大小未设置:即使发出MediaPlayer.OnPreparedListener(或等效prepare()返回),也可能未设置视频大小.视频大小通常会在准备返回后设置几个毫秒,但有一段时间它处于模糊状态.如果在设置视频大小之前调用MediaPlayer.start(),则有时(但不总是)播放失败.有两种可能的解决方案:(1)轮询MediaPlayer.getVideoHeight()或getVideoWidth()直到它们非零或(2)等待直到调用OnVideoSizeChangedListener.只有在这两个事件中的一个之后,才应该调用start().

通过这两个修复,视频播放更加一致.这些问题很可能是我的手机(Samsung Charge和T-Mobile Comet)的问题,所以如果在其他手机上存在不同但类似的问题我也不会感到惊讶.