我试图在我的应用程序中编写一个轻量级的HTTP服务器,将feed动态生成的MP3数据发送到内置的Android MediaPlayer中。我不允许将我的内容存储在SD card上。
我输入的数据基本上是无限长的。我告诉MediaPlayer,它的数据源基本上应该类似于"http://localhost/myfile.mp3"。我有一个简单的服务器设置,等待MediaPlayer提出这个请求。然而,MediaPlayer并不是很合作。首先,它生成一个HTTP GET并尝试抓取整个文件。如果我们尝试将数据转储到socket中,就会超时,因此我们尝试使用HTTP范围标头以块形式写入数据。MediaPlayer不喜欢这样,也不会一直请求后续的块。
是否有人成功地将数据直接传输到MediaPlayer?我是否需要实现RTSP或Shoutcast服务器?我是不是错过了一个关键的HTTP header?我在这里应该使用什么策略?
发布于 2014-07-22 17:10:14
HTTP服务器确实是托管在电话本身上的。这非常简单:只是一个thread监听HTTP GET请求的套接字。当它收到HTTP请求时,它会发出一个new socket,写回一些HTTP头,然后开始将MP3音频数据转储回socket。这个HTTP服务器没有做任何其他事情。
当我正在播放音乐时,Android Media Player正在播放它。如果在播放音频时,Media Player的播放buffer被清空,那么它的性能非常差。对我来说,确保我的HTTP服务器一直将数据写入到socket中是非常重要的。我用小块(10 kB)将字节移动到套接字中。我的HTTP响应的标题最后看起来如下所示:
//构建响应头StringBuilder sb =新的StringBuilder();sb.append( "HTTP/1.1 200 OK\r\n");sb.append(“内容-类型:音频/mpeg\r\n”);sb.append(“连接:关闭\r\n”);sb.append(“接受-范围:字节\r\n”);sb.append(“内容-长度:”+ totalFileSize + "\r\n“);sb.append(内容-配置:内联;filename=xxxxx.mp3\r\n\r\n");
只要我让烟斗继续燃烧,Android Media Player就会毫无怨言地继续使用它。播放音频只需要一个请求和响应。它最终运行得很好。
https://stackoverflow.com/questions/2511045
复制相似问题