{"id":31069681,"url":"https://github.com/jonaspoeller/synchronized4kplaybackrpi4","last_synced_at":"2026-05-04T00:32:28.702Z","repository":{"id":309695662,"uuid":"1037233960","full_name":"jonaspoeller/synchronized4kplaybackrpi4","owner":"jonaspoeller","description":"Synchronized 4K HEVC Video Playback for Raspberry Pi","archived":false,"fork":false,"pushed_at":"2025-09-10T13:06:26.000Z","size":47,"stargazers_count":0,"open_issues_count":0,"forks_count":0,"subscribers_count":0,"default_branch":"main","last_synced_at":"2025-09-10T17:20:06.791Z","etag":null,"topics":["4k","digital-signage","h265","hevc","multi-screen-video","python","raspberry-pi","rpi4","seamless-looping","synchronized-playback","udp-broadcast","video-synchronization","video-wall","vlc"],"latest_commit_sha":null,"homepage":"","language":"Shell","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/jonaspoeller.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":null,"dco":null,"cla":null}},"created_at":"2025-08-13T09:08:56.000Z","updated_at":"2025-09-10T13:06:29.000Z","dependencies_parsed_at":null,"dependency_job_id":"3df48fb7-0536-48c9-b4d2-6131237f679b","html_url":"https://github.com/jonaspoeller/synchronized4kplaybackrpi4","commit_stats":null,"previous_names":["jonaspoeller/synchronized4kplaybackrpi4"],"tags_count":0,"template":false,"template_full_name":null,"purl":"pkg:github/jonaspoeller/synchronized4kplaybackrpi4","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/jonaspoeller%2Fsynchronized4kplaybackrpi4","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/jonaspoeller%2Fsynchronized4kplaybackrpi4/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/jonaspoeller%2Fsynchronized4kplaybackrpi4/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/jonaspoeller%2Fsynchronized4kplaybackrpi4/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/jonaspoeller","download_url":"https://codeload.github.com/jonaspoeller/synchronized4kplaybackrpi4/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/jonaspoeller%2Fsynchronized4kplaybackrpi4/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":275327138,"owners_count":25445050,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","status":"online","status_checked_at":"2025-09-15T02:00:09.272Z","response_time":75,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["4k","digital-signage","h265","hevc","multi-screen-video","python","raspberry-pi","rpi4","seamless-looping","synchronized-playback","udp-broadcast","video-synchronization","video-wall","vlc"],"created_at":"2025-09-15T22:01:51.444Z","updated_at":"2025-10-16T10:02:01.593Z","avatar_url":"https://github.com/jonaspoeller.png","language":"Shell","funding_links":[],"categories":[],"sub_categories":[],"readme":"# Synchronized Video Playback for Raspberry Pi\n\nA solution for synchronized, looping video playback across multiple Raspberry Pi 4 devices. This system is designed for continuous 24/7 operation in settings like video walls or art installations.\n\n## Key Features\n\n*   **Playback Synchronization:** Coordinates video playback across multiple devices using a master-slave architecture.\n*   **Master Failure Recovery:** A watchdog on each slave reverts to a black screen if the master's signal is lost.\n*   **Automatic Slave Integration:** Slave nodes that are started late are automatically included in the next playback loop.\n*   **Hardware-Accelerated Playback:** Supports 4K/60fps 8-bit HEVC video decoding.\n*   **Professional Appliance Mode:** The screen remains completely black from power-on until video playback begins. No boot text, logos, or console prompts are ever displayed.\n*   **Multi-Group Support:** Allows multiple, independent player groups to operate on the same network.\n*   **Automated Setup:** An interactive script handles system configuration and dependency installation.\n\n---\n\n## How It Works\n\nThe system uses a Master-Slave model where a single Master node controls multiple Slave nodes via unidirectional UDP broadcast packets. Synchronization is enforced by the Master broadcasting a strict command sequence (`stop` -\u003e `load` -\u003e `prepare` -\u003e `play`) at the beginning of each loop. This state-based approach, combined with a watchdog on each slave, ensures reliability and allows for the automatic integration of newly started devices.\n\n---\n\n## Prerequisites\n\n*   2 or more Raspberry Pi 4 devices.\n*   A fresh installation of **Raspberry Pi OS (64-bit) Bookworm** on each SD card.\n*   A stable, wired (Ethernet) network connection.\n*   Each Pi must have a unique, fixed IP address.\n*   The video file, named `video.mp4`, must be located in `/home/pi/` on every device.\n\n---\n\n## Installation\n\nThe installation is a step-by-step process. The following must be performed on **every** Pi (both Master and Slaves). The setup will do a full apt upgrade and reboot afterwards. This is to avoid problems caused by outdated drivers.\n\n#### Step 1: Prepare the System\n\nBefore running the installer, each device must be properly configured.\n\n1.  **Set a Static IP Address:** A static IP is essential for system stability. This can be done via the command line using `nmcli`.\n    *   First, find your connection name (usually `\"Wired connection 1\"`):\n        ```bash\n        nmcli connection show\n        ```\n    *   Use the following command to set the static IP, gateway, and DNS. **Replace the example values with your network's settings.**\n        ```bash\n        sudo nmcli c mod \"Wired connection 1\" ipv4.method manual \\\n        ipv4.addresses 10.0.0.220/24 \\\n        ipv4.gateway 10.0.0.1 \\\n        ipv4.dns \"8.8.8.8,1.1.1.1\"\n        ```\n    *   Apply the changes by restarting the connection:\n        ```bash\n        sudo nmcli c down \"Wired connection 1\"; sudo nmcli c up \"Wired connection 1\"\n        ```\n        A reboot will also apply the settings. Verify the new IP with `ip a`.\n\n2.  **Place the Video File:** Copy your video file to the home directory of each Pi. The system expects the file at this exact location:\n    `/home/pi/video.mp4`\n#### Step 2: Run the Automated Installer\n\nOnce the static IP is set and the video file is in place, run the automated setup script.\n\n1.  **Download the Installer Script**\n    ```bash\n    wget https://github.com/jonaspoeller/synchronized4kplaybackrpi4/releases/latest/download/setup_video_sync.sh\n    ```\n\n2.  **Execute the Installer Script**\n    ```bash\n    sudo bash setup_video_sync.sh\n    ```\n#### Step 3: Follow the Interactive Prompts\n\nThe script will guide you through the final configuration by asking for:\n*   The static IP address of the current device.\n*   The network port for this sync group (e.g., `5555`).\n*   The role of the device (Master or Slave).\n*   The IP address of the Master (if configuring a Slave).\n\n\nThe device will reboot automatically upon completion. After the reboot, the system is fully configured and will start playback automatically.\n\n---\n\n## Configuration\n\n### Master Configuration\n\nPath: `/opt/video-sync/sync_config.ini` on the Master\n\n```ini\n[network]\nmaster_ip = 192.168.1.10\nbroadcast_ip = 192.168.1.255\nsync_port = 5555\n\n[video]\nfile_path = /home/pi/video.mp4\nloop_delay = 0.5\n```\n\n- **loop_delay:** Pause in seconds between the end of one video loop and the start of the next.\n\n---\n\n### Slave Configuration\n\nPath: `/opt/video-sync/sync_config.ini` on a Slave\n\n```ini\n[network]\nmaster_ip = 192.168.1.10\nsync_port = 5555\n```\n\n---\n\n## Usage \u0026 Management\n\n```bash\nvideo-sync-start    # Start the service\nvideo-sync-stop     # Stop the service\nvideo-sync-status   # Check the service status\nvideo-sync-logs     # View live logs\n```\n\n---\n\n## Uninstallation\n\n```bash\nwget -O - https://github.com/jonaspoeller/synchronized4kplaybackrpi4/releases/latest/download/uninstall_video_sync.sh | sudo bash\n```\n\nThe script will clean up all files and services and reboot the Pi back into the standard graphical desktop environment.\n\n---\n## Project Links\n\n*   **[Source Code and All Files](https://github.com/jonaspoeller/synchronized4kplaybackrpi4)**\n*   **[Releases (Downloads)](https://github.com/jonaspoeller/synchronized4kplaybackrpi4/releases)**\n*   **[Report an Issue (Issues)](https://github.com/jonaspoeller/synchronized4kplaybackrpi4/issues)**\n\n---\n\n## License\n\nThis project is licensed under the MIT License. See the LICENSE file for details.\n\n© 2025 Jonas Pöller\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fjonaspoeller%2Fsynchronized4kplaybackrpi4","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fjonaspoeller%2Fsynchronized4kplaybackrpi4","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fjonaspoeller%2Fsynchronized4kplaybackrpi4/lists"}