Mkchromecast を pipewire で使う備忘録です.
いつもの通り結論から書くと,
音声の出力先をエンコーダーに向けてやれば使えます
Mkchromecast とは?
macOS もしくは Linux デスクトップの映像と音声を Google Cast デバイスと Sonos スピーカーに出力できるアプリです.
公式サイトは,
です.なお,純正の Chromecast への Amazon の商品リンクは以下の通りです.
導入方法
導入方法は macOS ならば,
から dmg ファイルをダウンロードして通常通りのやり方で行えます.
Linux の場合は,Debian, Ubuntu 等のディストリビューションの場合は,
$ sudo apt install mkchromecast
とするだけです.もちろんソースコードから導入もできますが,詳細は,
をご覧ください.
なお,本アプリ,開発者多忙により,2017年以降更新が途絶えていますし,macOS版は2014年以降リリースが途絶えている soundflower に依存していることも問題です.また,本アプリを使わなくても Chrome が導入できればデスクトップの映像と音声を Chromecast デバイスに送信できます.したがって,本アプリが有用なのは,
- ヘッドレスな環境から Chromecast デバイスを利用したい
- Chrome 以外の特定のアプリからだけ映像(音声)を Chromecast に出力したい
のいずれかの場合だけであることにご注意ください.
使用方法(PipeWire 環境)
macOS や PulseAudio 環境の Linux だと,ファイヤーウォールの TCP/UDP の 5000 番を許可した上で,
$ mkchromecast
のように起動すれば良いようですが,PipeWire 環境の場合は(少なくとも私の環境だと)うまくいかないのですが,いろいろ試した結果,以下の手順で無事利用することができました.
まず,ファイヤーウォールの TCP/UDP 5000番を許可します.
$ sudo ufw enable 5000 $ sudo ufw status ✘ 1 状態: アクティブ To Action From -- ------ ---- 5353/udp ALLOW Anywhere 22 ALLOW Anywhere 5000 ALLOW Anywhere 5353/udp (v6) ALLOW Anywhere (v6) 22 (v6) ALLOW Anywhere (v6) 5000 (v6) ALLOW Anywhere (v6)
次に mkchromecast を起動します.
$ mkchromecast Mkchromecast v0.3.9 Creating Pulseaudio Sink... Open Pavucontrol and Select the Mkchromecast Sink. Starting Local Streaming Server [Done] Selected backend: parec Selected audio codec: mp3 Default bitrate used: 192k Default sample rate used: 44100Hz. PID of main process: 62706 PID of streaming process: 62709 * Serving Flask app 'mkchromecast.audio' (lazy loading) * Environment: production WARNING: This is a development server. Do not use it in a production deployment. Use a production WSGI server instead. * Debug mode: off * Running on http://192.168.100.190:5000/ (Press CTRL+C to quit) List of Devices Available in Network: ------------------------------------- Index Types Friendly Name ===== ===== ============= 0 Gcast hear go 2 Casting to first device shown above! Select devices by using the -s flag. hear go 2 Information about hear go 2 DeviceStatus(friendly_name='hear go 2', model_name='SRS-HG10', manufacturer='Sony Corporation', uuid=UUID('d79fb693-2e47-3ceb-409c-005999ca72ab'), cast_type='audio', multizone_supported=True) Status of device hear go 2 CastStatus(is_active_input=None, is_stand_by=None, volume_level=0.7200000286102295, volume_muted=False, app_id=None, display_name=None, namespaces=[], session_id=None, transport_id=None, status_text='', icon_url=None, volume_control_type='master') The IP of hear go 2 is: 192.168.***.*** Your local IP is: 192.168.***.*** The media type string used is: audio/mpeg Cast media controller status CastStatus(is_active_input=None, is_stand_by=None, volume_level=0.7200000286102295, volume_muted=False, app_id=None, display_name=None, namespaces=[], session_id=None, transport_id=None, status_text='', icon_url=None, volume_control_type='master') Remember to open pavucontrol and select the mkchromecast sink. Ctrl-C to kill the Application at any Time 192.168.***.*** - - [06/Aug/2023 13:12:55] "GET /stream HTTP/1.1" 200 -
表示されるメッセージを読むと,私の環境だと
- Sony SRS-HG10 (hear go 2) が利用可能デバイスとして見つかったこと
- 見つかった最初のデバイスがデフォルトの出力先として使われること
- デバイスが複数ある場合は -s オプションで指定できること
であることがわかります.
なお,最初の方に,
WARNING: This is a development server. Do not use it in a production deployment.
のような警告が出ていますが,これは mkchromecast が Python 標準の簡易的な Web Server を利用していることから出ているメッセージなので,機にする必要はありません.
最後に,qpwgraph などを用いて,実際に音声を出力したいアプリの音声出力を mkchromecast が利用するエンコーダに向けることで実際に音声を Chromecast デバイスから出力することができます.mkchromecast のデフォルトのエンコーダは parec なので,
のようにすれば良いです.
なお,mkchromecast のデフォルトのエンコーダを,
$ mkchromecast --encoder-backend ffmpeg
のように ffmpeg にしている場合は,もちろん音声の出力先を ffmpeg に向ける必要があります.
このように最後に一手間かかる原因ですが,PipeWire の場合,mkchromecast を起動すると,音声の出力先を以下のように直接 mkchromecast 側に切り替えてしまう余計な処理が発生するからのようです.
もし,切り替えが行われなければ,
アプリ ▷ (playback) Bult-in Audio Analog Stereo (monitor) ▷ parec
の順に出力されます(この場合は本体からも出力される).したがって,PipeWire の設定でどうにかなりそうですが,この辺りについてはまだよく分かっていません.
以上!