我需要播放实时音频流,实际上它是无线电 . 问题是我还需要管理20分钟的流量缓冲区 . 据我所知,用android实现起来并不容易 .
首先我检查了MediaPlayer,但它没有提供任何缓冲区管理方法 . 实际上你甚至无法直接设置缓冲区大小 .
其次,我尝试使用本地文件管理缓冲区:逐步将流下载到临时文件并切换它们 . 但是当您想切换到以下文件(在MediaPlayer中更改数据源)时,音频不会连续播放 . 你可以听到短暂的中断 .
最后一个想法是使用流代理 . 通常它用于在8以下的Android版本中播放流 . 在流代理中,您创建ServerSocket,从音频流中读取并写入播放器 . 所以实际上我可以在那里管理缓冲 . 我可以缓存流并写入MediaPlayer,无论我想要什么 . 但 . 它不适用于Android 8 .
我得到异常:通过对等java.net.SocketException重置连接:由peer重置连接 . MediaPlayer 8不想从套接字读取数据 .
因此,我有两个问题:1)实现流缓冲的其他方法是什么? 2)如何为Android 8改编StreamProxy?
任何想法都表示赞赏 .
谢谢
5 回答
我使用与NPR项目相同的StreamProxy - https://code.google.com/p/npr-android-app/source/browse/Npr/src/org/npr/android/news/StreamProxy.java
所以它获得原始音频流:
并从此流写入客户端套接字:
(您可以从上面的链接获取完整的代码 . )
最后他们如何初始化播放器(PlaybackService):
所以他们检查SDK版本 . 但是,如果我省略此检查并使用SDK 8的代理,我会得到一个例外 . 奇怪的是MediaPlayer甚至没有尝试读取流:
似乎MediaPlayer变得更加聪明 . 如果我通过这样的网址
"http://127.0.0.1:%d/%s"
它不仅要获得字节而且还要"full" http响应 .另外我想知道是否有其他方法实现缓冲?据我所知,MediaPlayer只使用文件和网址 . 文件解决方案不起作用 . 所以我必须使用socket进行流传输 .
谢谢
我刚刚测试了以下修复程序,它可以工作 . 此问题是由
StreamProxy
的processRequest()
方法中的标头中使用的 "\n" 引起的 . 将此更改为 "\r\n" 应该会使错误消失 .至于实现自定义流媒体,我过去曾经使用过它,虽然它似乎主要用于无限流媒体广播 . http://blog.pocketjourney.com/2009/12/27/android-streaming-mediaplayer-tutorial-updated-to-v1-5-cupcake/
当您寻找或跳过或连接丢失且MediaPlayer不断重新连接到代理服务器时,您必须在从客户端获取请求和范围(int)后将此响应发送到状态206 .
当您从MediaPlayer收到HTTP标头中不包含Range的请求时,它会请求新的流文件,在这种情况下,您的响应标头应如下所示:
请享用!
SDK 8中的Mediaplayer将无法读取代理URL . 但根据我目前的工作,这与设备不同 . 在我的Samsung ACE(SDK 8)中,代理连接工作正常,但在我的HTC Incredible S中,代理连接会产生与您相同的问题 . 与音频流的直接连接工作正常,但这会导致某些设备(如sprint上的EVO)出现blips和boops .
你有没有解决这个问题?你是怎么处理的?
-Hari
我意识到这个问题就像5岁一样,但是如果有其他人在徘徊:ExoPlayer是谷歌的库,可以让你更多地控制缓冲区大小等选项 .
这是我创建的一个小项目,用于学习如何使用它 . https://github.com/feresr/MyMediaPlayer
http://developer.android.com/guide/topics/media/exoplayer.html https://github.com/google/ExoPlayer