23

我正在尝试在我的应用程序中编写一个轻量级HTTP服务器,以feed动态生成MP3数据到内置的Android MediaPlayer. 我不允许将我的内容存储在SD card.

我的输入数据本质上是无限长的。我告诉MediaPlayer它的数据源基本上应该是"http://localhost/myfile.mp3". 我有一个简单的服务器设置等待MediaPlayer发出这个请求。但是,MediaPlayer不是很配合。起初,它会创建一个HTTP GET并尝试抓取整个文件。如果我们尝试简单地将数据转储到 中,则会超时,socket因此我们尝试使用HTTPRange 标头以块的形式写入数据。 MediaPlayer不喜欢这样,也不会继续请求后续的块。

有没有人成功地将数据直接流式传输到MediaPlayer? 我需要实现一个RTSPShoutcast服务器吗?我只是错过了一个关键HTTP header吗?我应该在这里使用什么策略?

4

1 回答 1

4

HTTP服务器确实托管在手机本身上。这很简单:只是thread在套接字上侦听HTTP GET 请求。当它收到HTTP请求时,它会一个 a new socket,写回一些HTTP标头并开始将音频数据转储MP3socket. 该HTTP服务器没有做任何其他事情。

Android Media Player我正在播放音乐时,它正在播放音乐。 如果在播放音频时其播放被清空,则其Media Player行为非常糟糕。buffer确保我的HTTP服务器不断向其中写入数据对我来说非常重要socket。我将字节以小块(10 kB)的形式移动到套接字中。我的回复中的标题 HTTP最终看起来像这样:

// Build response headers
StringBuilder sb = new StringBuilder();
sb.append( "HTTP/1.1 200 OK\r\n");
sb.append( "Content-Type: audio/mpeg\r\n");
sb.append( "Connection: close\r\n" );
sb.append( "Accept-Ranges: bytes\r\n" );
sb.append( "Content-Length: " + totalFileSize + "\r\n" );
sb.append( "Content-Disposition: inline; filename=xxxxx.mp3\r\n\r\n");

只要我一直点燃烟斗,他们Android Media Player就会毫无怨言地继续消费它。播放音频只需要一个请求和响应。它最终工作得很好。

于 2014-07-22T17:10:14.273 回答