『瀚思彼岸』» 智能家居技术论坛

 找回密码
 立即注册
查看: 5637|回复: 8

[新奇玩法] 跟着上手树莓派(三)—— 让你的有线音箱从此无拘无束

[复制链接]

14

主题

156

帖子

858

积分

论坛技术达人

积分
858
金钱
702
HASS币
0
发表于 2018-3-15 12:14:30 | 显示全部楼层 |阅读模式

自我介绍

笔者系计算机系在校生,搞机生涯丰富,强迫症患者,喜欢自己给自己找事,想尽办法让生活过的方便一丢丢,多年果粉 & Nexus 粉一枚,未来的码农,目前深陷 Apple Loop 无法自拔。

上一期:跟着上手树莓派(二)—— SSH & VNC 连接


前言

截至目前,你应该拥有了一块正常运行的树莓派,掌握了与他互动的两种方式(SSH 以及 VNC),本期让我们开始搞一个小东西,一款名叫 Shairplay 的应用。它可以让你的有线老音箱与树莓派结合,瞬间变成一款支持 AirPlay 的智能 Wi-Fi 音箱,你的 iOS 设备在家中可以无缝连接到同一音箱上,就像下图所示:


                               
登录/注册后可看大图
macOS 上可以按住 Option,点击音量,选择把音频从音箱输出。


                               
登录/注册后可看大图
iOS 上也可以在音乐界面或控制中心里选择从音箱输出。1. 更换软件源

刚才说过,这个功能的实现是通过一款叫做 Shairplay 的应用来实现的,我们可以直接在树莓派从软件源上下载安装该应用,但由于树莓派默认的软件源是国外的服务器,访问较慢,所以在开始之前我们把软件源更改为阿里云提供的高速镜像源。(必须感谢下阿里爸爸)

① SSH 登录至树莓派,输入 nano /etc/apt/sources.list。

② 将文件按下图修改:(注意将原来的 deb-src 那一行的行首加一个 "#" 来注释掉原来的源)

阿里云镜像源:

deb http://mirrors.aliyun.com/raspbian/raspbian/ jessie main non-free contrib
deb-src http://mirrors.aliyun.com/raspbian/raspbian/ jessie main non-free contrib

③ 然后按 Ctrl + O,回车,Ctrl + X,保存退出。

④ 最后输入 sudo apt-get update && apt-get upgrade -y 更新,可以看到此时连接的速度已经快到飞起了,待更新完毕,继续下面的教程。

2. 安装 Shairplay

接下来就可以愉快的安装 Shairplay 了,一切根据 Github 上的教程走:

① 依次输入以下命令,安装 Shairplay 和必要依赖:

sudo apt-get install autoconf automake libtool sudo apt-get install libltdl-dev libao-dev libavahi-compat-libdnssd-dev sudo apt-get install avahi-daemon

② 依次输入以下命令,来编译和安装 Shairplay:

git clone https://github.com/juhovh/shairplay.git
cd shairplay
./autogen.sh
./configure
sudo make install

③ 至此,你的 Shairplay 就安装完毕了。

3. 第一次运行 Shairplay

① 确保你在 shairplay 的路径下,输入 shairplay -a Shairplay,看到以下输出,即成功运行:

② 此时使用你的 iOS 设备查找 Airplay 音箱,即可找到你的小音箱。

4. TrubleShoot (噪音问题)

如果你遇到音箱有莫名噪音的问题,除了使用共地滤波器解决一下之外,还可以尝试更改 Audio 的 PWM 模式,修改为图中样子(没有的话就新增),之后重启一下就好了。

5. 设置开机自启

截至目前,一旦我们关闭 SSH 的窗口,音箱就不能再用 Airplay 了。而当我们想使用的时候,也需要手动打开,所以设置开机自动启动就是件必备的事情:

① 建立 shairplay 服务,输入:

cd /etc/init.d/

sudo touch shairplay

sudo nano shairplay

② 开启启动脚本,复制粘贴以下:

#!/bin/bash

#

# This starts and stops shairplay

#

### BEGIN INIT INFO

# Provides: shairplay

# Required-Start: $network

# Required-Stop:

# Short-Description: Free portable AirPlay server implementation similar to ShairPort.

# Description: Free portable AirPlay server implementation similar to ShairPort.

# Default-Start: 2 3 4 5

# Default-Stop: 0 1 6

### END INIT INFO



# Source function library.

. /lib/lsb/init-functions


DAEMON="/usr/local/bin/shairplay"

DAEMON_ARGS="-a Wohnzimmer"  # 这里的 Wohnzimmer 可以替换成你想要的音箱名称

AIRPORT_KEY_DIR="/usr/local/share/shairplay"


[ -x $binary ] || exit 0


RETVAL=0


start() {

echo -n "Starting shairplay: "

start-stop-daemon --start --quiet --chdir $AIRPORT_KEY_DIR \

--exec "$DAEMON" -b --oknodo -- $DAEMON_ARGS

log_end_msg $?

}


stop() {

echo -n "Shutting down shairplay: "

start-stop-daemon --stop --quiet --exec "$DAEMON" \

--retry 1 --oknodo

log_end_msg $?

}


restart() {

stop

sleep 1

start

}


case "$1" in

start)

start

;;

stop)

stop

;;

status)

status shairplay

;;

restart)

restart

;;

*)

echo "Usage: $0 {start|stop|status|restart}"

;;

esac

exit 0

③  依旧 Ctrl+O,回车, Ctrl+X 退出。

④ 输入 chmod +x /etc/init.d/shairplay ,赋予其可执行权限。

⑤ 输入 update-rc.d shairplay defaults ,更新 Shairplay 设置。

⑥ 输入 cd ~ 回到用户目录。

⑦ 输入以下命令,储存 airport.key。

sudo mkdir /usr/local/share/shairplay

sudo cp shairplay/airport.key /usr/local/share/shairplay

⑧ 输入 nano /etc/rc.local,复制以下脚本:

# Don't run multiple instances - start just one screen, named "shairplay":

[[ $(screen -list | grep shairplay) == '' ]] &&

screen -dmS shairplay sh

# Keep shairplay perpetually running. When it crashes, we can just SIGKILL it, and it comes back:

[[ $(ps aux | grep -v grep | grep pts | grep '/usr/bin/shairplay') == '' ]] &&

screen -S shairplay -p 0 -X stuff "while true; do /usr/bin/shairplay --apname=Airamaplay --ao_devicename=default; sleep 2s; done

"

⑨ 粘贴到 exit 0 之前,Ctrl+O,回车,Ctrl+X,退出。

⑩ 输入 reboot,重启,开机就会自动启动 Shairplay 了。

Enjoy it.


我的新浪微博:@Sunbelife,欢迎和我讨论和分享好玩的东西。



附:

1、调整音量,可在树莓派输入:alsamixer 调整。

2、出现:The following packages have unmet dependencies: libavahi-compat-libdnssd-dev 问题可以查看:https://www.douban.com/note/619209826/,如果无法解决,请更换其他软件源。


评分

参与人数 2金钱 +12 收起 理由
weiren526 + 5 在下对你的景仰犹如滔滔长江之水,连绵不绝.
jyz_0501 + 7 分享是一种美德!

查看全部评分

回复

使用道具 举报

175

主题

2956

帖子

7555

积分

超级版主

我就是六神

Rank: 8Rank: 8

积分
7555
金钱
4574
HASS币
398

活跃会员教程狂人灌水之王

QQ
发表于 2018-3-15 14:55:24 | 显示全部楼层
我是沙发吗???第一次坐,这个必须顶~~~~~~
回复

使用道具 举报

34

主题

335

帖子

1844

积分

金牌会员

Rank: 6Rank: 6

积分
1844
金钱
1509
HASS币
0
发表于 2018-3-15 19:54:59 | 显示全部楼层
感谢分享!
回复

使用道具 举报

13

主题

333

帖子

1418

积分

金牌会员

Rank: 6Rank: 6

积分
1418
金钱
1085
HASS币
0
发表于 2018-8-20 00:48:57 | 显示全部楼层
lZ,装好想启动的时候,IPHONE能发现,但一连接就出现无法隔空传送,设备也消失了
回复

使用道具 举报

13

主题

333

帖子

1418

积分

金牌会员

Rank: 6Rank: 6

积分
1418
金钱
1085
HASS币
0
发表于 2018-8-20 00:50:31 | 显示全部楼层

ALSA lib pcm.c:2495:(snd_pcm_open_noupdate) Unknown PCM cards.pcm.front
Initialized server socket(s)
*** WARNING *** The program 'shairplay' uses the Apple Bonjour compatibility layer of Avahi.
*** WARNING *** Please fix your application to use the native API of Avahi!
*** WARNING *** For more information see <[url]http://0pointer.de/avahi-compat?s=libdns_sd&e=shairplay[/url]>
Accepted IPv6 client on socket 10
Accepted IPv4 client on socket 11
Receiving on socket 11
Connection closed for socket 11
Segmentation fault

出现这些错误
回复

使用道具 举报

14

主题

156

帖子

858

积分

论坛技术达人

积分
858
金钱
702
HASS币
0
 楼主| 发表于 2018-8-20 10:50:45 | 显示全部楼层
ufonba 发表于 2018-8-20 00:50
[code]
ALSA lib pcm.c:2495snd_pcm_open_noupdate) Unknown PCM cards.pcm.fro ...

你测试下看看,这不是错误。
回复

使用道具 举报

13

主题

333

帖子

1418

积分

金牌会员

Rank: 6Rank: 6

积分
1418
金钱
1085
HASS币
0
发表于 2018-8-20 14:38:36 | 显示全部楼层
Sunbelife 发表于 2018-8-20 10:50
你测试下看看,这不是错误。

是不是要求树霉派必须是无线连接的呢?我的刚好是有线连接的。
回复

使用道具 举报

1

主题

179

帖子

921

积分

高级会员

Rank: 4

积分
921
金钱
742
HASS币
0
发表于 2018-8-21 12:06:37 | 显示全部楼层

ALSA lib pcm.c:2495snd_pcm_open_noupdate) Unknown PCM cards.pcm.front
Initialized server socket(s)
*** WARNING *** The program 'shairplay' uses the Apple Bonjour compatibility layer of Avahi.
*** WARNING *** Please fix your application to use the native API of Avahi!
*** WARNING *** For more information see <http://0pointer.de/avahi-compat?s=libdns_sd&e=shairplay>
Accepted IPv6 client on socket 10
Accepted IPv4 client on socket 11
Receiving on socket 11
Connection closed for socket 11
Segmentation fault
和楼上一样的错误
回复

使用道具 举报

1

主题

179

帖子

921

积分

高级会员

Rank: 4

积分
921
金钱
742
HASS币
0
发表于 2018-8-21 13:05:49 | 显示全部楼层
已解决.缺少Perl Net-SDP协议软件,按照eric大神的来吧https://bbs.hassbian.com/thread-589-1-1.html
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

Archiver|手机版|小黑屋|Hassbian

GMT+8, 2024-4-20 23:39 , Processed in 0.095902 second(s), 33 queries .

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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