【问题标题】:Do all versions of Android support the MediaPlayer streaming?是否所有版本的 Android 都支持 MediaPlayer 流媒体?
【发布时间】:2023-04-13 12:42:02
【问题描述】:

正如标题所说,我基本上想知道 MediaPlayer 流媒体支持是否适用于所有版本的 Android。

这是我目前使用的代码,在我的 Android 2.2 手机上运行良好:

MediaPlayer mp = new MediaPlayer();
mp.setDataSource(SHOUTCAST_STREAM);
mp.prepare();
mp.start();

但这适用于 1.5 或 1.6 吗?还是我必须为流构建自己的缓冲管理系统?

* 更新 *

刚刚在 1.6 模拟器上测试过,出现以下错误。在 2.2 模拟器上它工作正常。

23:15:50.074    31  ERROR   PlayerDriver    Command PLAYER_INIT completed with an error or info PVMFFailure
23:15:50.074    282 ERROR   MediaPlayer error (1, -1)
23:15:50.074    282 ERROR   MediaPlayer io error
23:15:50.074    282 ERROR   MediaPlayer java.io.IOException: Prepare failed.: status=0x1
23:15:50.074    282 ERROR   MediaPlayer     at android.media.MediaPlayer.prepare(Native Method)
23:15:50.074    282 ERROR   MediaPlayer     at org.me.bla.Bla.onCreate(Bla.java:38)
23:15:50.074    282 ERROR   MediaPlayer     at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1123)
23:15:50.074    282 ERROR   MediaPlayer     at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2364)
23:15:50.074    282 ERROR   MediaPlayer     at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2417)
23:15:50.074    282 ERROR   MediaPlayer     at android.app.ActivityThread.handleRelaunchActivity(ActivityThread.java:3502)
23:15:50.074    282 ERROR   MediaPlayer     at android.app.ActivityThread.access$2200(ActivityThread.java:116)
23:15:50.074    282 ERROR   MediaPlayer     at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1798)
23:15:50.074    282 ERROR   MediaPlayer     at android.os.Handler.dispatchMessage(Handler.java:99)
23:15:50.074    282 ERROR   MediaPlayer     at android.os.Looper.loop(Looper.java:123)
23:15:50.074    282 ERROR   MediaPlayer     at android.app.ActivityThread.main(ActivityThread.java:4203)
23:15:50.074    282 ERROR   MediaPlayer     at java.lang.reflect.Method.invokeNative(Native Method)
23:15:50.074    282 ERROR   MediaPlayer     at java.lang.reflect.Method.invoke(Method.java:521)
23:15:50.074    282 ERROR   MediaPlayer     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:791)
23:15:50.074    282 ERROR   MediaPlayer     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:549)
23:15:50.074    282 ERROR   MediaPlayer     at dalvik.system.NativeStart.main(Native Method)

这是否意味着它根本无法在旧版本的操作系统上运行,还是有任何解决方法?我想我可以做一个自定义缓冲系统,但我想先确定没有更简单的方法。

【问题讨论】:

  • 当你在 1.5 和 1.6 模拟器中尝试时发生了什么?
  • @CommonsWare 我正在考虑它,但由于某种原因,我认为模拟器无法播放声音,这使我无法准确测试它。我试试看。
  • 也做了一些阅读,这似乎是 HTTP HEADER 的问题。较新版本的操作系统似乎足够聪明,可以解决旧版本似乎无法解决的问题。
  • 我也在尝试流式传输 Shoutcast URL。代码真的很简单。但是,我无法让它与 2.3.3 和 2.3.5 一起使用。我不断收到 Prepare failed.: status=0x1 错误。我想,我的流媒体资源有问题。你能把你的网址分享给我测试一下吗?

标签: android streaming media-player


【解决方案1】:

根据Android References,MediaPlayer 类从 api level: 1 开始可用,并且没有任何关于它被弃用的信息。所以我会说你会很安全。

在您的 1.6 模拟器上,您是否启动了浏览器并确保您可以访问互联网?

1.6 模拟器是您前段时间创建的吗?我在一段时间后创建的模拟器出现问题(文件损坏)。如果是这种情况,您可以创建一个新的。

我刚刚想到的另一件事...是否在某处缺少某些身份验证?

我发现这个tutorial 也可能有帮助。他确实在他的示例中创建了一个缓冲区

【讨论】:

  • 是的,我也看到了,但似乎并非如此。我问这个问题的原因是因为我做了一些阅读,发现不同操作系统版本之间存在很多问题。所以,我想看看其他人对它的体验。
  • 我刚刚测试过,可以正常上网了。
【解决方案2】:

我认为问题出在 setDataSource。它没有正确读取文件。更好的方法是通过 FileInputStream 读取并调用 getFD() 方法。例如:

MediaPlayer mPlayer = new MediaPlayer();

FileInputStream 流 = mContext.openFileInput("string");

mPlayer.setDataSource(stream.getFD());

stream.close();

mPlayer.setAudioStreamType(ANNOUCE_STREAM);

mAndroidPlayer.prepare();

mAndroidPlayer.start();

我想这会对你有所帮助。

【讨论】:

  • 这需要我将它保存到一个文件中并围绕它构建一个完整的缓冲系统。我所说的流是无穷无尽的——它不仅仅是一首歌。如果找不到更简单的解决方案,这基本上是我最后的选择。
最近更新 更多