流式传输到 Android MediaPlayer [英] Streaming to the Android MediaPlayer

查看:33
本文介绍了流式传输到 Android MediaPlayer的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

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

I'm trying to write a light-weight HTTP server in my app to feed dynamically generated MP3 data to the built-in Android MediaPlayer. I am not permitted to store my content on the SD card.

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

My input data is essentially of an infinite length. I tell MediaPlayer that its data source should basically be something like "http://localhost/myfile.mp3". I've a simple server set up that waits for MediaPlayer to make this request. However, MediaPlayer isn't very cooperative. At first, it makes an HTTP GET and tries to grab the whole file. It times out if we try and simply dump data into the socket so we tried using the HTTP Range header to write data in chunks. MediaPlayer doesn't like this and doesn't keep requesting the subsequent chunks.

有没有人成功地将数据直接流式传输到 MediaPlayer 中?我是否需要实现 RTSPShoutcast 服务器?我是否只是缺少一个关键的 HTTP 标头?我应该在这里使用什么策略?

Has anyone had any success streaming data directly into MediaPlayer? Do I need to implement an RTSP or Shoutcast server instead? Am I simply missing a critical HTTP header? What strategy should I use here?

推荐答案

HTTP 服务器确实托管在手机本身上.这是非常简单:只是一个 thread 监听 HTTP GET 的套接字要求.当它收到 HTTP 请求时,它会创建一个 new socket,写回一些 HTTP 标头并开始转储 MP3 音频数据回到 socket.这个 HTTP 服务器没有做任何其他事情.

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.

Android 媒体播放器 正在播放音乐,因为我正在播放它.Media Player 如果它的播放 buffer 表现很差在播放音频时被清空.这对我来说非常重要确保我的 HTTP 服务器不断将数据写入该 socket.一世将字节以小块 (10 kB) 的形式移动到套接字中.我的标题HTTP 响应最终看起来像这样:

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
");
sb.append( "Content-Type: audio/mpeg
");
sb.append( "Connection: close
" );
sb.append( "Accept-Ranges: bytes
" );
sb.append( "Content-Length: " + totalFileSize + "
" );
sb.append( "Content-Disposition: inline; filename=xxxxx.mp3

");

只要我一直在点燃管道,Android Media Player 就会一直保持毫无怨言地消费它.播放音频只需要一个请求和响应.结果效果很好.

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.

这篇关于流式传输到 Android MediaPlayer的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆