使用Android MediaPlayer进行音频流传输

6

我正在尝试使用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.

你是在模拟器上运行吗?我以前在模拟器上运行媒体时遇到过问题。试着在实际设备上运行,也许会起作用。 - dmon
是的,我正在模拟器上运行它。很遗憾我没有真实设备 :( - Fernando Valente
我的直觉是那就是问题所在。其他人可能会有不同的看法。 - dmon
1
只是为了好玩,将您的数据源设置为 http://87.230.103.107:8000/;。如果它能正常工作,那就意味着您的用户代理是 Mozilla,这会导致 SHOUTcast 服务器返回管理员界面而不是流。分号强制其返回流。 - Brad
3个回答

5

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

如果您仍需要答案,则是在准备过程中调用 start()。与 prepare() 不同,PrepareAsync() 立即返回。使用流进行 'prepare()` 的问题在于它将阻塞直到有足够的数据开始播放。

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


3
问题在于直接不支持"audio/aacp"流媒体内容类型。有些解码库可以用来播放"aacp",请参见以下解决方案: Android免费高级音频(AAC)解码器 如何使用该库? 有关更多详细信息,请参见此处在使用时考虑法律问题

-1

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

(或者)将逻辑保持在单独的线程中。(可以使用Intent Service、AsyncTask等)

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接