随着电子产品的飞速发展,广播电台几乎已经远离了人们的娱乐生活,但是近年来由于网络电台的兴起,广播电台又逐渐有了市场,手机上如果有一个网络电台软件,使用率应该是比较高的。目前的主流智能手机平台中,iphone和symbian都已经有了这类软件,android平台虽然推出的时间不是很长,但是也已经有这类软件了,最近我也正在Android上做这方面的工作,下面就把我的一些经验介绍一下。
网络电台种类
目前的网络电台网站一般是基于以下三种协议的:
mms、rtsp、http
其中mms是微软公司提出的网络流媒体协议,通常采用wma格式的文件,Android现在还不支持这种协议,也不支持wma格式,原因比较明显,竞争对手嘛。
rtsp是RealNetworks公司提出的,Android是支持这种协议的,但是这种协议通常采用rm格式的文件,Android是不支持的。
http协议Android是肯定支持的,而且这种协议一般采用mp3的文件格式,Android也支持。
综上,我们要在Android上开发网络电台软件,那么只能选择http协议mp3格式的网络电台网站,这样的网站主要包括shoutcast和icecast两大类。这两类有微小差别,基本上是相同的,下面主要以shoutcast为主进行说明。
MediaPlayer
熟悉Android的人可能都知道有MediaPlayer这样一个类,用于媒体播放,而且这个类是支持流媒体播放的,这个类支持的协议包括rtsp、http等,但是我们还不能直接用这个类来播放网络电台,主要有两个原因:
1.上面提到的shoutcast电台并不是直接采用http协议,MediaPlayer无法正常连接到shoutcast电台
2.MediaPlayer能够正常解析的URL必须是http://............/*.*的形式,也就是说url中必须包括文件名,shoutcast电台的url不符合这样的形式.
因此需要做一些转换的工作。
shoutcast协议
上面已经提到,shoutcast网络电台是采用http协议的,其实这种说法并不准确,shoutcast电台采用的是shoutcast协议,这种协议与http略有不同,客户端与服务器间通讯过程如下:
向服务器发送GET请求,内容如下:
HTTP/1.0/r/n
User-Agent:AndroidInternetRadio/r/n
Accept:audio/mpeg/r/n/r/n
服务器端返回如下:
ICY 200 OK/r/n (signifying that the server was successful)
icy-notice1:<BR>This stream requires <ahref="http://www.winamp.com/">Winamp</a><BR> (redundant notice)
icy-notice2:SHOUTcast Distributed Network Audio Server/posix v1.x.x<BR> (tells the client what server it is and version)SHOUTcast Specific
icy-name:Unnamed Server/r/n (Name of the server)
icy-genre:Unknown Genre/r/n (what genre the server falls under)
icy-url:http://www.shoutcast.com/r/n (homepage for the server)
Content-Type:audio/mpeg/r/n (Content type of the stream to follow)
icy-pub:1/r/n (whether the server is public or not)
icy-br:56/r/n (bitrate of the server)
icy-metaint:8192/r/n (if icy-metadata:1 was signified this was shown I will discuss this further later)
/r/n (end of header)
At this point the server begins sending the audio data(从这里开始发送音频数据).
可以看出ShoutCast服务器的Reponse与通常的HTTP协议不同,因此直接以HTTP协议方式进行连接不能够成功,需要自己写一套对应ShoutCast协议的处理。
上面介绍了一些相关的知识,下面介绍一下软件结构,如下图:
Activity App画面部分代码
SC Client 通过shoutcast协议连接网络电台,获取电台音频数据流
HTTP Server 提供http连接,将SCClient接收到的音频数据转发给MediaPlayer类
MediaPlayer 音频播放类,通过访问http://127.0.0.1/a.mp3:port 与HTTPServer建立连接获取数据流
RadioServer 网络电台服务器
在Android上开发网络收音机,核心部分在于将shoutcast协议的数据流转换为MediaPlayer类可播放的形式,也就是上图中的SCClient和HTTPServer,本文只是介绍了大体实现方案,具体编码中还会有一些细节问题(例如MediaPlayer连接HTTPServer时,需要有一个contentlenth,这个值应该指定为无穷大)需要解决。
分享到:
相关推荐
简析Android语音助手开发的一种实现方案.pdf
Android实现电子书阅读器实现方案文档,这是一篇毕业设计,写的挺好的,想写阅读器的可以参考下
Android应用自动更新代码实现,完美实现代码的自动更新。
android Gridview分页实现的一个小例子
该资源包含了一个android实现的简单的应用锁,喜欢的下载。
一个简单的android欢迎界面实现,用于在程序启动时添加欢迎动画,使得程序更炫。简单而使用。
android ping实现android ping实现android ping实现android ping实现android ping实现
在Android Studio中file->import setting 选择解压目录下的Monokai-Sublime.jar,勾选导入color scheme 然后可能需要重启。(在导入monokai配色方案之前先将主题设为darcula,darcula的暗色背景配monokai的鲜艳色彩...
一行代码,超简单实现,Android加载网络Gif闪图,真的只要一行哦~
android简单方式实现listview顶部悬浮将
这是一款android的画图板实现代码,基本功能齐全,适合初学者开发的例子程序。
我的Android进阶之旅------>Android自定义View来实现解析lrc歌词并同步滚动、上下拖动、缩放歌词的功能 http://blog.csdn.net/ouyang_peng/article/details/50813419 1、实现歌词同步滚动的功能,即歌曲播放到哪句...
想要了解喜马拉雅功能朋友们,可以作下参考,里面的key和私钥可以用的,代码可以直接运行
Android通过socket套接字实现网络连接,通过ip地址和ip端口实现访问服务器,从而实现客户端和服务器的连接,然后实现两者数据的互连
Android拒绝来电的实现Android拒绝来电的实现Android拒绝来电的实现Android拒绝来电的实现Android拒绝来电的实现Android拒绝来电的实现Android拒绝来电的实现Android拒绝来电的实现
Android实现个人中心列表效果,以及个人中心的圆形图像和磨砂头像背景,Android实现个人中心列表效果,以及个人中心的圆形图像和磨砂头像背景Android实现个人中心列表效果,以及个人中心的圆形图像和磨砂头像背景
本课题要求学生完成一款计算器,从而了解基于android平台如何开发app应用,了解常见UI控件如何使用。 具体实现要求: Android计算器实现,支持加、减、乘、除、回退、清空等。 要求如下: 1、 支持加、减、乘、除、...
android三种方式实现TextView跑马灯效果
一个小型的网络监测工具,项目不大,基本实现了上述4项功能。 Http 主要监控网络的速度,时延 Ping 测量发包、丢包、发送时延等数据 Rssi 扫描周边的AP信息,并展示出来 Ftp 实现Ftp客户端的上传和下载,如需使用此...