本帖最后由 wudijushi 于 2021-2-10 11:48 编辑
前置条件:
1、已root安卓手机
2、安装 Linux deploy + ubuntu
参考:
[进阶教程] 闲置安卓手机安装HA变身智能家居中枢,及网关接入教程
[进阶教程] 用树莓派打通任督二脉控制你家里所有能发声音有wifi的设备
https://github.com/meefik/linuxdeploy/issues/223
目标:
使用罗技的Logitech Media Server系统集中控制各种能发声的设备并接入HA成为智能家居音乐子系统!虽然已经有不少现成的产品,目前知名度较高的就是sonos音箱,价格还算ok,但我们这次的目标是要利用闲置手机实现同样高大上的效果!!土豪可以绕路了...
我的另一篇文章:【docker】【Node-Red】【智能家居音乐系统】HA接入网易云音乐
正文:
1、root手机、安装Linux deploy和ubuntu的过程就跳过了,详细看上面给出的帖子链接就可以了。
2、安装 Squeezelite ,sudo apt-get install squeezelite -y
3、参考上面链接三,执行下面脚本,外文好的可以看原贴,不想看的直接看我的使用步骤就好啦
最后出来这些信息:
然后我们组合一下脚本,复制 To Start:部分,每一行后面加 |,然后丢到SSH里运行命令(不再使用后请使用To Stop部分还原设置或重启手机)
amixer cset numid=407,iface=MIXER,name='RX1 MIX1 INP1' 5 |
amixer cset numid=406,iface=MIXER,name='RX1 MIX1 INP2' 10 |
amixer cset numid=404,iface=MIXER,name='RX2 MIX1 INP1' 6 |
amixer cset numid=403,iface=MIXER,name='RX2 MIX1 INP2' 11 |
amixer cset numid=26,iface=MIXER,name='HPHL Volume' 10 |
amixer cset numid=27,iface=MIXER,name='HPHR Volume' 10 |
amixer cset numid=371,iface=MIXER,name='SLIM TX3 MUX' 1 |
amixer cset numid=369,iface=MIXER,name='SLIM TX5 MUX' 2 |
amixer cset numid=28,iface=MIXER,name='RX1 Digital Volume' 84 |
amixer cset numid=29,iface=MIXER,name='RX2 Digital Volume' 84 |
amixer cset numid=304,iface=MIXER,name='SLIMBUS_0_RX Audio Mixer MultiMedia1' on
最后一步启动 : squeezelite -n hello
一般来说就可以在LMS里看到并播放音乐啦!
如果还是不行的话,就要再指定一下输出设备,从上面执行的脚本开始处可以看到我手机的声卡信息如下:hw:0,0
接着 squeezelite -l 列出输出设备,有很多,但根据我直觉肯定是红色框框那个(不要问我为什么哈),再次启动 squeezelite -o hw:CARD=apq8064tablasnd,DEV=0 -n hello 试试!
后话:
1、squeezelite 能在很多设备上安装,比如树莓派,或者便宜点的香橙派,网上还有安装到openWRT 的文章,外接一个淘宝十多块的USB声卡就可以。
2、Logitech Media Server 支持安装的平台也很多,树莓派、Linux、window、Mac OS、群晖套件中心也有。
3、上面的方法针对使用环境不同,设置也不同,比如说用手机本身的扬声器发声和通过音频线连接音箱发声,运行脚本生成的设置信息是不同的。蓝牙连接还没测试,留待大家去尝试了。
4、Linux deploy下加入到rc.local做一个开机启动非常方便,稳定性正在测试....
脚本:
#!/bin/bash[indent]
sudo apt install alsa-utils
echo Play music or start recording and press enter.
read key
c=$(grep RUNNING /proc/asound/card*/pcm*/sub*/status | grep -o 'card[0-9]*' | grep -o [0-9]*) && echo "Card: $c"
p=$(grep RUNNING /proc/asound/card*/pcm*/sub*/status | grep -o 'pcm[0-9]*p' | grep -o [0-9]*) && { echo "Playback device: $p"; echo "i.e. alsa device is hw:$c,$p"; }
r=$(grep RUNNING /proc/asound/card*/pcm*/sub*/status | grep -o 'pcm[0-9]*c' | grep -o [0-9]*) && { echo "Recording device: $r"; echo "i.e. alsa device is hw:$c,$r"; }
echo
printf 'Stop playback / recording and press enter.'
read key
# alsactl doesn't seem to work when piped to grep
echo 'Start and stop playback / recording and observe values changes.'
sleep 3
echo 'Terminate when done.'
echo
trap 'pkill -1 alsactl' SIGINT
alsactl monitor
trap "kill $" SIGINT
echo
printf 'Write Control Identifier (nmuid) of changed values with space: '
read -a val
for v in ${val[@]}
do
printf 'Play music / start recording and press enter.'
read key
v1="$(amixer cget "$(amixer controls | grep "numid=${v},")" | grep ': values=' | cut -d= -f2)"
printf 'Stop playback / recording and press enter.'
read key
sleep 3
v2="$(amixer cget "$(amixer controls | grep "numid=${v},")" | grep ': values=' | cut -d= -f2)"
if [ "$v1" = "$v2" ]; then
echo "ERROR: No change in values detected for Control Identifier $v."
continue
fi
V1="$(printf '%s\n%s' "$V1" "amixer cset $(amixer controls | grep "numid=${v},") $v1")"
V2="$(printf '%s\n%s' "$V2" "amixer cset $(amixer controls | grep "numid=${v},") $v2")"
done
[ -z "$V1" ] || { printf '\n To start:'; echo "$V1"; }
[ -z "$V2" ] || { printf '\n To stop:'; echo "$V2"; }
复制代码
评分
参与人数 1 金钱 +20
HASS币 +20
收起
理由
囧
+ 20
+ 20
膜拜大神!
查看全部评分