自己搭建Airplay高清音乐播放系统

先看一下在iPhone 6 plus上用虾米播放高音质音乐的效果:

Airplay

pcDunio Acadia

苹果的Airplay协议是通过基于RSTP(Real Time Streaming Protocol)协议通过UDP传输的无损编码音频流(Apple Lossless codec,音频流本身经过了AES加密,私钥是不公开的,这样只有苹果和其合作伙伴才能使用这个协议。但是2004年有人通过逆向工程获得了私钥并将其公开,这样我们也可以自己搭建低成本高音质的基于Airplay的音乐系统。在iPhone成为街机的时代,每个人的手机里有很多喜欢的音乐,如果在家里可以通过无线网络在音响系统里播放会方便很多。

硬件

  1. pcDunio Acadia 或 Raspberry Pi 一只
  2. 3.5mm音频线一根,类似这种
  3. 有源音箱一对
  4. 网线一根或USB无线网卡一只

音频芯片

好的音质需要好的音源,无损音乐加好的前端输出是必不可少的。 pcDuino Acadia集成的音频芯片是业界领先的英国Wolfson(欧胜微电子)为高清音频设计的WM8962 。树莓派集成的音频芯片则是由美国Broadcom(博通)封装在主芯片BCM2835里通过PWM (pulse-width modulation) 提供的,比较简单音质一般,达不到高清音频的要求。

下面是树莓派音频口播放1kHz正弦信号的输出波形,可以看出来波形并不好。 raspberry pi audio


raspberry pi audio2

正是因为板载音频质量差强人意,Wolfson也专为树莓派设计了基于WM5102 codec芯片的Wolfson Audio Card (售价高达$34.95,性价比不高,这块芯片也用在了魅族MX3上)。 Wolfson Audio Card

更好的方案是使用USB声卡,如淘宝上可以购买的基于德州仪器的PCM2704USB声卡,40多人民币。

PCM2704 USB DAC

综上,如果想DIY自己的高清音乐播放系统,只有树莓派还是不够的,可以考虑用pcDunio Acadia或额外购买USB DAC。

声音测试和调节

声音测试

首先需要用音频线把板子和有源音箱连接起来,如果线材或音箱质量不够好,会立刻听到背景噪音,实测树莓派的背景噪音比pcDuino Acadia要大一些。

注:普通用户不一定有权限使用系统音频设备,所以以下测试需要root或audio group里的用户。

首先可以用speaker-test命令测试是否能出声。

hugo@raspberrypi2 ~ $ sudo speaker-test 
speaker-test 1.0.25

Playback device is default
Stream parameters are 48000Hz, S16_LE, 1 channels
Using 16 octaves of pink noise
Rate set to 48000Hz (requested 48000Hz)
Buffer size range from 512 to 32768
Period size range from 512 to 32768
Using max buffer size 32768
Periods = 4
was set period_size = 8192
was set buffer_size = 32768
 0 - Front Left
Time per period = 2.234240
 0 - Front Left
Time per period = 2.899088
 0 - Front Left

如果听不到声音,可以检查一下连接和系统设置:

树莓派的命令输出:

hugo@raspberrypi2 ~ $ sudo aplay -l
**** List of PLAYBACK Hardware Devices ****
card 0: ALSA [bcm2835 ALSA], device 0: bcm2835 ALSA [bcm2835 ALSA]
  Subdevices: 8/8
  Subdevice #0: subdevice #0
  Subdevice #1: subdevice #1
  Subdevice #2: subdevice #2
  Subdevice #3: subdevice #3
  Subdevice #4: subdevice #4
  Subdevice #5: subdevice #5
  Subdevice #6: subdevice #6
  Subdevice #7: subdevice #7
card 0: ALSA [bcm2835 ALSA], device 1: bcm2835 ALSA [bcm2835 IEC958/HDMI]
  Subdevices: 1/1
  Subdevice #0: subdevice #0

pcDunio Acadia的命令输出:

    Hardware device with all software conversions
hugo@Acadia ~ $ sudo aplay -l
**** List of PLAYBACK Hardware Devices ****
card 0: wm8962audio [wm8962-audio], device 0: HiFi wm8962-0 []
  Subdevices: 0/1
  Subdevice #0: subdevice #0
card 1: imxhdmisoc [imx-hdmi-soc], device 0: IMX HDMI TX mxc-hdmi-soc-0 []
  Subdevices: 1/1
  Subdevice #0: subdevice #0

如果你安装了USB声卡,还需要设置系统把USB声卡设置成缺省声卡。

sudo vi /etc/modprobe.d/alsa-base.conf

修改

options snd-usb-audio index=-2

#options snd-usb-audio index=-2  
options snd-usb-audio nrpacks=

有些系统可能还需执行下一步(注:树莓派2不需要)

sudo vi /usr/share/alsa/alsa.confpcm.front cards.pcm.front 替换成pcm.front cards.pcm.default

测试音乐播放

下载一个mp3文件在pcDunio或树莓派上,然后安装mpg321

sudo apt-get install mpg321

执行mpg321 example.mp3就可以测试音乐播放了

音量调节

可以执行sudo alsamixer来设置音量,执行sudo alsactl store 0恢复出厂设置。

对比一下可以看到pcDunio Acadia的设置项要丰富多了,除了Headphone这项可以提高音量(5dB)外,Digital这项的增益调节也可以大幅提高音量(23.25dB)。推力方面也相对好多了,可以直推一些好耳机。

pi

pcDunio

Airplay设置

这里我们使用开源的Airplay解码软件Shairport

安装依赖库

sudo apt-get install git libao-dev libssl-dev libcrypt-openssl-rsa-perl libio-socket-inet6-perl libwww-perl avahi-utils libmodule-build-perl libasound2-dev libpulse-dev

下载代码,编译安装

root@Acadia ~ $ git clone https://github.com/abrasive/shairport.git  
root@Acadia ~ $ cd shairport  
root@Acadia ~ $ ./configure  
Configuring Shairport  
OpenSSL found  
libao found  
PulseAudio found  
ALSA found  
Avahi client found  
getopt.h found  
CFLAGS: -D_REENTRANT -I/usr/include/alsa -D_REENTRANT  
LDFLAGS: -lm -lpthread -lssl -lcrypto -lao -lpulse-simple -lpulse -lasound -lavahi-common -lavahi-client  
Configure successful. You may now build with 'make'  
root@Acadia ~/shairport $ make  

pcDunio Acadia上还需要执行这一步:

root@Acadia ~ $ git clone https://github.com/njh/perl-net-sdp.git perl-net-sdp  
root@Acadia  ~ $ cd perl-net-sdp  
root@Acadia  ~/perl-net-sdp $ perl Build.PL  
root@Acadia  ~/perl-net-sdp $ sudo ./Build  
root@Acadia  ~/perl-net-sdp $ sudo ./Build test  
root@Acadia  ~/perl-net-sdp $ sudo ./Build install  
root@Acadia  ~/perl-net-sdp $ cd ..

运行Shairport

运行非常简单:

sudo shairport -a "Acadia"

执行完后拿起你的iPhone,虾米,QQ音乐或百度音乐App都支持Airplay了,在播放界面上选择输出到Acadia上就可以开始欣赏Airplay啦。

参考文章

  1. http://www.crazy-audio.com/2013/11/quality-of-the-raspberry-pi-onboard-sound/
  2. http://drewlustro.com/hi-fi-audio-via-airplay-on-raspberry-pi/
  3. http://raspberrypihq.com/how-to-turn-your-raspberry-pi-into-a-airplay-receiver-to-stream-music-from-your-iphone/

See also