为什么媒体播放器不准备?



我正在使用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 类的实现中,或者可能出在 android 4 中,如此处所述

相反,我会推荐你ExoPlayer。

您的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(下降到200ms(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权限。

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

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

我为我的文件尝试了另一个主机,它起作用了。因此,我决定将所有数据和数据库移动到另一台主机。

最新更新