流到Android的MediaPlayer [英] Streaming to the Android MediaPlayer

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

问题描述

我想在我的应用程序编写轻量 HTTP 服务器饲料动态生成 MP3 数据传送到内置的安卓 的MediaPlayer 。我不允许我的存储在 SD卡上的内容

我的输入数据基本上是一个无限长的。我告诉的MediaPlayer ,其数据来源应该基本上是这样的HTTP://localhost/myfile.mp3。我已经建立了一个简单的服务器等待的MediaPlayer 提出这项要求。然而,的MediaPlayer 不是很合作。首先,它使一个 HTTP GET ,并试图抓住整个文件。超时,如果我们试图和简单的数据转储到插槽,所以我们尝试使用 HTTP Range头写入数据在块。 的MediaPlayer 不喜欢这一点,不守请求后续块。

有没有人有任何成功的数据流直接进入的MediaPlayer ?我是否需要实施 RTSP 的Shoutcast 服务器呢?难道我只是缺少一个关键 HTTP头?我应该在这里使用?

什么策略
解决方案
  

HTTP 服务器确实举办了手机本身。这是非常   简单:只需一个线程监听套接字为 HTTP GET   请求。当它得到了 HTTP 请求时,它会一个新的socket ,   回写一些 HTTP 头,并开始倾倒的 MP3 音频数据   回到插槽。这 HTTP 服务器没有做任何事。

     

Android的媒体播放器正在播放的音乐,因为我是分流到   它。该媒体播放器表现得非常糟糕,如果其播放缓存   而它播放音频被掏空。这是非常重要的,我   以确保我的 HTTP 服务器保持数据写入到该插槽。一世   移动的字节插入插座小块(10 KB)。在标头我    HTTP 响应结束这样看:

  //生成响应头
StringBuilder的SB =新的StringBuilder();
sb.append(HTTP / 1.1 200 OK \ r \ N);
sb.append(内容类型:音频/ MPEG \ r \ N);
sb.append(连接:关闭\ r \ N);
sb.append(接受范围:字节\ r \ N);
sb.append(内容长度:+ totalFileSize +\ r \ N);
sb.append(内容处置:内联;文件名= xxxxx.mp3 \ r \ñ\ r \ N);
 

     

只要我不停的管火上浇油,在 Android的媒体播放器保存   消费它毫无怨言。播放音频唯一所需的一个   请求和响应。它结束了工作pretty的好。

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.

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.

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?

解决方案

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.

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

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