流式传输到Android MediaPlayer

Rob*_*ski 22 android http stream media-player android-mediaplayer

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

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

有没有人直接将数据流成为MediaPlayer?我需要实现一个RTSPShoutcast服务器吗?我只是错过了批评HTTP header吗?我应该在这里使用什么策略?

Rob*_*vey 4

服务器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");
Run Code Online (Sandbox Code Playgroud)

只要我一直给烟斗加油,他们Android Media Player就会毫无怨言地继续消费。播放音频只需要一次请求和响应。结果效果很好。