Saturday, February 07, 2026

One Cable, Many Screens: A Self-Hosting PoE Raspberry Pi 4 Infotainment System

This is version 2 of my multi-screen Raspberry Pi infotainment project. The first version (DIY In-Car Infotainment) required a separate pocket router for DHCP, DNS, and DLNA. This version eliminates that dependency — one prebuilt SD card image works for all terminals, and the system configures itself automatically at boot.

Last updated: February 9, 2026

What's New in v2.1

  • Touch-friendly OSD controls — New "Sync" and "Stop All" buttons in Kodi's video player OSD. Tap the screen to show controls, tap Sync to synchronize all screens.
  • Master-only visibility — OSD sync buttons automatically hide on slave devices (only visible on master with USB mounted).
  • Keyboard shortcut — Press 'S' during video playback to trigger sync immediately.
  • No startup prompts — Pre-configured Addons database eliminates "Do you want to enable this addon?" popups.
  • Accurate device count — Fixed duplicate localhost counting (shows correct 3/3 instead of 4/4).
  • Minimal dual-screen setup — Just two Pi4s connected with a direct Ethernet cable — no PoE switch needed for small deployments.

v2.0 features: Self-hosted DHCP/DNS/NTP/DLNA on master Pi, automatic master election via USB detection, one SD card image for all terminals.

Minimal Dual-Screen Setup

For a quick two-screen deployment, you don't need a PoE switch — just connect two Pi4s directly with an Ethernet cable:

Minimal dual-screen setup: two Raspberry Pi 4 terminals connected directly with an Ethernet cable, master with USB storage

Minimal setup: Two Pi4s connected directly via Ethernet. The Pi with USB storage becomes master automatically.

What you need:

  • 2× Raspberry Pi 4 with touch displays
  • 2× MicroSD cards (same image on both)
  • 1× Ethernet cable (any length, crossover not required)
  • 1× USB storage with media files
  • 2× Power supplies (5V/3A each)

How it works:

  1. Download the pre-built SD card image (v2.1) and flash it to both cards using balenaEtcher or Rufus
  2. Connect the two Pi4s with a standard Ethernet cable
  3. Attach USB storage to one Pi (this becomes the master)
  4. Power on both — master provides DHCP, DLNA, and NTP to the slave
  5. Both terminals launch Kodi and show the DLNA media library

From here, use the touch-screen OSD controls to sync playback across both screens.

Scaling up? Add a PoE switch for 3+ screens — see Multi-Screen Setup (3+ Screens with PoE Switch) below.

Multi-Screen Setup (3+ Screens with PoE Switch)

Raspberry Pi 4 multi-screen infotainment system setup diagram showing PoE switch, master terminal with USB, and client terminals

System diagram: One master Pi (with USB media) provides DHCP, DNS, NTP, and DLNA to all client terminals via a PoE switch.

A typical deployment uses:

  • 1 master Pi4 terminal (with USB media attached)
  • 3 client Pi4 terminals
  • 1 PoE switch (5-port or larger)

The topology is a pure star connection: every terminal connects directly to the PoE switch via a single Ethernet cable that provides both power and network. No AV matrix or special head-end hardware required.

How It Works

  1. PoE switch powers on
  2. All Pi4 terminals boot from identical SD cards
  3. Each terminal checks for USB storage
  4. The terminal with USB media becomes the master automatically
  5. Master starts DHCP (192.168.8.100-200), DNS, NTP, and DLNA services
  6. Client terminals get their IP address, time sync, and media access from master
  7. All terminals launch Kodi and connect to the DLNA source
  8. Users choose Personal Mode or Sync Mode

Two Operating Modes

Personal Mode

Each user gets their own screen and audio path:

  • Analog headset via 3.5mm jack, or
  • Bluetooth headset

This feels similar to in-flight seatback entertainment. Each passenger independently browses the DLNA media library in Kodi and plays whatever they want.

Sync Mode

When shared viewing is needed, the master terminal can synchronize all clients using touch-screen OSD controls:

  1. Start playing a video on the master (the Pi with USB storage)
  2. Tap the screen (or press any key) to show the OSD
  3. Tap Sync — all screens open the same video at the same position
  4. Tap Stop All — stops playback on all screens simultaneously
Kodi OSD showing custom Media-Mux Sync and Stop All buttons for synchronized multi-screen playback control

Kodi video player OSD on master device showing the custom Sync and Stop All buttons (highlighted). These buttons only appear on the master Pi.

Keyboard shortcut: Press 'S' during video playback to trigger sync immediately without showing the OSD.

Non-touch displays? Connect a mini 3-key USB keyboard to the master. Press KEY_1 to sync, KEY_2 to stop all. The OSD buttons are hidden on slave devices — only the master shows them.

Master audio can feed a central sound system (vehicle speakers, room PA, etc.) for group viewing.

Hardware List

For a 4-terminal setup:

Component Qty Notes
Raspberry Pi 4 (4GB) 4 2GB works but 4GB recommended
PoE HAT 4 Official or compatible 802.3af HAT
MicroSD card (32GB+) 4 Class 10 or faster
Full HD touch display 4 7" to 10" HDMI displays work well
PoE switch 1 5-port minimum, 802.3af/at
Ethernet cables 4 Up to 50m runs supported
USB storage 1 NTFS, FAT32, or ext4 formatted
3-key USB keyboard (optional) 1 Only needed for non-touch displays; touch screens use OSD buttons

Compared to v1, you no longer need the GL-MT300N-V2 pocket router — the master Pi handles all network services.

Real-World Use Cases

In-Car / Fleet Passenger Infotainment

Ideal for vehicles with multiple passengers:

  • Each passenger watches independent content with personal audio
  • One key press switches everyone to synchronized shared playback
  • Master audio routes to vehicle speakers for group viewing

Gives both freedom (personal playback) and coordination (sync playback) in one system.

Multi-Room Shared Viewing

Use case diagram showing multi-room shared viewing with synchronized screens in overflow rooms

Multi-room use case: synchronized playback across overflow rooms, halls, or training centers.

For venues where people are spread across rooms:

  • House of worship overflow rooms
  • Community halls
  • Training centers
  • Small campuses

A single PoE star network keeps wiring simple and operations predictable.

Quick Start

Option 1: Pre-built Image (Recommended)

  1. Download the pre-built SD card image (v2.1) (~1.2GB)
  2. Flash the image to all SD cards using balenaEtcher or Rufus
  3. Insert SD cards into Pi4 terminals
  4. Connect all terminals to PoE switch
  5. Insert USB media (NTFS, FAT32, or ext4) into one terminal
  6. Power on the PoE switch
  7. Wait for all terminals to boot into Kodi

Option 2: Manual Installation

On an existing Raspberry Pi OS Lite installation:

git clone https://github.com/hackboxguy/media-mux.git
cd media-mux
sudo ./setup.sh
# System reboots after base installation

# After reboot, login again and run:
cd media-mux
sudo ./setup-selfhosted.sh
sudo reboot

Troubleshooting

DLNA source shows "Couldn't connect to network server"

  • Check if master terminal has USB media attached
  • Verify minidlna is running: pgrep -f minidlnad
  • Check master log: cat /var/log/media-mux-selfhosted.log
  • Ensure USB is mounted: mount | grep /media/usb

Client terminal not getting IP address

  • Verify master booted first and has USB attached
  • Check dnsmasq is running on master: systemctl status dnsmasq
  • Try rebooting the client terminal

Time is wrong on client terminals

  • Wait a few minutes after boot for NTP sync
  • Check chrony status: chronyc sources
  • Verify master chrony is running: pgrep -f chronyd

Sync playback not working

  • Ensure you are triggering sync from the master (the Pi with USB storage)
  • Touch screen: Tap screen to show OSD, tap Sync button
  • Keyboard: Press 'S' during playback, or KEY_1 on 3-key keyboard
  • Check kodisync log on master: cat /var/log/kodisync.log
  • Verify all clients are on the same network (192.168.8.x)

OSD Sync/Stop buttons not visible

  • Buttons only appear on the master (Pi with USB storage attached)
  • Slave devices do not show these buttons by design
  • If master doesn't show buttons, verify USB is mounted: mount | grep /media/usb

USB media not detected

  • Supported formats: NTFS, FAT32, ext4
  • Check dmesg for USB detection: dmesg | grep -i usb
  • Try a different USB port or cable

Current Limitations

The system works reliably for practical deployments, but there are areas for future improvement:

  • No automatic master failover if master is disconnected
  • No web dashboard for status monitoring
  • Role is determined by USB presence (no manual pinning)

SOURCE CODE

github.com/hackboxguy/media-mux — pre-built images and release notes in Releases section

No comments: