为什么 MediaPlayer 不准备?

Why does MediaPlayer not prepare?

我正在使用 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 什么也没给出;我认为它从来没有被称为...

可能是什么问题?

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


非常感谢任何帮助。

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

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

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

您的 MediaPlayer.OnPreparedListener() 中缺少 mediaPlayer.start()。使用示例 http 请求

查看扩展 class 的附加 kotlin 代码

错误 1004:未找到源(f.e。路径错误或 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)。快乐编码

您的问题似乎是因为使用 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 权限。

当然感谢所有尽最大努力回答我这个问题的朋友,但是none解决了主要问题。

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

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