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

时间:2011-09-22 05:06:13

标签: java android video media-player

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

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

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

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

类似问题:

MediaPlayer Video not played

android media player shows audio but no video

android video, hear sound but no video

更多细节:

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

更新

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

09-28 00:09:03.651: VERBOSE/PVPlayer(10875): setVideoSurface(0x65638)

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

09-28 00:03:35.284: VERBOSE/PVPlayer(10875): setVideoSurface(0x0)

更新2:

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

  

4.34。 PVMFInfoTrackDisable

     

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

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

5 个答案:

答案 0 :(得分:18)

我解决了这个问题,尽管是以一种完全黑客的方式。实际上有两个问题:

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

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

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

答案 1 :(得分:3)

根据speedplane的建议,我想出了以下代码。如果MediaPlayer.getVideoHeight()在onPrepared中返回0,那么我会延迟1秒并重试。现在,如果第一次不播放,通常会在1秒后播放。我看到它需要多次尝试。

   private void videoPlayer(String path){
      if (mMediaController == null)
      {
         mMediaController = new MediaController(this);
         mVideoView.setMediaController(mMediaController);
      }
      if (!mMediaController.isShowing())
         mMediaController.show();

      getWindow().setFormat(PixelFormat.TRANSLUCENT);
      mVideoView.setVideoPath(path);
      mVideoView.requestFocus();
      mVideoView.setOnPreparedListener(new MediaPlayer.OnPreparedListener() {
            @Override
               public void onPrepared(final MediaPlayer mp) {
               mVideoView.seekTo(mImageSeek);
               if (mp.getVideoHeight() == 0) {
                  final Handler handler = new Handler();
                  handler.postDelayed(new Runnable() {
                        @Override
                           public void run() {
                           mVideoView.stopPlayback();
                           mMediaController = null;
                           videoPlayer(mImageFilepath);
                        }
                     }, 1000);
               } else 
                  mVideoView.start();
            }
         });
   }

答案 2 :(得分:1)

我已经研究了这个错误2周了,我或多或少地了解了真正的问题。当然,我在谈论 The Evil Info 35 Message 。如果你遇到了这个奇怪的错误,现在你可以开心并拍摄一些像三星这样的供应商:D ......

出现问题是因为用户无法看到表面视图(tabhost中的活动或暂停 - 唤醒功能,有时不会聚焦,有时也不会在前面(可能))。

这是因为某些重置视频运行正常,导致它获得焦点或者其他活动/对象可能没有重叠。

当其中一些发生时,媒体播放器认为您无法看到视频或无法播放视频,并且会禁用视频播放,让您在听音乐曲目时感受到工作中最严重的问题。< / strong>

会看到下一个错误,祝你好运。 :d

答案 3 :(得分:-4)

我的Desire HD上也有这个问题大概1到2次。我尝试了很多东西,但错误总是在那里。毕竟我选择在我的设备上安装自定义ROM。之后它完美地工作了,我再也没有遇到过这个问题。

我知道这不是你想听到的那种答案,但我没有找到其他的灵魂。

您可以在此处找到适用于您设备的自定义ROM:XDA Developers

我希望我能帮助你。

最好的问候和快乐的电影观看

safari =)

答案 4 :(得分:-5)

基本问题是: 在surfaceCreated调用之前你开始视频播放,当持有者没有为MediaPlayer做好准备时,你只能听到声音但却看不到图片!

正确的方法是: