The Video Wall
(In Progress)
The Build
Next to the starfield, this is the thing people ask the most about.
The design of the frame is simple enough. It's basically just a shadow box. Each porthole has a monitor behind it.
For PiWall, there's good guides out there. This is how I do, but I'll link to how others do below.
The Electronics
PiWall is a software package that allows you to broadcast video to a network of connected Raspberry Pi computers. This eliminates the need to have multiple video cards, and makes node placement easy.
Since there's one RPi per monitor plus one broadcast RPi, this build required four of them. One for each monitor and the broadcast.
Wiring is entirely straightforward. One RPi to a monitor, and all the RPis on the same layer 2 broadcast domain. In this case just a basic dumb network switch.
Since taking this pic, I've moved to a Power-Over-Ethernet design, which has removed the need for so many power plugs, but that's mostly just cosmetic.
YOU CANNOT RUN THIS OVER WIFI. IT MUST BE ON A PRIVATE PHYSICAL ETHERNET NETWORK.
Wifi really, really doesn't play well with broadcast traffic. At best you'll slow down the rest of your network, but chances are your access point or router just won't be able to broadcast the stream and this just won't work at all.
You also really, really want this to be on a PRIVATE network. If you just plug into your wifi network router's switch, the broadcast stream is going to cause problems and/or your other devices broadcast traffic will interfere with this stream.
The Software
This is where it gets a little harder.
There are reasonably good instructions on the PiWall forums here, but they were posted in 2018. libav-tools and related capabilities are rolled into ffmpeg now, for example.
There's a very good, up to date (as of 2022) guide here as well.
Since others have gone into great detail, I don't need to, and I'll mostly just record the stuff I need to remember for myself. Since things like installing Raspbian and enabling wifi are easily found online, I'm not going to repeat it. This really needs some Linux knowledge, and I assume you have that.
I am writing this up in 2023. PiWall has been unmaintained since at least 2013. It's forked from a package called OMXPlayer which has been deprecated, and will be removed from future Raspbian repositories, likely to include dependent libraries. Debian Bullseye has already broken PiWall. I found a fix for that, but who knows if it'll work with the next release?
Buster is the last Raspbian release that can natively support PiWall. Bullseye can be patched in, but no promises about the future. If you're reading this in 2025 and it won't work, that may very well be your problem.
I'm pretty sure that future versions of the RPi hardware simply won't work, as the hardware changes are a large part of why omxplayer has been abandoned. (The fact that you can't even get new RPi's in 2023 due to a cHiP sHoRtAgE is beside the point, but similarly concerning.)
Raspberry Pi OS Configuration - Master
The first step is to create a source for your video streams. In this case, I used another Raspberry Pi, but anything that can run ffmpeg or VLC or OBS should work. The guide linked above shows how to use a Mac and OBS. Note that even if you're not using a Raspberry Pi, you'll need to configure a static route to the broadcast network over a physical ethernet port as described below.
Since this is a private home installation, I skip a whole lot of security stuff. If you share your wifi with strangers or this is a commercial installation, make sure you harden the OS.
Install the OS:
Nothing special has to be done to install Raspbian, but you'll need SSH enabled, and it's much easier to do this over wifi than it is physical ethernet. You should also have the network plugged into a switch, ideally a private network with no DHCP. Run apt update && apt dist-upgradeInstall prerequisite packages:
$ sudo apt install -y ffmpegCreate a static route to a broadcast network bound to the physical network port (called eth0):
$ sudo sh -c 'echo "ip route add 224.0.0.0/4 dev eth0" >> /etc/dhcpcd.exit-hook'Create a new private network segment on eth0. Make sure this is not the same network as your wifi. If you're connecting to SSH via a physical switch, you'll need to bind this to a new virtual ethernet port (e.g. eth0:1), but I'll assume if you understand that, you don't need these instructions.
$ sudo sh -c 'cat <<EOF>> /etc/dhcpcd.conf
interface eth0
static ip_address=192.168.100.11/24
EOF'
The above works if you haven't touched your config already. My Wifi network is 192.168.1.0/24, and I arbitrarily used 192.168.100.0/24 as the private network. My personal networking habit is to reserve 1-10 on any network for services, so I used .11 as the node IP. It doesn't matter, so long as it's separate from your real network.Create a user if desired. There's not a great reason not to use the default "pi" user for this, but my habit is to create a new user to run the stream. If you do, make sure they're in all the same groups as Pi or you'll get permission denied access devices.
Reboot, and assuming you're able to log in again, make sure the networking is as expected:
$ ip addr show dev eth0
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
link/ether b8:27:eb:b1:cf:d0 brd ff:ff:ff:ff:ff:ff
inet 192.168.100.11/24 brd 192.168.100.255 scope global noprefixroute eth0
valid_lft forever preferred_lft forever
inet6 fe80::3e96:e6b8:4dd5:e80b/64 scope link
valid_lft forever preferred_lft forever
$ ip route
default via 192.168.1.1 dev wlan0 proto dhcp src 192.168.1.199 metric 303
192.168.1.0/24 dev wlan0 proto dhcp scope link src 192.168.1.199 metric 303
192.168.100.0/24 dev eth0 proto dhcp scope link src 192.168.100.11 metric 202
224.0.0.0/4 dev eth0 scope link
Validate that the bold sections in the above match what you entered for net/ip/mask, and your raspberry pi streamer is ready to go.
Raspberry Pi OS Configuration - Tiles
The PiWall software used for this project refers to each screen as a "tile", and therefore we call each attached RPi a "tile."
Note, you need one raspberry Pi per monitor in your piwall. You can have as many monitors as you can power, so long as you have a Raspberry Pi attached to it. The Raspberry Pi 4 has dual HDMI outputs. Don't be clever here, that won't work.
The PiWall software has been unmaintained since at least 2016.
Each tile will have near-identical configurations. The only thing to do differently on each is give them a unique hostname and IP address.
Install the OS:
Nothing special has to be done to install Raspbian on a Pi3 but you'll need SSH enabled. You should also have the network plugged into a switch. Run apt update && apt dist-upgrade.
You can do most of the OS configuration over SSH via wifi. However, once configured I run these with Wifi disabled for performance reasons.
On a Pi 4, you'll need to make some changes to /boot/config.txt. I haven't tried that, so I won't confirm here. Check this guide for details.
Create a static route to a broadcast network bound to the physical network port (called eth0):
$ sudo sh -c 'echo "ip route add 224.0.0.0/4 dev eth0" >> /etc/dhcpcd.exit-hook'Configure static IP addresses in the same subnet as above, bound to the physical network port.
$ sudo sh -c 'cat <<EOF>> /etc/dhcpcd.conf
interface eth0
static ip_address=192.168.100.XX/24
EOF'
Change XX above to some other number between 12 and 254, and make it different for each tile.
Reboot and validate the changes
$ ip addr sh dev eth0
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
link/ether b8:27:eb:6f:63:7e brd ff:ff:ff:ff:ff:ff
inet 192.168.100.27/24 brd 192.168.100.255 scope global noprefixroute eth0
valid_lft forever preferred_lft forever
inet6 fe80::4893:d916:8a07:fba6/64 scope link
valid_lft forever preferred_lft forever
$ ip route
192.168.100.0/24 dev eth0 proto dhcp scope link src 192.168.100.27 metric 202
224.0.0.0/4 dev eth0 scope link
Install dependencies
$ sudo apt install libegl1-mesa-dev
If you're on Bullseye, there is a package available to replace missing libraries.
$ sudo wget https://github.com/hitesh83/pwomxplayer-support/archive/refs/heads/main.zip
$ unzip main.zip
$ cd pwomxplayer-support-main
$ sudo ./install_lib.sh
Download and install the piwall software
$ wget http://dl.piwall.co.uk/pwlibs1_1.1_armhf.deb
$ wget http://dl.piwall.co.uk/pwomxplayer_20130815_armhf.deb
$ sudo dpkg -i pwlibs1_1.1_armhf.deb
$ sudo dpkg -i pwomxplayer_20130815_armhf.deb
If dpkg complains about dependencies, you may need to use $ sudo apt install *.deb. If that doesn't work you'll need to resolve your dependencies, which isn't in scope of this. (Though start by enabling the archive repo in /etc/apt/sources.list.)
If it installed, try typing "pwomxplayer -h". If you get the help text, it's at least installed.
(To be continued)