【问题标题】:Audio streaming with Android MediaPlayer使用 Android MediaPlayer 进行音频流式传输
【发布时间】:2011-04-26 02:01:51
【问题描述】:

我正在尝试使用 Android 的 MediaPlayer 创建音频流媒体。如果它不适用于 Android 2.1 或以下版本,那也没关系。我需要能够播放来自 SHOUTcast 流的音频。这是我的代码:

player = new MediaPlayer();
try {
player.setDataSource("http://87.230.103.107:8000");
player.prepareAsync();
} catch (IllegalArgumentException e) {
// TODO Auto-generated catch block
    e.printStackTrace();
} catch (IllegalStateException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
player.start();

由于某种原因,这段代码什么也不会播放。我认为这可能与应用程序权限有关。有谁知道怎么回事?

谢谢!

[更新] 我收到以下错误:

04-25 23:35:15.432: ERROR/MediaPlayer(283): start called in state 4
04-25 23:35:15.432: ERROR/MediaPlayer(283): error (-38, 0)
04-25 23:35:15.602: ERROR/MediaPlayer(283): Error (-38,0)
04-25 23:35:17.542: INFO/AwesomePlayer(33): calling prefetcher->prepare()
04-25 23:35:18.547: INFO/Prefetcher(33): [0x17650] cache below low water mark, filling cache.
04-25 23:35:18.762: INFO/AwesomePlayer(33): prefetcher is done preparing
04-25 23:35:19.769: ERROR/AwesomePlayer(33): Not sending buffering status because duration is unknown.

【问题讨论】:

  • 你是在模拟器中运行这个吗?我以前在模拟器中运行媒体时遇到过问题。在实际设备中尝试一下,也许它会工作。
  • 是的,我在模拟器上运行它。可惜我没有真正的设备:(
  • 我的直觉是这就是问题所在。其他人可能会有另一种看法。
  • 只是为了好玩,将您的数据源设置为http://87.230.103.107:8000/;。如果有效,则意味着您的用户代理是 Mozilla,这会导致 SHOUTcast 服务器发回管理界面而不是流。分号强制它返回流。

标签: android audio mp3 media-player shoutcast


【解决方案1】:

抱歉回复晚了,在寻找另一个问题的答案时遇到了这个问题。

如果您仍需要答案,请在其仍在准备中时致电 start()PrepareAsync() 立即返回,与 prepare() 不同。对流使用 'prepare()` 的问题是它会阻塞,直到有足够的数据开始播放。

您要做的是设置一个OnPreparedListener,并从那里调用start()

【讨论】:

    【解决方案2】:

    问题是不直接支持内容类型“audio/aacp”流。可以使用某些解码库来播放“aacp”,请看下面的解决方案:

    Freeware Advanced Audio (AAC) Decoder for Android

    How to use this library?

    更多详情请查看this

    Consider legal issues while using it.

    【讨论】:

      【解决方案3】:

      1)避免使用prepare(),改用prepareAsyc()。 (或)将您的播放逻辑放在工作线程或单独的线程中。 1)避免使用player.prepare(),而是使用player.prepareAsync();

      (或)将逻辑保留在单独的线程中。 (可以使用 Intent 服务、AsyncTask 等)

      2)也可以尝试使用静态构造函数 MediaPlayer.create(Uri);

      【讨论】:

        猜你喜欢
        • 2010-12-30
        • 1970-01-01
        • 1970-01-01
        • 2013-02-04
        • 2018-04-13
        • 1970-01-01
        • 2012-05-11
        • 1970-01-01
        • 2011-05-11
        相关资源
        最近更新 更多