阳光网驿-企业信息化交流平台【DTC零售连锁全渠道解决方案】

 找回密码
 注册

QQ登录

只需一步,快速开始

扫描二维码登录本站

手机号码,快捷登录

老司机
查看: 1232|回复: 0

[转帖] Android网络电台的一种实现方案

[复制链接]
  • TA的每日心情
    开心
    2012-3-7 10:15
  • 签到天数: 11 天

    [LV.3]偶尔看看II

    发表于 2012-1-7 09:39:21 | 显示全部楼层 |阅读模式
    随着电子产品的飞速发展,广播电台几乎已经远离了人们的娱乐生活,但是近年来由于网络电台的兴起,广播电台又逐渐有了市场,手机上如果有一个网络电台软件,使用率应该是比较高的。目前的主流智能手机平台中,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,这个值应该指定为无穷大)需要解决。

    楼主热帖
    启用邀请码注册,提高发帖质量,建设交流社区
    您需要登录后才可以回帖 登录 | 注册

    本版积分规则

    快速回复 返回顶部 返回列表