【问题标题】:Why does MediaPlayer not prepare?为什么 MediaPlayer 不准备?
【发布时间】:2020-01-03 15:27:38
【问题描述】:

我正在使用MediaPlayer 加载一个mp3 文件并在线播放。我正在使用此代码:

try{
    Log.i("tag1", "try");
    mediaPlayer.setDataSource(activity.this, Uri.parse("link"));
    mediaPlayer.prepareAsync();
    mediaPlayer.setOnPreparedListener(new MediaPlayer.OnPreparedListener() {
        @Override
        public void onPrepared(MediaPlayer mediaPlayer) {
            Log.i("tag2", "" + mediaPlayer.getDuration());
        }
    });
    } catch(IOException e) {
    e.printStackTrace();
}

大多数时候什么都没有准备,所以我得到log.i的结果如下:

tag1 = try

tag2 永远不会被执行

如果,有时只准备mediaPlayer,我会得到这些日志:

tag1 = try

tag2 = 0_既不可接受也不可用

另外,当我调用mediaPlayer.setOnErrorListener 时,我收到错误1,-10041,-2147483648。此外,mediaPlayer.setOnInfoListener 什么也不提供;我认为它从未被调用...

可能是什么问题?

不用说,在服务器文件管理器的log文件夹中,我发现了这个:"stagefright/1.2 (Linux; Android 4.4.4)"。我认为这可能有助于解决问题。 另外,与此相关,问题可能是由 PHP 扩展引起的吗?如果是,激活哪个扩展可以解决这个问题?


非常感谢任何帮助。

【问题讨论】:

  • 试过setOnErrorListener?如果是这样,onError 回调中的 int whatint extra 是什么?还要检查setOnInfoListener
  • 致电setOnPreparedListener 之前致电prepareAsync
  • 我相信你已经看到了,但万一没有:这是一个非常有用的 MediaPlayer 状态机流程图。如果你从这里转移,你会遇到问题:image.slidesharecdn.com/mediaplayer-110716092828-phpapp02/95/…
  • 您是否尝试过先下载文件然后使用它而不是直接流式传输?另外,您是否尝试过其他可能具有不同编解码器的文件?
  • 您仍然应该尝试一下,只是为了缩小错误空间,以便更容易查明实际问题。因为,如果事先下载它使它工作,那么你知道问题出在流媒体上。如果它没有帮助,您知道它是您的实现还是文件。总是让你的问题尽可能小

标签: java android android-mediaplayer


【解决方案1】:

您有一个MEDIA_ERROR_IO。正如文档所说,它是针对文件或网络相关的操作错误。

在大多数情况下,问题出在 MediaPlayer 类的实现中,或者可能在 android 4 中,如提到的here

我会推荐你​​ExoPlayer,而不是。

【讨论】:

  • 谢谢我的朋友!我正在尝试几个建议;其中,ExoPlayer...
  • 能否请您介绍一个适合 ExoPlayer 的教程源?我只需要一个简单的 mp3 播放器……我需要它简短而切题。我非常感谢你。 . .
  • 当然,没有比 google codelabs 本身更好的地方了,你可以从这里开始codelabs.developers.google.com/codelabs/exoplayer-intro/…
  • 谢谢!我认为我应该更改我的主机提供商以尝试其他服务,但没有解决方案。 . .
【解决方案2】:

您的MediaPlayer.OnPreparedListener() 中缺少mediaPlayer.start()。请参阅附加的 kotlin 代码以获取带有示例 http 请求的扩展类

错误1004:找不到源(例如,路径错误或 url 处没有流)

错误2147483648:您的设备不支持媒体格式

另外提一下:在设备系统上保留音频文件的引用需要持久的 uri 权限

这里是使用 OkHttp 在 kotlin 中启动无线电流的精简代码

class MyPlayer: MediaPlayer(), MediaPlayer.OnPreparedListener {

  fun playStream() {
    try {
        val uri = Uri.parse( [URL] )

        //check if url valid
        val client = OkHttpClient()
        val request = Request.Builder().url( [URL] ).build()
        val newCall = client.newCall(request).execute()
        if (newCall.code() != 200) {
            //handle error for stream, stream not broadcasting
            return
        }

        val headers = HashMap<String, String>()
        headers.put("User-Agent", " [SOME AGENT] ")
        setDataSource(context, uri, headers)

        prepareAsync()

    } catch (e: Exception) {
        L.e("Url Parsing failed for ${e.message}")
        setInternalState(State.Error, StreamErrorMapping.ShoutCastError)
    }
  }
}

override fun onPrepared(player: MediaPlayer) {
    player.start()  //<-- this call is missing in your code
}

顺便说一句,就像 Ezaldeenn sahb 已经提到的,我也推荐使用ExoPlayer,因为它比MediaPlayer 快得多!在我的项目中,缓冲从 2-4 秒(MediaPlayer)下降到 200 毫秒(Exoplayer)。快乐编码

【讨论】:

  • 感谢您的帮助。 start mediaPlayer 怎么可能onPrepare 没有响应或响应奇怪?我在我的代码中使用了.start(),播放按钮在其中起作用,从而引发了问题。但是,在这里,我刚刚带来了我的代码的logi 来显示错误。
  • 能否请您介绍一个适合 ExoPlayer 的教程源?我只需要一个简单的 mp3 播放器...
  • 这是另一个问题,但这里就是您所需要的:github.com/google/ExoPlayer
  • 如果 onPrepared() 未被调用,则无法调用 start()。如果未调用 onPrepared,则说明您的媒体源或格式有问题
  • 是的,我正在尝试更改我的主机。 . . ,还有很多事情要做......
【解决方案3】:

您的问题似乎是因为使用http 链接而不是https。将android:usesCleartextTraffic="true" 添加到您的清单应用程序标签中,如下所示:

<application
    android:allowBackup="true"
    android:icon="@mipmap/ic_launcher"
    android:label="@string/app_name"
    android:usesCleartextTraffic="true"
    android:theme="@style/AppTheme"
    >
      ...

</application>

另外,别忘了使用internet 权限。

【讨论】:

    【解决方案4】:

    当然,我感谢所有为我的这个问题付出最大努力的朋友,但他们都没有解决主要问题。

    我是如何找到摆脱这种情况的方法的:

    我为我的文件尝试了另一个主机,它工作正常。所以我决定将我所有的数据和数据库转移到另一个主机上。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-06-04
      • 2011-07-09
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多