流媒体传输到Android MediaPlayer

23

我正在尝试在我的应用程序中编写一个轻量级的 HTTP 服务器,以便向内置的 Android MediaPlayer 动态提供生成的无限长度的 MP3 数据。但是我不能将内容存储在 SD 卡 上。

我的输入数据基本上长度无限。我告诉 MediaPlayer 它的数据源应该像这样:"http://localhost/myfile.mp3"。我设置了一个简单的服务器来等待 MediaPlayer 发出此请求。但是 MediaPlayer 不太合作。起初它会发出 HTTP GET 并尝试抓取整个文件。如果我们尝试简单地将数据转储到套接字中,它会超时。因此我们尝试使用 HTTP 范围头将数据分块写入。但是,MediaPlayer 不喜欢这样做,并且不会继续请求后续的块。

有人成功过直接将数据流式传输到 MediaPlayer 吗?我需要实现一个 RTSP 或者 Shoutcast 服务器吗?我是否只是缺少了关键的 HTTP header?我应该采用什么策略?


我知道现在已经很晚了,但这是为那些未来会来到这里的人准备的。这个链接有一些可以开始使用的代码。 - Samuel
你是否也使用过这种方法来播放视频文件?它和音频文件的表现一样吗? - Mathias Conradt
嘿,Rob,你有没有解决这个问题的方法?你能分享一下示例代码吗? - Ashwin N Bhanushali
1个回答

4

The HTTP Server was indeed hosted on the phone itself. It was very simple: just a thread listening on a socket for an HTTP GET request. When it got the HTTP request, it would one a new socket, write back some HTTP headers and start dumping the MP3 audio data back to the socket. This HTTP server didn't do anything else.

The Android Media Player was playing the music as I was streaming to it. The Media Player behaved very poorly if its playback buffer was emptied while it was playing audio. It was very important for me to make sure my HTTP server kept writing data into that socket. I moved bytes into the socket in small chunks (10 kB). The headers on my HTTP response ended up looking like this:

// 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");

As long as I kept the pipe stoked, the Android Media Player kept consuming it without complaint. Playing audio only required one request and response. It ended up working pretty well.


1
有没有完整的代码托管在任何地方?我正在尝试使用来自MediaRecorder + Camera的实时视频进行相同的操作,但是追踪不同的尝试和库已经让我筋疲力尽了。如果没有,那么需要多少赏金才能在这里添加更多细节? - ChiefTwoPencils

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接