Snapcast 多房间音频控制一体化

目录

动机

想要手头的两台 MBP 能同时无延迟播放音频,拒绝使用直播流的形式。

Tip

update at 2025-04-13

这里补充一下在 macOS 中安装 snapserver 并且用这台 mac 的输出作为 snapserver 的输入的方法:

  1. 安装 snapcast: brew install snapcast
  2. 安装 BlackHole: brew install blackhole-2ch 安装完成后建议重启就能看见这 BlackHole 设备
  3. 安装 sox: brew install sox
  4. 运行 snapcast: snapcast 默认就会创建一个管道 /tmp/snapfifo ,如果没有的话需要检查并指定配置文件(默认配置文件 在这里 )或者手动创建管道:mkfifo /tmp/snapfifo
  5. 用 sox 捕获 BlackHole 的音频流并写入命名管道: sox -d -r 48000 -e signed-integer -b 16 -c 2 -t raw /tmp/snapfifo
  6. 将 macOS 的默认的设备输入&输出设备换成 BlackHole 或者创建一个多输出设备(Apple自身+虚拟的BlackHole)
  7. 可以在这台 macOS 上放歌听听,又或者用其他 iOS 设备隔空投放到这台 macOS 听听,多加一些 snapclient,比如安卓客户端呀。
  8. 美中不足的是有杂音。

主旨

Vmware Ubuntu 中安装 snapserver

接受 Airplay 的信号

sudo apt install snapserver

sudo apt install -y shairport-sync
sudo systemctl disable --now shairport-sync
  1. 该虚拟机网络采用桥接方式

  2. 注意该服务会自动启动,你可能需要设置下配置文件位置 sudo vi /lib/systemd/system/snapserver.service

    Untitled

    Untitled

    Untitled

  3. 配置文件 /etc/snapserver.conf 中添加:source = airplay:///shairport-sync?name=Airplay

    [stream]
    source = airplay:///shairport-sync?name=Airplay
    

    Untitled

  4. 重启 sudo service snapserver restart

  5. snapweb 是需要手动添加的,建议从 macos 中复制到该虚拟机,在 mac 上的位置为:

    /usr/local/Cellar/snapcast/0.27.0/share/snapserver

    Untitled

  6. 使用 Tabby 终端连接上虚拟机的 SFTP 上传,上传到配置文件中 doc_root 配置的位置:

    Untitled

    Untitled

macOS 上启动 snapclient

brew install snapcast

snapclient

会自动找到局域网中的 server 并连接

总结

任意终端打开控制网页:

Untitled

Untitled

发现两台 MBP 都连接上了,使用 iPhone 隔空投送到 Snapcast:

Untitled

两台 MBP 无缝播放音乐咯!

缺点是无法用两台 MBP 中的一个作为输出,还需要 iPhone 介入,应该有解决方案,之后再看了

  • 在其中一台 MBP 中部署了 navidrome,然后通过 iPhone 放歌。配合 iPhone 上的 substreamer 免费 app ,好用到飞起。但要注意 local music 的质量,需要 ~~mp3tag~~Tagr (自动提取真的好用极了)这样的软件编辑好音频元数据。

Untitled

专辑封面哪里找?Last.fm | Play music, find songs, and discover artists

Untitled

音乐下载使用 msc:https://github.com/zonemeen/musicn https://github.com/zonemeen/musicn

参考文章

GitHub Snapcast

标签 :
comments powered by Disqus

相关文章

Neo4j: 图数据基本概念、语法与增删改查

Neo4j 简介 Neo4j 使用属性图(Property Graph)模型1。 一个图包含节点(Objects)和边(Relationships)。 Neo4j 的属性图模型包含了: 节点 节点标签:用于区分节点的类型,0个或多个 边:源节点与目标节点之间的一条有向边 边类型:用于区分边的类型,有且仅有1个 属性:节点和边都可以有属性(键值对)用于描述节点和边 注意这些名词的英文:node、relationship、label(节点可以有0个或多个标签)、type(边只有一个类型)、property

阅读更多
GORM 自动填充 UUID 的 2 种方式

使用 uuid 库手动生成 采用这个库:github.com/gofrs/uuid 在 GORM 中定义一个 BaseModel,并增加钩子函数: import "github.com/gofrs/uuid" type BaseModel struct { ID uuid.UUID CreatedAt time.Time UpdatedAt time.Time DeletedAt gorm.DeletedAt `gorm:"index"` EffectiveTime *time.Time } func (m *BaseModel) BeforeCreate() (err error) { m.ID, err = uuid.NewV4() if err != nil { log.Logger.Err(err).Msg("uuid create failed") return fmt.Errorf("uuid create with ID failed, %w", err) } return nil } 使用 postgresql 的 uuid-ossp 插件 首先要启用插件 要么手动 Navicat 界面上增加: 要么执行查询语句:

阅读更多
用 Beancount 复式记账,Double-Entry!

🤔动机 已经有很多次记账的尝试,包括各种 App 如圈子账本(现已倒闭下架)等。但有几个痛点还没法解决: 大多数都是简单的记载收支,这对手握多个银行账户、信用卡等的我来说,显得不够用 数据安全问题,数据在服务提供者手上,既有隐私担忧,又受制于人,谁知道什么时候就删库跑路了 数据报表,大多数 App 的统计都比较垃,甚至需要 VIP 才能看

阅读更多