2010-03-24 66 views
22

我想写一个轻量级HTTP服务器在我的应用程序到feed动态生成MP3数据到内置AndroidMediaPlayer。我不允许将我的内容存储在SD card上。流媒体到Android MediaPlayer

我的输入数据本质上是无限长的。我告诉MediaPlayer其数据源基本上应该是"http://localhost/myfile.mp3"。我有一个简单的服务器设置,等待MediaPlayer发出这个请求。但MediaPlayer不太合作。起初,它制作了一个HTTP GET并试图抓取整个文件。如果我们试着简单地将数据转储到socket,那么它会超时,所以我们尝试使用HTTP Range标头以块的形式写入数据。 MediaPlayer不喜欢这个,并且不会继续请求后续的块。

有没有人有任何成功的流数据直接输入MediaPlayer?我是否需要实施RTSPShoutcast服务器?我是否仅仅缺少重要的HTTP header?我应该在这里使用什么策略?

+0

您是否也使用这种方法来播放视频文件?它是否与音频文件一样? – 2011-10-11 13:47:44

+0

嗨,罗布你有问题的解决方法?你能分享示例代码吗? – 2013-04-04 14:33:49

+0

我知道晚了。但是这对于那些未来最终在这里结束的人来说。这[**链接**](http://stackoverflow.com/questions/5343730/mediaplayer-stutters-at-start-of-mp3-playback/5432091#5432091)有代码开始。 – Samuel 2011-04-21 06:57:31

回答

3

HTTP服务器确实托管在手机本身。它非常简单:只需一个thread在插座上监听HTTP GET 请求。当它得到HTTP请求时,将会有一个new socket, 回写一些HTTP标题,并开始将MP3音频数据 转储回socket。这HTTP服务器没有做任何事情。

Android Media Player正在播放音乐,因为我正在流到 它。如果播放buffer 在播放音频时清空,Media Player表现非常差。这对于我 确保我的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保持 消费它毫无怨言。播放音频只需要一个 请求和响应。它结束了很好的工作。

+1

任何机会的完整代码托管在任何地方?我试图对来自MediaRecorder + Camera的实时视频进行同样的处理,并且用尽了不同的尝试和库。如果没有,在这里添加更多细节需要多大的赏金? – ChiefTwoPencils 2014-08-27 23:51:08