mpv-sync - Synchronize Multiple mpv Instances via UDP Broadcast¶
Synchronisiert mehrere mpv-Instanzen über UDP Broadcast. Ein Master-Player steuert beliebig viele Slave-Player gleichzeitig.
Features¶
UDP Broadcast: Ein Master synchronisiert beliebig viele Slaves gleichzeitig
Dual Backend: Unterstützt lua-socket UND socat (mit automatischem Fallback)
Adaptive Geschwindigkeitsanpassung: Progressive Synchronisation ohne Oszillation
Manuelle Offset-Anpassung: Feintuning in 5ms-Schritten mit Ö/Ä-Tasten
Hard Seeking: Automatisches Springen bei großen Zeitunterschieden (>5s)
OSD-Anzeige: Live-Sync-Info direkt im Player
Installation¶
Voraussetzungen¶
Option A: lua-socket (funktioniert auf Debian 13, schneller)
sudo apt install lua-socket
Option B: socat (funktioniert auf Debian 11, 12, 13)
sudo apt install socat
Empfehlung: Beide installieren, Script wählt automatisch das beste Backend!
Script installieren¶
# Systemweit (für alle User):
sudo cp mpv-sync-1.1.lua /usr/share/mpv/scripts/mpv-sync.lua
# Oder pro User:
mkdir -p ~/.config/mpv/scripts
cp mpv-sync-1.1.lua ~/.config/mpv/scripts/mpv-sync.lua
Verwendung¶
Einfachste Verwendung (empfohlen)¶
Master (1x):
mpv --script-opts=sync-role=master,sync-target=192.168.10.255:12345 video.mp4
Slaves (beliebig viele):
mpv --script-opts=sync-role=slave,sync-target=192.168.10.255:12345 video.mp4
Master sendet Commands über UDP Broadcast
Alle Slaves auf dem gleichen Netzwerk empfangen automatisch
Backend wird automatisch gewählt (lua-socket oder socat)
Backend explizit wählen¶
# Nur lua-socket verwenden:
mpv --script-opts=sync-role=master,sync-backend=socket,sync-target=192.168.10.255:12345 video.mp4
# Nur socat verwenden:
mpv --script-opts=sync-role=master,sync-backend=socat,sync-target=192.168.10.255:12345 video.mp4
# Auto-Modus (Standard - versucht socket, dann socat):
mpv --script-opts=sync-role=master,sync-backend=auto,sync-target=192.168.10.255:12345 video.mp4
Master und Slaves mit verschiedenen Backends¶
Funktioniert problemlos! UDP-Pakete sind identisch, egal welches Backend:
# Master mit lua-socket (Debian 13):
mpv --script-opts=sync-role=master,sync-backend=socket video.mp4
# Slave mit socat (Debian 12):
mpv --script-opts=sync-role=slave,sync-backend=socat video.mp4
# Slave mit auto (wählt bestes verfügbares):
mpv --script-opts=sync-role=slave,sync-backend=auto video.mp4
Konfiguration¶
Alle Optionen via --script-opts=sync-OPTION=WERT:
Option |
Standard |
Beschreibung |
|---|---|---|
|
|
|
|
|
Broadcast-Adresse:Port (anpassen an dein Netzwerk!) |
|
|
|
|
|
Sekunden zwischen Position-Updates |
|
|
Sekunden Differenz für Hard Seek |
|
|
Sekunden - unter 20ms = “in sync” |
|
|
Maximale Geschwindigkeitsänderung (50%) |
|
|
Initialer Offset in Sekunden (15ms) |
|
|
Sync-Info auf dem Bildschirm anzeigen |
Beispiel mit Optionen¶
mpv --script-opts=sync-role=slave,sync-target=192.168.1.255:12345,sync-initial_offset=0.025,sync-show_osd=false video.mp4
Permanente Konfiguration¶
Erstelle ~/.config/mpv/script-opts/sync.conf:
role=slave
target=192.168.10.255:12345
backend=auto
initial_offset=0.020
show_osd=yes
Tastenbefehle (nur Slave)¶
Ö (Shift+ö): Offset +5ms erhöhen (Slave läuft später)
Ä (Shift+ä): Offset -5ms verringern (Slave läuft früher)
Nützlich für Audio/Video-Lippensync oder wenn verschiedene Hardware unterschiedliche Latenz hat.
Broadcast-Adresse finden¶
# Zeigt alle Netzwerk-Interfaces mit Broadcast-Adressen:
ip addr show | grep -E "inet.*brd"
# Typische Broadcast-Adressen:
# 192.168.1.255 für Netzwerk 192.168.1.0/24
# 192.168.10.255 für Netzwerk 192.168.10.0/24
# 10.0.0.255 für Netzwerk 10.0.0.0/24
Für lokale Tests:
sync-target=127.0.0.1:12345
(nur auf dem gleichen Rechner, kein Broadcast)
Synchronisations-Algorithmus¶
Progressive Geschwindigkeitsanpassung¶
Das Script verwendet adaptive Geschwindigkeitsanpassung ohne Oszillation:
Zeitdifferenz |
Anpassung |
Beschreibung |
|---|---|---|
< 20ms |
Normal Speed |
IN SYNC - keine Anpassung |
20-50ms |
±5% |
Ultra-feine Anpassung |
50-200ms |
±10% |
Feine Anpassung |
200ms-1s |
±32% |
Moderate Anpassung |
> 1s |
±50% (max) |
Größere Anpassung |
> 5s |
Hard Seek |
Sofortiges Springen |
Vorteil: Sanfte Konvergenz zum Sync-Punkt ohne “Überschwingen”.
Wie funktioniert es?¶
Master sendet alle 0.5s seine Position via UDP Broadcast
Slaves empfangen und vergleichen mit eigener Position
Kleine Differenz (< 5s): Geschwindigkeit anpassen
Große Differenz (> 5s): Hard Seek zur Master-Position
In Sync (< 20ms): Normale Geschwindigkeit
Fehlerbehebung¶
“No backend available!”¶
# Installiere mindestens eins:
sudo apt install lua-socket # Debian 13
sudo apt install socat # Debian 11, 12, 13
lua-socket: “unexpected symbol near char(127)”¶
Das ist ein bekanntes Problem auf Debian 12 - mpv’s eingebautes Lua ist nicht mit der lua-socket Binary kompatibel.
Lösung: Script nutzt automatisch socat als Fallback!
sudo apt install socat
# Script automatisch wählt socat auf Debian 12
Slaves empfangen keine Nachrichten¶
Firewall prüfen:
# UDP Port öffnen (z.B. 12345):
sudo ufw allow 12345/udp
Broadcast-Adresse prüfen:
# Deine Netzwerk-Info anzeigen:
ip addr show
# Beispiel Output:
# inet 192.168.10.50/24 brd 192.168.10.255
# ^^^^^^^^^^^^^^ <- Das ist deine Broadcast-Adresse!
Test mit socat:
# Terminal 1 (Empfänger):
socat UDP4-RECVFROM:12345,broadcast,fork STDOUT
# Terminal 2 (Sender):
echo "test" | socat - UDP4-DATAGRAM:192.168.10.255:12345,broadcast
# Terminal 1 sollte "test" anzeigen
“Port already in use”¶
Nur ein Slave kann auf einem Port lauschen pro Rechner (mit lua-socket). Socat erlaubt mehrere.
Lösung für mehrere Slaves auf einem Rechner:
# Alle Slaves lauschen auf gleichem Port mit socat:
mpv --script-opts=sync-role=slave,sync-backend=socat video1.mp4 &
mpv --script-opts=sync-role=slave,sync-backend=socat video2.mp4 &
Script wird nicht geladen¶
# Prüfen ob mpv das Script sieht:
mpv --msg-level=all=debug video.mp4 2>&1 | grep sync
# Sollte anzeigen:
# [cplayer] Loading scripts...
# [cplayer] Loading script: /path/to/mpv-sync.lua
Beispiel-Setups¶
Setup 1: Ein Master, 120 Slaves im LAN¶
# Master (Debian 13 mit lua-socket):
mpv --script-opts=sync-role=master,sync-target=192.168.1.255:12345 video.mp4
# Alle Slaves (gemischte Debian-Versionen):
for i in {1..120}; do
ssh slave$i "mpv --script-opts=sync-role=slave,sync-target=192.168.1.255:12345 video.mp4" &
done
Setup 2: Zwei Beamer, perfekter Sync¶
# Beamer 1 (Master):
mpv --script-opts=sync-role=master --fs video.mp4
# Beamer 2 (Slave mit 25ms Offset wegen Hardware-Latenz):
mpv --script-opts=sync-role=slave,sync-initial_offset=0.025 --fs video.mp4
# Live-Anpassung: Ö/Ä Tasten für Feintuning
Setup 3: Stereo-Audio mit zwei Lautsprechern¶
# Links (Master):
mpv --script-opts=sync-role=master --audio-channels=stereo --lavfi-complex='[aid1]pan=stereo|c0=c0|c1=c0[ao]' video.mp4
# Rechts (Slave):
mpv --script-opts=sync-role=slave --audio-channels=stereo --lavfi-complex='[aid1]pan=stereo|c0=c1|c1=c1[ao]' video.mp4
Performance¶
lua-socket vs socat¶
Backend |
CPU |
Latenz |
Kompatibilität |
|---|---|---|---|
lua-socket |
~0.1% |
~1ms |
Debian 13 ✓, Debian 12 ✗ |
socat |
~0.5% |
~5ms |
Debian 11/12/13 ✓ |
Empfehlung: Nutze backend=auto - Script wählt automatisch das beste!
Netzwerk-Traffic¶
Master: ~20 Bytes/s (Position-Updates alle 0.5s)
Pro Slave: ~0 Bytes/s gesendet, ~20 Bytes/s empfangen
120 Slaves: Immer noch nur ~20 Bytes/s vom Master (Broadcast!)
Technische Details¶
Nachrichten-Format¶
Einfaches Text-Format über UDP:
play # Play
pause # Pause
seek|123.45 # Seek zu 123.45 Sekunden
position|123.45 # Master Position (alle 0.5s)
speed|1.5 # Geschwindigkeit geändert
Port-Nutzung¶
Master: Bindet an zufälligen Port (nur senden)
Slaves: Binden an konfigurierten Port (z.B. 12345) zum Empfangen
Broadcast: Alle Slaves auf dem Netzwerk empfangen gleichzeitig
Lizenz¶
Frei verwendbar für private und kommerzielle Zwecke.
Changelog¶
Version 1.1¶
Dual Backend: lua-socket + socat Support
Automatisches Backend-Fallback (auto-Modus)
Progressive Geschwindigkeitsanpassung ohne Oszillation
Verbesserte Timing-Parameter (20ms Sync-Threshold)
Version 1.0¶
Initial Release
lua-socket Backend
Basic Synchronisation
Support¶
Bei Problemen:
Log-Output prüfen:
mpv --msg-level=all=info video.mp4 2>&1 | grep syncBackend manuell wählen:
sync-backend=socketodersync-backend=socatFirewall/Netzwerk prüfen (siehe Fehlerbehebung)
Script-Versionen:
mpv-sync-1.0.lua: Nur lua-socketmpv-sync-1.1.lua: Dual Backend (lua-socket + socat)mpv-sync-nc.lua: Nur socat (deprecated, nutze 1.1!)