流式传输到 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?我需要实现RTSPShoutcast 服务器吗?我只是错过了一个关键的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 文件?

使用 Android 流式传输 AAC 音频

Android 上的音频流

MediaPlayer 错误 (1, -1004) aka MEDIA_ERROR_IO 试图在三星 S3 上流式传输音乐