Spotify – Spotify connect 和vobis音频解码研究

摘要:spotify是全球最大的正版流媒体播放平台,2016年的CES展上,sony、harman、philips等公司推出了一系列嵌入spotify的音响,试图给用户提供一种无缝的、高品质的音乐体验。本文重点研究了spotify中的连接协议spotify connect和ogg vorbis的协议栈及相关的实现流程,以期帮助应用开发者快速的掌握spotify的嵌入式开发。

关键词:spotify; Spotify connect; ogg vorbis; wifi音响

 

1、  引言

        Spotify是全球最大的正版流媒体音乐服务平台,2008年10月在瑞典的斯德哥尔摩由Daniel Ek和Martin Lorentzon两人共同创建。Spotify提供的服务分为带广告的免费版本和不带广告的付费版本,付费用户可以享受到更高音质的音乐,获得更多的音乐播放列表。截至到2015年6月,spotify已经拥有超过7500万用户,其中2000万为付费用户。

        Spotify已经得到华纳音乐、索尼、百代等全球几大唱片公司的支持,其所提供的音乐都是正版的,不过spotify只提供在线的收听,不能下载音乐。同时由于spotify是通过IP识别访问者所在的国家,目前只有中国香港的用户可以注册,暂未进入大陆市场。Spotify这款软件可以运行在linux,os,windows,android等多种操作系统上,与苹果的iTunes相比,操作更加流畅简洁,有更多的可选择曲目,因此广受欢迎。

        本文重点关注如何将spotify嵌入到音响产品上,所涉及的核心技术包括spotify connect和ogg vorbis q5 codec音频编解码技术。集成了spotify的音响可以被手机端的app搜索并连接上,更重要的是通过spotify connect可以方便的将多个音响组合在一起,实现整个家中无缝、高质量流媒体音乐播放。在音频编解码上采用的ogg vorbis q5 codec技术可以提供高达160kb/s的传输速率,spotify的预付费用户可以享受到ogg vorbis q9的320kbit/s的传输速率。

2、  Spotify connect技术

        Spotify connect技术于2013年9月正式发布,其目的是方便用户将spotify服务器上的音乐无缝串流到手机,平板,电视,音响等智能终端上。Spotify connect是基于wifi的无线通信技术,它简化了智能设备连接到spotify服务器的方式,即只需要有一台智能终端通过用户名和密码的方式登录到spotify服务器上,其他的智能终端就可以通过该终端直接连接到spotify服务器上。

        以spotify音响为例,用户通过手机端spotify app上的spotify connect可以搜索到局域网范围内的可连接的所有音响,点击连接后就可以将相应的音响添加到远端spotify服务器上。点击手机端的播放歌曲,所有连接的音响就可以同时播放音乐。如果此时手机离开房间或者正在打电话,speaker上的音乐也不会停止,因为音乐是直接从远端spotify服务器上获取,手机只是充当一个远程控制器的作用。如图1所示是用户连接spotify 音响的示意图。


图1 用户连接spotify音响示意图

2.1 spotify connect协议栈

        Spotify connect协议是由spotify公司自己定制的专用协议,目前该协议的SDK并未开源,只向用户提供了API函数[12],其协议的实现对开发人员来说是透明的,因此让诸多的开源爱好者为之着迷,试图解开该协议的神秘面壳。最有影响力的当属MIT的研究人员在KODI上发起的reversing Spotify connect protocol[1],该项目由全世界的开源爱好者协作破解spotify connect协议,目前已有相关的可用代码发表在该网站上,破解工作还在进行中。

        本文结合reversingSpotify connect protocol项目的破解结果和搜集到的开发资料,总结出在嵌入式linux系统中spotify connect协议实现的基本架构,如图2所示。从图中可以看出该协议栈自上而下是由http协议, mongoose技术[2],zeroconf协议[3]中的linux public-avahi技术[4]和封闭的Libspotify_embeded_shared.so构成,搭建在linux系统上驱动硬件的网卡完成连接工作。


图2 spotify connect协议基本架构

        如图3所示是speaker与spotify服务器通信时所用到的各协议层。从图中可以看出Spotify connect协议中数据交换的载体是http协议[5],该协议是计算机网络中常用的应用层协议,在分布式超媒体信息系统中最为常用,支持客户/服务器模式。为了解析http协议,架构中采用了mongoose技术,mongoose是一款轻量级嵌入式Web Server,是由Cesanta公司的创始人CTO Sergen Lyubka开发,它采用事件驱动界面,帮助开发者方便的完成网络协议的解析,管理等工作,在开源平台github上可以看到部分开源的代码[6]

        Spotify connect协议中的服务发现采用的是zeroconf协议,该协议全称为zero configurationnetworking,即零配置网络服务规范,是一种用于自动生成可用IP地址的网络技术,不需要额外的手动配置和专属的配置服务器。协议的实现有apple的Bonjour和开源的Avahi,这两者在程序的接口上是可以兼容的。在嵌入式linux系统中,spotify connect采用的是public-avahi发现局域网范围内的可发现设备,该系统的实现是基于zeroconf中mDNS/DNS-SD协议,相关的开源代码可以在网站[7]中下载。 

                                                                                 

图3 speaker与spotify服务器通信协议栈

2.2 spotifyconnect 服务发现与连接实现

        上一节中重点介绍了spotify connect实现的协议栈,本节以一款嵌入spotify的音响为例,说明如何借助spotify的服务发现协议,实现音响连接到远端spotify服务器上。

        如图4所示是整个发现和连接的状态图,从图中可以看出,在音响和远端spotify服务器连接的过程中,手机端实际上只起到一个远端交互控制的功能。手机和音响之间并不是通过wifi直连方式进行通信,在连接初始时,手机和音响需要借助wifi路由器同时连接到同一个局域网内,然后手机通过输入用户名和密码的方式登录到远端的spotify服务器,此时开启手机端spotify connect搜索功能,就可以搜索到局域网范围内的可发现音响。如果音响设备想登录到spotify服务器,就需要手机将音响连接所需要的clientKey,userName和blob信息发送给音响端,音响就可以借助这三个信息直接登录到spotify服务器,而无须像手机端连接时需要用户输入登录信息。登录成功后的信息,会由spotify服务器反馈到手机端进行显示,在用户看来就像是手机和音响直连一样。


图4 spotify connect连接状态图

3、  Ogg Vorbis音频解码技术

        spotify本质上是一个音频传输的平台,所以音频的编解码技术就显得极为重要。在spotify中采用的是oggvorbis q5和q9两种音频压缩格式。Vorbis是一种音频压缩方式的名字,而ogg则是一个计划的名字,该计划试图设计一个完全开放性的多媒体系统。Ogg vorbis类似于mp3,是一种有损的音频压缩方式,但是由于使用了更加先进的声学模型去减少损失,同样位速率编码的ogg和mp3相比听起来更好一些[8],而且它支持多声道、完全免费、开放和没有专利限制。

3.1 spotify vorbis音频解码协议栈


图5 ogg vorbis音频解码协议栈

        如图5所示是嵌入式linux音响上实现ogg vorbis接收,解码和播放时所需要协议及技术。其中ogg vorbis的传输采用RTP协议,因为vorbis数据包没有提供帧格式、同步及错误保护等,所以需要能够提供这些服务的RTP传输机制,关于包的格式可以参见[9]。接收到RTP包后,就可以依据ogg vorbis的解码算法进行解码,相关的开源代码参见网站[10],解码后的vorbis包可以转换成pcm数据。在linux中通常采用linux-alsa驱动声卡工作,ALSA是AdvancedLinux Sound Architecture的缩写,目前已经成为了linux的主流音频体系结构,更多的开源信息及代码可以参见网站[11]。

        如图6所示是spotify vorbis音频解码播放流程,从图中可以看出被接收的音频包含着rtp包头和vorbis包头等相关信息,需要将有效数据从包中解析成pcm数据,放入环形缓冲池中,然后驱动声卡工作,从环形缓冲池中取出pcm数据,播放音乐。


图6 spotify vorbis音频解码播放流程图

3.2spotify 音频操作

        在spotify中的音频控制有远程控制和本地控制两种方式,特别是远程控制音频的功能是一个重要特点。如图7所示是远程控制音频暂停的状态图。当用户在手机端app点击暂停音乐后,暂停指令会发送给云端的spotify服务器,spotify服务器接收到暂停指令后会暂停音乐播放,同时发送暂停事件给到音响,驱动音响暂停声卡工作。


图7 远程控制spotify音响音频暂停

        本地的暂停过程相对来说要复杂些,如图8所示,用户单击音响上的暂停按键后会发送音乐暂停指令给到spotify服务器,服务器受到指令后会发起三个动作首先是暂停音频播放,然后将暂停消息反馈给手机端,指示音乐已经暂停,最后需要发送暂停事件给到音响,驱动声卡暂停工作。

 

图8 本地控制spotify音响音频暂停

 

4、  总结

        本文重点介绍了嵌入式spotify 中两个核心的技术spotify connect和ogg vorbis。spotify connect是服务发现协议,主要实现spotify嵌入式设备间的无缝连接,ogg vorbis则是spotify音响设备需要支持的音频解码格式。通过对这两项技术的协议栈和状态流程方面的深入解析,能够帮助开发人员理解嵌入式spotify技术的整个架构,所提供开源代码地址可以帮助开发人员快速的实现代码移植,完成一个简单的嵌入式spotify开发。

参考文献:

[1] http://forum.kodi.tv/showthread.php?tid=221145

[2] https://en.wikipedia.org/wiki/Mongoose_(web_server)

[3] https://en.wikipedia.org/wiki/Zero-configuration_networking

[4] https://en.wikipedia.org/wiki/Avahi_(software)

[5] https://en.wikipedia.org/wiki/HTTP/2

[6] https://github.com/cesanta/mongoose

[7] http://avahi.org/

[8] 阎建新,董在望,窦维蓓.OggVorbis数字音频编码技术[J].电声技术,2003年第09期.

[9] https://svn.xiph.org/trunk/vorbis/doc/rfc5215.txt

[10] http://svn.xiph.org/trunk/vorbis/

[11] http://www.alsa-project.org/main/index.php/Main_Page

[12] https://developer.spotify.com/technologies/libspotify/

 

  • 1
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值