为什么 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,-1004
或 1,-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解决了主要问题。
我是如何找到摆脱这种情况的方法的:
我为我的文件尝试了另一个主机,它工作正常。所以我决定将我所有的数据和数据库移动到另一个主机。
我正在使用 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,-1004
或 1,-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 请求
错误 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解决了主要问题。
我是如何找到摆脱这种情况的方法的:
我为我的文件尝试了另一个主机,它工作正常。所以我决定将我所有的数据和数据库移动到另一个主机。