Cast macOS and Linux Audio/Video to your Google Cast and Sonos Devices
Looking for help!
I don't have too much time recently to take care of the project. If you would be interested in helping, please comment on #398
Mkchromecast
This is a program to cast your macOS audio, or Linux audio to your Google Cast devices or Sonos speakers. It can also cast video files.
It is written for Python3, and it can stream via node.js
, parec
(Linux),
ffmpeg
, or avconv
. Mkchromecast is capable of using lossy and lossless
audio formats provided that ffmpeg
, avconv
(Linux), or parec
(Linux) are installed. It also supports Multi-room group
playback, and
24-bit/96kHz high audio resolution.
Additionally, a system tray menu is available.
By default, Mkchromecast streams with node.js
(or parec
in Linux)
together with mp3
audio coding format at a sample rate of 44100Hz
and
average bitrate of 192k
. These defaults can be changed using the
--sample-rate
and -b
flags. It is useful to modify these parameters when
your wireless router is not very powerful, or in the case you don't want to
degrade the sound quality. For more information visit the
wiki, and the
FAQ.
You can optionally install ffmpeg
or avconv
(the latter only supported in Linux,
more information
here).
Linux users also can configure ALSA to capture
audio. Note that sometimes
the lag between playing a song and hearing may be up to 8 seconds for certain
backends.
Tell me more about it
To have an idea of using Mkchromecast from console check this gif.
Mkchromecast provides a beta system tray menu. It requires you to
install PyQt5
. For more information check the
Requirements and
Install sections.
This is what the system tray menu looks like:
macOS
Linux
Check these images:
Sonos support
If you have Sonos speakers, you can play whatever you are listening to in your
computer with Mkchromecast. To add Sonos support, install the soco
python
module:
pip3 install soco
Contribute
If you want to contribute, help me improving this application by reporting issues, creating pull requests, or you may also buy me some pizza :).
Requirements: macOS
In order to use Mkchromecast you need the following software to stream with
node.js
:
For more control, you need ffmpeg
as backend. In that case install the
following:
Linux
For those who don't like Pulseaudio, it is possible to cast using ALSA. In that case the requirements are:
Install
There are two ways of installing this application:
Binaries macOS
There is a standalone application for macOS users. You need to drag it to your
/Applications/
folder.
Download the latest dmg here. You need also to install BlackHole.
Homebrew Cask
If you are using homebrew, it is possible to install the binary as follows:
brew install --cask mkchromecast
If you find any problem with the application, please report it here.
Linux
Mkchromecast is available in the official Debian repositories. To install it, just do:
apt install mkchromecast
Download the latest deb package here, and install it as follows:
sudo apt -f install ./mkchromecast_$VERSION_all.deb
where $VERSION = X.Y.Z-Rev
, e.g.: 0.2.6-1
.
This should work in Debian Unstable and Testing. I would appreciate Ubuntu testers as well. If you find any problems, please report it here.
If you experience other problems related to dependencies, please discuss them here or open a new issue.
Additionally, there are two dependency packages for pulling pulseaudio or ALSA dependencies:
apt-get install mkchromecast-alsa (ALSA users)
or
apt-get install mkchromecast-pulseaudio (Pulseaudio users)
From sources
To install Mkchromecast, clone this repository:
git clone https://github.com/muammar/mkchromecast.git --depth 1
Or you may download one of the stable releases here, and unzip the file.
Arch Linux
Mkchromecast is available at the AUR :
#install with aurman aurman -S mkchromecast
#install with aurutils aur sync mkchromecast
If you get the error cannot import name 'DependencyWarning'
in Arch Linux,
please check issue #31.
Python
To install python requirements use the requirements.txt
file shipped in
this repository:
pip install -r requirements.txt
Note: if this step fails, maybe you need to run the installation with
sudo
as shown below. However, before installing using this method verify why
a regular user cannot install these requirements.
sudo pip install -r requirements.txt
Linux users can try to install these python requirements using the package managers coming with their distributions.
Example for Debian based distros:
sudo apt-get install python3.6 python3-pip python3-pychromecast python3-flask python3-psutil python3-setuptools python3-mutagen python3-gi vorbis-tools sox lame flac faac opus-tools
Note: if python3-pychromecast
is not available in your repository,
follow instructions in #9.
BlackHole (macOS users only)
For installing BlackHole you can check https://github.com/ExistentialAudio/BlackHole and just download the latest dmg file.
If you have Homebrew you can use brew cask as follows:
brew install --cask blackhole
By default, the sample rate in BlackHole is set to 44100Hz
. If you desire
to stream at higher sample rates follow the instructions in the
wiki.
Note: re-sampling to higher sample rates is not a good idea. It was indeed
an issue in chromecast audio devices. See this thread.
Therefore, if you want to go beyond 44100Hz
you have to capture the sound at
a higher sample rate.
ffmpeg or avconv
The easiest way of installing ffmpeg
is using a package manager, e.g.: brew,
macports or fink. Or in the case of Linux, e.g.: apt, yum, or pacman.
macOS
I will briefly describe the case of Homebrew here. First, you will need Homebrew installed in your machine:
/usr/bin/ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"
Once Homebrew is ready, you can install ffmpeg
. As stated in the ffmpeg
website, and for being
able to use all audio coding formats in Mkchromecast, it is better to
install ffmpeg
with the following options enabled:
brew install ffmpeg --with-fdk-aac --with-tools --with-freetype --with-libass --with-libvorbis --with-libvpx --with-x265 --with-opus
Mkchromecast does not support avconv
in macOS.
Linux
As I use Debian, the way of installing ffmpeg
is:
apt-get install ffmpeg
or avconv
apt-get install libav-tools
Audio coding formats available with parec
, ffmpeg
and avconv
backends
Audio coding format Description Notes
mp3
MPEG Audio Layer III (default)
Lossy compression format (default bitrate: 192k)
ogg
Ogg Vorbis
Lossy compression format (default bitrate: 192k)
aac
Advanced Audio Coding (AAC)
Lossy compression format (default bitrate: 192k)
opus
Opus
Lossy compression format (default bitrate: 192k)
wav
Waveform Audio File Format
Lossless format (HQ sound)
flac
Free Lossless Audio Codec
Lossless format (HQ sound)
PyQt5
These Python bindings are needed if you intend to use the system tray menu.
Sometimes pip
is able to install PyQt5
andpip install pyqt5
is enough.
If this does not work for you, I suggest you to install it using a package manager.
macOS
Example with Homebrew:
brew install pyqt5 --with-python3
Linux
apt-get install python3-pyqt5
or if you desire it you can do it yourself from the sources.
Updating
To update Mkchromecast sources, just get into the cloned directory and:
git pull
or if you prefer it, you can just pass the --update
argument to
Mkchromecast:
bin/mkchromecast --update
If you are using the macOS application:
Check For Updates
.mkchromecast.app
in your /Applications/
directory.Linux users need to either perform a apt-get upgrade
or download the
latest deb here, and dpkg -i mkchromecast_$VERSION_all.deb
.
Usage Audio
Get into the cloned Mkchromecast directory and execute:
bin/mkchromecast
This will launch Mkchromecast using node.js
(or parec
for Linux
users), and will do the streaming part together with the mp3
audio coding
format. node.js
works decently but the server may tend to fail under certain
circumstances. In such a case, Mkchromecast is able to restart the
streaming/casting process automatically. So, some hiccups are expected.
Note: most of the steps described herein are the same for macOS and Linux
users. However, if you launch the command above in Linux, the process is
less automatized. In Linux, you need to select with pavucontrol
the sink
called Mkchromecast
to stream unless you are using ALSA.
See the wiki for more information. tl;dr?, just
check the gif below.
Note: the cast process is independent from the selection of the pulseaudio sink. This means that Mkchromecast will tell the cast device to listen your computer but no sound will be heard until you select the sink. For ALSA users, this does not apply.
Using the ffmpeg
backend with Mkchromecast installed from sources
Below an example using mp3
:
bin/mkchromecast --encoder-backend ffmpeg
With ffmpeg
you can modify the codec:
bin/mkchromecast --encoder-backend ffmpeg -c aac
change the bitrate and sample rate:
bin/mkchromecast --encoder-backend ffmpeg -c mp3 -b 128 --sample-rate 31000
check the section BlackHole (macOS users only) for more about sample rates.
You also can set the host ip manually which is a useful option when having more than one active network connection or when the automatically ip detection fails:
bin/mkchromecast --host 192.168.1.1
Other examples with Mkchromecast installed using the debian package
To cast using parec
and wav
audio coding format:
mkchromecast -c wav
There is also an option to change the bitrate
, and in this case with ffmpeg
:
mkchromecast --encoder-backend ffmpeg -c ogg -b 128
and another one to change the sampling rate:
mkchromecast --encoder-backend ffmpeg -c ogg -b 128 --sample-rate 48000
Note: to use avconv
just replace from ffmpeg
to avconv
in the
commands above.
Using Mkchromecast from the system tray
To launch it:
bin/mkchromecast -t
or
mkchromecast -t
The system tray application can perform all the actions from the aforementioned commands. To get an idea, please check the Youtube video here.
Playing Youtube URLs in Google Cast devices
You can play Youtube URLs (or other sites headlessly from the command line:
bin/mkchromecast -y https://www.youtube.com/watch\?v\=NVvAJhZVBT
To use this function, you need to install youtube-dl
. In macOS, this can be
done with homebrew: brew install youtube-dl
. In Debian based distros:
apt-get install youtube-dl
.
Note: you may need to enclose the URL between quotation marks, and only
URLs over https
are supported.
Playing source URLs in Google Cast devices
You can play any source URLs headlessly from the command line:
bin/mkchromecast --source-url SOURCE_URL
This option is useful for:
http
streaming source.Example:
bin/mkchromecast --source-url http://192.99.131.205:8000/pvfm1.ogg -c ogg --control
As it can be seen above, the codec has to be specified with the -c
flag.
Note: .m3u
or .pls
are not yet supported.
Controlling the Google Cast's volume and pause/resume options
You can control the volume of your Google Cast device by launching
Mkchromecast with the option --control
:
bin/mkchromecast --encoder-backend ffmpeg -c ogg -b 320 --control
This will allow you to press u and d keys for volume up
and volume down
respectively.
The system tray has a window with a volume slider to do volume up
and volume down
.
High quality audio
Mkchromecast lets you cast using 24-bit/96kHz
high audio resolution. This
is the maximum chromecast audio capability. The supported codecs are: wav
and flac
. In spite of the fact that aac
can use 96000Hz
sample rate, the
bitrate corresponds to that of a lossy data compression format. Therefore, the
following combinations can achieve this 24-bit/96kHz
capability:
wav
+ 96000Hz
sample rate.flac
+ 96000Hz
sample rate.References:
Video
You can now cast videos to your Google cast using Mkchromecast. This feature works both with node
and ffmpeg
backends and from command line. In the future, they may be a graphical interface
for this process. See this project.
bin/mkchromecast --video -i "/path/to/file.mp4"
bin/mkchromecast --video -i "/path/to/file.mp4" --encoder-backend node
Note: the format of the file can be whatever is supported by ffmpeg
and not exclusively mp4.
bin/mkchromecast --video -i "/tmp/Homeland.S06E01.Fair.Game.1080p.AMZN.WEBRip.HEVC.DD5.1.x265.mkv" --subtitles /tmp/Homeland.S06E01.Fair\ Game.HDTV.x264-BATV.en.HI.srt
bin/mkchromecast --video --resolution 4k -i /path/to/myvideo.something --subtitles /path/to/my.srt
bin/mkchromecast --source-url http://commondatastorage.googleapis.com/gtv-videos-bucket/sample/BigBuckBunny.mp4 -c mp4 --volume --video
bin/mkchromecast -y https://www.youtube.com/watch\?v\=VuMBaAZn3II --video
Killing the application
To kill Mkchromecast when you run it from console, just press
Ctrl-C or q key to quit (when --control
flag is passed).
When launching from system tray, use the Quit
button in the system tray.
More help
To get more help:
bin/mkchromecast -h
or when installing the debian package:
mkchromecast -h
Known issues
General
node
backend, it is not possible to
use neither the --subtitle
nor the --seek
flags.mp3
, and aac
.
I won't give wma
support. Apparently there is a way to play wav
, and
ogg
that I will try to implement later.macOS
Linux
parec
and lame
encoder, the delay between audio played and
listened can be up to 8 seconds. I suggest you to use something different
than mp3.You can also check the FAQ for more information.
TODO
Twice a month we will interview people behind open source businesses. We will talk about how they are building a business on top of open source projects.
We'll never share your email with anyone else.