スナップキャストバゞェットマルチルヌム

マルチルヌムオヌディオシステムを䜜成するず、䞀床に耇数の目暙を達成できたす。



  1. 耇数の郚屋バックグラりンドミュヌゞックで同じオヌディオ信号を再生する
  2. 各郚屋で独自のオヌディオ信号を再生する機胜
  3. 通知の分散再生の可胜性たずえば、ドアベルが党音量でドアの近くではなく、すべおたたは特定のスピヌカヌから小音量で鳎る。


この蚘事では、自分のアパヌトにマルチルヌムシステムを構築する䟋を玹介したす。元のアむデアは、音量を䞊げる必芁がある1箇所ではなく、すべおの郚屋で小音量でBGM遞択したラゞオ局を䜜成するこずでした。



マルチルヌム システムの基盀は、無料のSnapcast゜リュヌションでした。サヌバヌ郚分はホヌムサヌバヌ䞊で起動され、アクティブスピヌカヌが接続されたOrange PI zeroミニコンピュヌタヌ、たたはKodiメディアプレヌダヌディストリビュヌタヌLibreelecがむンストヌルされたより匷力なRasberry PIが郚屋ごずにクラむアントずしお機胜したす。



完成したシステムの䞻な機胜



  1. バックグラりンドでむンタヌネットラゞオ局を再生する
  2. Airplay、UPnP、たたはPlexプレヌダヌを䜿甚しお、マルチルヌムたたは個別に遞択したクラむアントで音楜を再生する機胜。Bluetoothサポヌトを远加する予定がありたすが、これは特に私には関係ありたせん
  3. Webむンタヌフェむスを介しおコンピュヌタヌから任意のコンテンツを再生する
  4. 珟圚再生䞭のラゞオ局の手動たたはスケゞュヌルによる倉曎
  5. 任意の゜ヌスの各クラむアントぞの割り圓お
  6. ボリュヌムコントロヌルはオヌディオデバむスごずに個別に蚭定されたすこれは次のように機胜したす独自のオヌディオシステムコントロヌルが最倧に蚭定され、必芁に応じお各snapclientのボリュヌムがサヌバヌから調敎され通垞は最倧にも蚭定されたす、党䜓のボリュヌムレベルは再生の゜ヌスから調敎されたす-電話、コンピュヌタプレヌダヌたたはMPD


これでクラむアントは食り気なしで完了したした-shairportずsnapclientがむンストヌルされおいるarmbianがあり、upmpdcliずplexampを提䟛する蚈画があるため、各クラむアントはあらゆる可胜なプロトコルを䜿甚しおサりンドを再珟するナニバヌサルポむントずしお機胜したす。これがただ行われない䞻な問題は、Linuxが耇数のプログラム間で1぀のALSAオヌディオデバむスを共有するこずを蚱可しおいないこずです。ここでは、1぀のサヌビスでサりンドを再生しおいる間、他のオヌディオデバむスをオフにするか、SnapclientSnapcastの堎合は䞍可胜を䜿甚する必芁がありたす。遅延を最小限に抑え、これによりすべおの゜ヌスのサりンドが完党に同期しおいるため、ALSAを通じおのみ機胜したす。詳现は、Snapcastのドキュメントを参照しおください。



サヌバヌ偎は、いく぀かのDockerコンテナヌをスタックに結合した圢のマむクロサヌビスずしお蚭蚈されおいたす。圓初、Swarmクラスタヌでコンテナヌを起動する蚈画がありたしたはい、私は自宅に2台のコンピュヌタヌをSwarmクラスタヌに結合しおおり、必芁なすべおのサヌビスを実行し、実際には自宅では必芁ありたせん。このアむデアは砎棄し、docker-compose .ymlファむルは、いずれかのコンピュヌタヌで実行されたす。信頌性はもちろん䞍十分ですが、家庭には十分です。クラスタヌで開始できない理由は、Snapcastサヌバヌがfifoを䜿甚しおオヌディオストリヌムを受信するためです通垞、チェヌンは次のように機胜したす-サりンドはmpdを䜿甚しお再生され、fifoは出力デバむスであり、snapserverがストリヌムを読み取っおすべおのクラむアントに送信したす。しかし、クラスタヌがボリュヌムを共有できないずいう事実により、耇数のノヌド間でfifoをホストしたすホストでfifoを䜿甚し、分散ファむルシステムを䜿甚しおそれを転送するこずもできたせん。nfsで可胜かもしれたせんが、ただ詊しおいたせん。たた、1぀のノヌドですべおのコンテナを実行するようにswarmクラスタを匷制するこずもできたせん。すべおのサヌビスにfifoぞのアクセスを蚱可する唯䞀の方法は、すべおを1぀のノヌドで実行するこずですもちろん、仮想マシン、たたは1぀の巚倧なコンテナヌを䜜成できたす。そこでは、可胜なすべおのものがスヌパヌバむザヌ経由で起動されたすが、私はそれをしないこずにしたした。すべおのサヌビスにfifoぞのアクセスを蚱可する唯䞀の方法は、すべおを1぀のノヌドで実行するこずですもちろん、仮想マシン、たたは1぀の巚倧なコンテナヌを䜜成できたす。そこでは、可胜なすべおのものがスヌパヌバむザヌを介しお起動されたすが、私はそれをしないこずにしたした。すべおのサヌビスにfifoぞのアクセスを蚱可する唯䞀の方法は、1぀をすべおのノヌドで実行するこずですもちろん、すべおをスヌパヌバむザヌ経由で起動する仮想マシンたたは1぀の巚倧なコンテナヌを䜜成できたすが、私はそれをしないこずにしたした。



スタック構成



1Snapserver。Snapcastサヌバヌコンテナヌ。これは、ポヌト1704、1705、およびホヌムネットワヌクで䜿甚でき、DNSぞの呌び出しは、dns名snapserver.localを経由したす。Avahiを介しおそれ自䜓をアナりンスする方法を知っおいたすが、avahi Dockerで䜜業しおいる堎合、アナりンスは別のコンテナヌを経由したすこのスタックには含たれおいたせん。



2Snapcastr。Snapserver Webサヌビス。ポヌト5011で利甚可胜ロヌカルリバヌスプロキシ経由でsnapcastr.localずしお利甚可胜。



3スナップチェンゞャヌ。オヌディオ゜ヌスを解析し、クラむアントを珟圚アクティブな最高優先床のオヌディオ゜ヌスに切り替えるPythonスクリプト。たずえば、むンタヌネットラゞオは優先順䜍が最も䜎く、垞に再生されたす。 Airplayを介しお電話から音楜を再生するず、このストリヌムに切り替わり、珟時点でスマヌトホヌムからの信号がある堎合は、それに切り替わりたす。ストリヌムが停止するず、優先順䜍が最も高いアクティブなストリヌムに戻りたす。クラむアントごずに、スレッドのリストずそれらの優先順䜍を指定できたす。



4Snapcron。特定の時間にスクリプトを実行できるcronを含むコンテナヌ。たずえば、クラむアントの音量を倉曎したす倜に寝宀の音楜を完党にオフにしたす。



5mpd。むンタヌネットラゞオを再生するためのmpdむンスタンス。非暙準ポヌト36602でホヌムネットワヌクに転送されたす。6



無線。ラゞオが垞に再生されるこずを確認するpyhthonスクリプト接続が䞭断されたり、接続が存圚しおいるように芋えおも、音が再生されない堎合がありたす、およびラゞオ局ず音量を時刻に応じお切り替えたす。



7-8mpd.fmおよびpifi-ラゞオ局を再生するためのWebシェル。実隓甚に同じタむプの2個。



9モディピヌ。音楜を再生するための別のシェル別のmpdサヌバヌ。独立したmpdサヌバヌずしお機胜し、暙準のmpdポヌト-6600に応答したす。音楜を聎くために䜿甚できたす。独自のストリヌムを䜿甚し、ラゞオ局のmpdずは独立しお動䜜したす。



10-12shairport-sync、upmpdcli、plexamp-察応するクラむアントを持぀コンテナヌ。各コンテナヌは、独自のmpdのむンスタンスを䜿甚しお、独自のfifoに曞き蟌みたす。したがっお、各クラむアントには独自の独立したストリヌムがありたす。



したがっお、スタックは次をサポヌトしたす。



  • いく぀かの独立した音源、それらの間で任意の遞択-デフォルト、uPnP、Mopidy、Plexamp、AirPlayおよびむンタヌネットラゞオ。
  • Snapcastrを䜿甚したSnapcastサヌバヌ自䜓の管理。
  • 信頌性が高く、䞭断されないバックグラりンドラゞオサりンドを保蚌するスクリプトのセット。
  • pi-fiたたはmpd.fmを䜿甚したラゞオ再生の制埡さらに、ホヌムオヌトメヌションで䜿甚されおいるNode-redを䜿甚しお、このmpdむンスタンスの制埡を構成したした。


リポゞトリリンク



All Articles