Synchronize mpv video streaming playback between multiple computers. https://spacecruft.org/deepcrayon/sync-mpv
Go to file
Jeff Moe 2ef88ab419 Add black for dev requirements 2023-09-14 10:46:51 -06:00
.gitignore ignore temp files 2023-09-13 14:19:25 -06:00
LICENSE Initial commit 2022-04-08 17:18:00 +02:00
README-upstream.md mv upstream readme 2023-09-13 14:15:16 -06:00
README.md readme usage and notes 2023-09-13 15:08:03 -06:00
requirements-dev.txt Add black for dev requirements 2023-09-14 10:46:51 -06:00
requirements.txt Add python requirements 2023-09-13 14:20:13 -06:00
sync_mpv_client.py Add copyright header to python files 2023-09-14 10:46:17 -06:00
sync_mpv_server.py Add copyright header to python files 2023-09-14 10:46:17 -06:00

README.md

sync-mpv

sync-mpv synchronizes video playback between mpv clients running on multiple computers.

Rationale: If multiple computers are playing the same stream at the same time, and are not synchronized, the audio will sound like an echo (or worse).

Use case: Live streaming OBS Studio output to multiple computers across a LAN.

Install

Install thusly.

Using Debian Stable (12/Bookworm).

Install thine dependencies:

sudo apt update
sudo apt install git mpv python3-pip python3-virtualenv

Clone repo:

git clone https://spacecruft.org/deepcrayon/sync-mpv
cd sync-mpv/

Set up Python to taste, such as:

virtualenv -p env
source env/bin/activate
pip install --upgrade pip setuptools wheel

Install Python dependencies:

pip install -r requirements.txt

Usage

Server

Note, this isn't right yet, I just hardcode URL into Python script. Will add some command line options, perchance.

./sync_mpv_server.py

On first run, it will prompt you for password, which will be saved for future runs.

Client

This would be nice to have some command line options too.

./sync_mpv_client.py

It will prompt you for a IP address. Enter the IP address of the server. By default it will connect on TCP/51984, which will need to be open on the firewall that is surely running. It will prompt for a username, which can be whatever. It will prompt for a password, which is the main one set in the server. This will all be stored in the configuration file ~/.config/sync-mpv/sync-mpv.conf

Notes

There are two main scripts in the application. One is the server, the other is the client. The server runs on one machine. The client runs on as many machines as you want, including the server. The server listens on an IP address and port for TCP connections. The server doesn't do any video processing, the load is near zero. The server just coordinates connections and synchronization. When a new client connects, the other clients may pause for a second, which sucks. The server has the URL to play. The client connects, gets the URL, starts playback and synchronization. There are usernames and a single shared password. The password is supposedly secure across the network with some Python AES library, but I doubt it. The password is stored in plaintext in ~/.config/sync-mpv/serverpassword.conf. This thing actually appears to work, wow.

Upstream

sync-mpv

This present repo is an updated fork of this repo:

See README-upstream.md for upstream's README.

mpv

mplayer

  • "Older" mplayer has this ability with options like -udp-master, but it doesn't support SRT and recent codecs.

Similar Projects

There are many different similar projects, namely have two+ machines play the same video at the same time. I tried many of them, but they didn't work for my use case. For instance:

  • The application was for file playback, not "realtime" streaming.
  • Used for synchronization "far" across the Internet, so acceptable delays are in the 1-5 second range. That is far too much latency, it is ideally 20ms or below.
  • Not maintained.
  • Too much overhead (e.g. QT).
  • Audio only. Something like JACK doing streaming video would be ideal.

Copyright

Unofficial project, not related to mdnghtman or mpv.

Upstream sources under their respective copyrights.

License

Apache 2.0.

Copyright © 2023, Jeff Moe.