Mkchromecast を pipewire で使う備忘録

Environment
Photo by hyt.

Mkchromecast を pipewire で使う備忘録です.

いつもの通り結論から書くと,

音声の出力先をエンコーダーに向けてやれば使えます

Mkchromecast とは?

macOS もしくは Linux デスクトップの映像と音声を Google Cast デバイスと Sonos スピーカーに出力できるアプリです.

公式サイトは,

Mkchromecast
This is a program to cast your macOS X, or Linux audio to your Google Cast or Sonos devices.

です.なお,純正の Chromecast への Amazon の商品リンクは以下の通りです.

https://amzn.to/44mR9OD
Bitly

導入方法

導入方法は macOS ならば,

Releases · muammar/mkchromecast
Cast macOS and Linux Audio/Video to your Google Cast and Sonos Devices - muammar/mkchromecast

から dmg ファイルをダウンロードして通常通りのやり方で行えます.

Linux の場合は,Debian, Ubuntu 等のディストリビューションの場合は,

$ sudo apt install mkchromecast

とするだけです.もちろんソースコードから導入もできますが,詳細は,

GitHub - muammar/mkchromecast: Cast macOS and Linux Audio/Video to your Google Cast and Sonos Devices
Cast macOS and Linux Audio/Video to your Google Cast and Sonos Devices - muammar/mkchromecast

をご覧ください.

なお,本アプリ,開発者多忙により,2017年以降更新が途絶えていますし,macOS版は2014年以降リリースが途絶えている soundflower に依存していることも問題です.また,本アプリを使わなくても Chrome が導入できればデスクトップの映像と音声を Chromecast デバイスに送信できます.したがって,本アプリが有用なのは,

  1. ヘッドレスな環境から Chromecast デバイスを利用したい
  2. 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 なので,

Photo by hyt.

のようにすれば良いです.

なお,mkchromecast のデフォルトのエンコーダを,

$ mkchromecast --encoder-backend ffmpeg

のように ffmpeg にしている場合は,もちろん音声の出力先を ffmpeg に向ける必要があります.

このように最後に一手間かかる原因ですが,PipeWire の場合,mkchromecast を起動すると,音声の出力先を以下のように直接 mkchromecast 側に切り替えてしまう余計な処理が発生するからのようです.

Photo by hyt.

もし,切り替えが行われなければ,

アプリ ▷ (playback) Bult-in Audio Analog Stereo (monitor)  ▷ parec

の順に出力されます(この場合は本体からも出力される).したがって,PipeWire の設定でどうにかなりそうですが,この辺りについてはまだよく分かっていません.

以上!

タイトルとURLをコピーしました