Multi-anggaran kamar Snapcast

Penciptaan sistem audio multi-kamar memungkinkan Anda untuk mencapai beberapa tujuan sekaligus.



  1. Memainkan sinyal audio yang sama di beberapa kamar (musik latar)
  2. Kemampuan mereproduksi sinyal audio sendiri di setiap kamar
  3. Kemungkinan pemutaran notifikasi yang didistribusikan (misalnya, bel pintu berdering tidak di dekat pintu dengan volume penuh, tetapi pada volume rendah melalui semua atau melalui speaker tertentu).


Dalam artikel ini, saya akan membagikan contoh membangun sistem multi-kamar di apartemen saya sendiri. Ide awalnya adalah membuat musik latar (stasiun radio yang dipilih) dengan volume rendah di semua kamar, alih-alih satu titik di mana volume harus ditingkatkan.



Dasar untuk sistem multi-ruangan adalah solusi Snapcast gratis . Bagian server diluncurkan pada server rumah; baik Orange PI nol minicomputer dengan speaker aktif yang terhubung dengannya, atau Rasberry PI yang lebih kuat dengan pemutar media Kodi yang terinstal (distributor Libreelec) bertindak sebagai klien berdasarkan ruang.



Fitur utama dari sistem jadi



  1. Memainkan stasiun radio Internet di latar belakang
  2. Kemampuan untuk memutar musik di multi-ruang (atau pada klien yang dipilih secara terpisah) menggunakan Airplay, UPnP atau melalui pemutar Plex. Ada rencana untuk menambahkan dukungan bluetooth, meskipun ini tidak terlalu relevan bagi saya
  3. Memainkan konten sewenang-wenang dari komputer melalui antarmuka web
  4. Ganti stasiun radio yang sedang diputar secara manual atau sesuai jadwal
  5. Penugasan untuk setiap klien dari sumber apa pun
  6. Kontrol volume secara individual untuk setiap perangkat audio (berfungsi seperti ini: kontrol sistem audio sendiri diatur ke maksimum, volume setiap snapclient disesuaikan dari server jika perlu (biasanya juga diatur ke maksimum), dan tingkat volume keseluruhan disesuaikan dari sumber dari mana pemutaran akan berlangsung - telepon , pemutar komputer atau mpd)


Klien sekarang dilakukan tanpa embel-embel - ada armbian, di mana shairport dan snapclient diinstal, dan ada rencana untuk mengirimkan upmpdcli dan plexamp, sehingga setiap klien akan bertindak sebagai titik universal yang mereproduksi suara menggunakan protokol apa pun yang mungkin. Masalah utama yang masih mencegah hal ini dilakukan adalah bahwa Linux tidak memungkinkan berbagi satu perangkat audio ALSA antara beberapa program, dan di sini Anda harus mematikan yang lain saat memutar suara melalui satu layanan, atau mencoba menggunakan Pulseaudio, yang tidak mungkin dalam kasus Snapclient (Snapcast) bekerja secara eksklusif melalui ALSA, karena meminimalkan penundaan dan karena ini suara semua sumber benar-benar sinkron. Detail lebih lanjut dapat ditemukan dalam dokumentasi Snapcast).



Sisi server dirancang sebagai layanan microser dalam bentuk beberapa wadah buruh pelabuhan yang digabungkan menjadi tumpukan. Awalnya, ada rencana untuk meluncurkan kontainer di cluster Swarm (ya, saya memiliki dua komputer di rumah digabungkan menjadi cluster Swarm, yang menjalankan semua layanan yang saya butuhkan dan tidak benar-benar perlu di rumah), tetapi ide ini harus ditinggalkan, dan tumpukan melalui susunan docker-compose File .yml dijalankan di salah satu komputer. Keandalannya tentu saja timpang, tetapi cukup untuk rumah. Alasan ketidakmampuan untuk memulai di kluster adalah bahwa server Snapcast menggunakan fifo untuk menerima aliran audio (rantai tipikal bekerja seperti ini - suara dimainkan menggunakan mpd, fifo adalah perangkat keluaran, dari mana snapserver membaca dan mentransmisikan aliran ke semua klien). Tetapi karena fakta bahwa cluster tidak dapat berbagi volume,yang meng-host fifo antara beberapa node (menggunakan fifo pada host dan meneruskannya menggunakan sistem file terdistribusi tidak bekerja baik. Meskipun dimungkinkan melalui nfs, saya belum mencobanya), dan juga tidak mungkin untuk memaksa cluster kawanan untuk menjalankan semua wadah pada satu node, satu-satunya cara untuk memberikan semua layanan akses ke fifo adalah menjalankan semuanya pada satu simpul (Anda tentu saja dapat membuat mesin virtual, atau satu wadah raksasa, di mana segala sesuatu yang mungkin diluncurkan melalui supervisor, tetapi saya memutuskan untuk tidak melakukannya).satu-satunya cara untuk memberikan semua layanan akses ke fifo adalah menjalankan semuanya pada satu simpul (Anda tentu saja dapat membuat mesin virtual, atau satu wadah raksasa, di mana segala sesuatu yang mungkin diluncurkan melalui supervisor, tetapi saya memutuskan untuk tidak melakukannya).satu-satunya cara untuk memberikan semua layanan akses ke fifo adalah menjalankan semuanya pada satu simpul (Anda tentu saja dapat membuat mesin virtual, atau satu wadah raksasa, di mana segala sesuatu yang mungkin diluncurkan melalui supervisor, tetapi saya memutuskan untuk tidak melakukannya).



Komposisi tumpukan



1) Snapserver. Wadah server snapcast. Ini tersedia di port 1704, 1705 dan di jaringan rumah, panggilan untuk itu melalui nama dns snapserver.local. Ia tahu cara mengumumkan dirinya melalui Avahi, tetapi ketika bekerja di avahi docker, pengumuman melalui wadah yang terpisah (tidak termasuk dalam tumpukan ini).



2) Snapcastr. Layanan web Snapserver. Tersedia di port 5011 (tersedia sebagai snapcastr.local melalui proksi reverse lokal).



3) Snapchanger. Skrip python yang mem-parsing sumber audio dan mengalihkan klien ke sumber audio prioritas tertinggi yang saat ini aktif. Misalnya, radio internet memiliki prioritas terendah dan selalu diputar. Saat memutar musik dari ponsel melalui Airplay, ia beralih ke aliran ini, dan jika pada saat ini ada sinyal dari rumah pintar, itu akan beralih ke itu. Ketika aliran dihentikan, ia beralih kembali ke aliran aktif dengan prioritas tertinggi. Untuk setiap klien, Anda dapat menentukan daftar utas dan prioritas untuk mereka.



4) Snapcron. Wadah dengan cron yang dapat menjalankan skrip pada waktu tertentu, misalnya, mengubah volume pada klien (matikan musik di kamar tidur di malam hari sepenuhnya).



5) mpd. contoh mpd untuk memutar radio internet. Diteruskan ke jaringan rumah pada port non-standar 36602.



6) radio. skrip pyhthon yang memastikan bahwa radio selalu diputar (ada kasus ketika koneksi terputus, atau koneksi tampaknya ada di sana, tetapi suara tidak diputar), serta beralih stasiun radio dan volume tergantung pada waktu hari.



7-8) shell mpd.fm dan pifi - web untuk memutar stasiun radio. Dua potong dari jenis yang sama untuk eksperimen.



9) mopidy. Shell lain (alias server mpd terpisah) untuk memutar musik. Ini bertindak sebagai server mpd yang terpisah dan menanggapi port mpd standar - 6600. Dapat digunakan untuk mendengarkan musik. Ia menggunakan alirannya sendiri dan bekerja secara independen dari mpd untuk stasiun radio.



10-12) shairport-sync, upmpdcli, plexamp - wadah dengan klien yang sesuai. Setiap wadah menggunakan instance mpd sendiri, menulis ke fifo sendiri. Jadi setiap klien memiliki aliran independennya sendiri.



Dengan demikian, tumpukan sekarang mendukung:



  • Beberapa sumber suara independen dengan pilihan sewenang-wenang di antara mereka - Default, uPnP, Mopidy, Plexamp, AirPlay dan radio Internet.
  • Mengelola server Snapcast itu sendiri dengan Snapcastr.
  • Seperangkat skrip untuk memastikan suara radio latar yang andal dan tidak terganggu.
  • Mengontrol pemutaran radio menggunakan pi-fi atau mpd.fm (selain itu, saya mengkonfigurasi kontrol instance mpd ini menggunakan Node-red yang digunakan dalam otomatisasi rumah saya).


Tautan repositori



All Articles