【问题标题】:Android MediaPlayer - Sometimes No Video is Played Even Though Audio PlaysAndroid MediaPlayer - 即使播放了音频,有时也没有播放视频
【发布时间】:2011-09-22 05:06:13
【问题描述】:

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

我认为我的代码中的竞争条件导致了该错误。但是,我添加了一些调试语句,当视频无法播放时,一切似乎都已正确设置。

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

以前有没有人遇到过这种类型的问题?如果有,你做了什么?

类似问题:

MediaPlayer Video not played

android media player shows audio but no video

android video, hear sound but no video

更多细节:

  • 我在两部手机上都遇到过这个错误。在三星 Charge 视频中,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 的东西。我用谷歌搜索了这个词,它把我带到了一个名为pvmf_return_codes.pdf 的文件中。该文件给了我以下难以理解的解释:

4.34。 PVMFInfoTrack 禁用

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

我觉得我已经走了很长一段路,但距离找到答案还差得远……仍在调查中。

【问题讨论】:

  • 您每次播放的媒体内容是相同的还是不同的?
  • 您是否在多台设备上进行了测试以确保这不是设备错误?
  • 我已经回复了你的 cmets inline。
  • 这看起来像是视频编解码器的问题,您可以粘贴 logcat 中的日志吗?如果结果证明是编解码器的问题,那么除了更改内容之外你什么也做不了..
  • 让我补充一下,随着 android 源代码和 kernel.org 的关闭,追踪这些问题变得更加困难......愚蠢的黑客。

标签: java android video media-player


【解决方案1】:

我解决了这个问题,尽管是以一种完全骇人听闻的方式。其实有两个问题:

  1. The Evil Info 35 消息: 我发现有时 MediaPlayer.OnInfoListener 会被调用 extra==35。发生这种情况时,您会被搞砸,视频将无法正常播放。我不知道是什么原因造成的。我发现的唯一解决方法是尝试重新启动视频并重新完成整个 prepareAsync 过程。视频播放通常可以进行第二次。

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

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

【讨论】:

  • 我在这个问题上苦苦挣扎了好几天。 OnPrepareListener 并不意味着完全准备好。我采用解决方案(1)并且它有效。非常感谢!
  • 对我不起作用 :-(。我没有收到 35 错误,高度和宽度总是很好
  • 谢谢,第二点帮助了我。当我反复创建新的MediaPlayers 时,我遇到了调用.Start() 的零星问题,播放器偶尔是空白的(我的设备上没有扬声器,但我认为声音是按照 OP 播放的),还远远不够触发OnInfo.
  • 嗨 @speedplane ,在三星设备中,我得到了 MEDIAINFO VIDEO_NOT_PLAYING = 805 并且额外的代码是 -12 。不知道如何解决这个问题。请帮忙。
【解决方案2】:

按照 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();
            }
         });
   }

【讨论】:

    【解决方案3】:

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

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

    这是因为当一些重置该视频时它运行正常,导致它获得焦点,或者可能另一个活动/对象没有与它重叠。

    当其中一些情况发生时,媒体播放器会认为您看不到视频或无法播放,并禁用视频轨道,让您在工作生活中一边听音乐一边头疼。

    将看到下一个错误,祝你好运。 :D

    【讨论】:

      【解决方案4】:

      我在我的 Desire HD 上也遇到过这个问题大约 1 到 2 次。我尝试了很多东西,但错误始终存在。毕竟我选择在我的设备上安装一个自定义 rom。之后它工作得很好,我再也没有遇到过这个问题。

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

      在这里您可以找到适合您设备的自定义 rom:XDA Developers

      希望能帮到你。

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

      野生动物园 =)

      【讨论】:

      • 谢谢,但我正在编写一个应用程序,而不仅仅是尝试在我的手机上播放视频。我不能告诉我的用户安装新的 ROMS。
      【解决方案5】:

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

      正确的做法是:

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多