
从2017年开始国外智能音箱的热潮席卷到国内,各大小厂商都推出了智能音箱,主要有阿里的天猫精灵京东的叮咚和小米的小爱同学等。我也在去年双11入手了一款智能音箱(天猫精灵),体验下来总体感觉还是不错的,我相信这股热潮在今年(2018)会愈演愈热。有报道说美国的青年有了智能音箱后对手机的依赖度有所下降,即有些事情可以通过智能音箱解决了,这种现象在国内也会出现。智能音箱是在无线音箱的基础上加上人工智能(AI)发展起来的。几年前无线音箱也火过,推出了好多产品,有基于bluetooth的,也有基于WiFi的。基于bluetooth的是主流,基于WiFi的不多,但是现在智能音箱都是基于WiFi的。那时我还在芯片公司,我们team的语音解决方案已经做得很成熟,老板就让我们用自己公司的芯片做主芯片,开发一个基于WiFi的无线音箱解决方案。
无线音箱先由手机去配置连到某个无线路由器上,手机也连到这个无线路由器上, 这样手机上的音乐播放器就可以把音乐在无线音箱上播放了。既可以把手机本机上的歌曲推送到音箱上播放,也可以把云端的歌曲推送到音箱上播放。支持的协议有DLNA和Airplay,主流的音乐播放器(QQ音乐/酷狗音乐/网易云音乐等)均支持,也支持苹果的音乐播放器(Airplay)。支持的音乐格式很多,有MP3/AAC/OGG/APE/WMA/ALAC/FLAC等,支持音乐双声道立体声播放,但是在一个音箱上效果不明显。如果有两个这样的音箱,又用上公司开发的相应的音乐播放APP,可以把左声道的数据推送到一个音箱上,右声道的数据推送到另一个音箱上,产生较强的立体声效果。
无线音箱的软件实现是在openWrt上开发的,这样无线相关的软件全都好了,我们只要开发音频相关的软件。音频相关的绝大多数是基于开源的开发,协议的DLNA用的是sharepoint,AirPlay用的是gmediarender,音乐格式解析及解码等用的是FFMPEG,音频的播放用的是ALSA。Sharepoint和gmediarender基本上是拿来用,在接口上改了一点点,调用我们做好的API实现与我们自己软件的通信。FFMPEG主要是增加decoder,同时还要对decoder优化使其能流畅的运行。我们自己的软件就是搭一个框架(实现一个process)把这些开源实现给串起来,形成一个无线音箱音乐播放方案。解决方案的软件框图如下:

我们实现的process叫mediaplay, 它与协议(DLNA/AirPlay)之间通过share memory通信,从而实现音乐的播放暂停停止等。Mediaplay会调用FFMPEG提供的API去解析音乐格式,并一帧一帧的解码得到PCM数据放进ring buffer中,然后用mutex block住mediaplay。Mediaplay向ALSA注册了回调函数,每隔一帧时长就会被调用一次,取走ring buffer中一帧PCM数据,并解锁mutex使mediaplay继续循环运行去解码下一帧。在一首歌开始解码时一般会缓存若干帧在ring buffer中然后才使能播放,这样做虽然增加了一两百毫秒的delay,但是保证了播放时的连续流畅性,不会出现噪声。再说音乐播放是非实时业务,一两百毫秒的delay对用户是不敏感的。

我们team共4人。手机播放器哪个好用一人负责ALSA(成了要找开源首先去GitHub的习惯。给GitHub打广告了,哈哈)。
本文来自电脑杂谈,转载请注明本文网址:
http://www.pc-fly.com/a/bofangqi/article-66707-1.html
杨洋加油
不要闹事