流式传输到 Android MediaPlayer
Posted
技术标签:
【中文标题】流式传输到 Android MediaPlayer【英文标题】:Streaming to the Android MediaPlayer 【发布时间】:2011-01-31 10:45:37 【问题描述】:我正在尝试将我的应用程序中的轻量级HTTP
服务器写入feed
动态生成的MP3
数据到内置android
MediaPlayer
。我不允许将我的内容存储在SD card
。
我的输入数据基本上是无限长的。我告诉MediaPlayer
,它的数据源基本上应该类似于"http://localhost/myfile.mp3"
。我有一个简单的服务器设置,等待MediaPlayer
发出这个请求。但是,MediaPlayer
不是很合作。起初,它会生成一个HTTP GET
并尝试获取整个文件。如果我们尝试简单地将数据转储到socket
中,则会超时,因此我们尝试使用HTTP
Range 标头以块的形式写入数据。 MediaPlayer
不喜欢这样并且不会继续请求后续的块。
有没有人成功地将数据直接传输到MediaPlayer
?我需要实现RTSP
或Shoutcast
服务器吗?我只是错过了一个关键的HTTP header
吗?我应该在这里使用什么策略?
【问题讨论】:
我知道晚了。但这是为那些将来会来到这里的人准备的。这个Link 有代码开始。 您是否也使用这种方式播放视频文件?它的性能是否与音频文件相同? 嘿,Rob,您有解决此问题的方法吗?可以分享示例代码吗? 【参考方案1】:
HTTP
服务器确实托管在手机本身上。这是非常 很简单:只是一个thread
在套接字上监听HTTP GET
要求。当它收到HTTP
请求时,它会是一个new socket
, 写回一些HTTP
标头并开始转储MP3
音频数据 回到socket
。这个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
就会一直保持 毫无怨言地食用它。播放音频只需要一个 请求和响应。它最终工作得很好。
【讨论】:
是否有可能将完整代码托管在任何地方?我正在尝试对来自 MediaRecorder + Camera 的实时视频做同样的事情,并且对追逐不同的尝试和库感到筋疲力尽。如果没有,在这里添加更多细节需要多大的赏金?以上是关于流式传输到 Android MediaPlayer的主要内容,如果未能解决你的问题,请参考以下文章
在使用 Android 2.2 的 HTC Desire 上使用 Android MediaPlayer 进行流式传输时的奇怪行为
如何使用 Android MediaPlayer 通过 http 流使 AAC 可搜索?
Android 流式音频/视频无法流式传输 rtsp 文件?
MediaPlayer 错误 (1, -1004) aka MEDIA_ERROR_IO 试图在三星 S3 上流式传输音乐