Video Autoplay on Pi Zero W

Brett’s working on a new RC car featuring an entertainment center. The media’s powered by a Raspberry Pi Zero W. A Waveshare 2 inch LCD currently provides the display. The instructions from Waveshare at the link are actually very good, but the following has a few additional notes and collected links.

Connection

I’m trying to do all this setup without hooking up a keyboard or display. I spent a good while trying to configure networking via USB OTG but that’s still a work-in-progress. So instead I set up WiFi so I could SSH in.

First order of business is imaging the micro-SD card with Raspberry Pi OS using the Raspberry Pi Imager, available for Arch via the AUR. In this article I’m working with:

Linux raspberrypi 5.10.63+ #1459 Wed Oct 6 16:40:27 BST 2021 armv6l GNU/Linux

On the imaged micro-SD card you touch boot/ssh to enable SSH.

In boot on the micro-SD card create the file wpa_supplicant.conf with contents:

country=US # Your 2-digit country code
ctrl_interface=DIR=/var/run/wpa_supplicant GROUP=netdev
network={
    ssid="YOUR_NETWORK_NAME"
    psk="YOUR_PASSWORD"
    key_mgmt=WPA-PSK
}

Display

Next is configuration to enable the display.

Add the following in boot/config.txt on the micro-SD card:

    hdmi_force_hotplug=1
    hdmi_cvt=640 480 60 1 0 0 0
    hdmi_group=2
    hdmi_mode=1
    hdmi_mode=87
    display_rotate=0

Also in boot/config.txt, comment out:

    dtoverlay=vc4-fkms-v3d
    max_framebuffers=2

Pop the micro-SD into the device and boot. If you don’t have Bonjour or Avahi setup to resolve raspberrypi.local, look on your router’s devices table to get the IP address for the Pi. The default login is pi/raspberry. Change the password with passwd to be extra safe.

Enable SPI via raspi-config, under the Interfaces menu, and reboot.

Install the BCM2835 library from AirSpayce.

Install wiringPi. It’s seemingly no longer included in the Pi OS default image or its repositories so you’ll have to download & install manually.

Install and run Waveshare’s demos to make sure the display’s wiring is correct.

Install framebuffer copy and start it running:

sudo apt-get install -y cmake p7zip-full
wget https://www.waveshare.com/w/upload/8/8d/Waveshare_fbcp-main.7z
7z x Waveshare_fbcp-main.7z
cd waveshare_fbcp-main
mkdir build
cd build
cmake -DSPI_BUS_CLOCK_DIVISOR=20 -DWAVESHARE_2INCH_LCD=ON -DBACKLIGHT_CONTROL=ON -DSTATISTICS=0 ..
make -j
sudo ./fbcp &

Install VLC using the vlc package.

In SSH, use cvlc -f movie.mp4 to run the video after uploading it to the device.

 

Autoplay

To have the video autoplay at boot, create the file /etc/xdg/autostart/movie-autoplay.desktop with contents:

  [Desktop Entry]
  Name=Movie Autoplay
  Exec=cvlc -f --loop --no-video-title /home/pi/Videos/autoplay.mp4

You also need to have fbcp start on boot, via adding it to /etc/rc.local (just before exit).

Video Crop

For what it’s worth, the video playing above is captured from YouTube. That video has black borders, which can be measured and cropped out quickly using ffmpeg. Use the cropdetect utility filter to determine the border size:

ffmpeg -i cowboy-bebop.mp4  -vf cropdetect -f null -

This will report a bunch of lines like the following:

[Parsed_cropdetect_0 @ 0x558f57561c00] x1:52 x2:373 y1:0 y2:239 w:320 h:240 x:54 y:0 pts:2156154 t:89.839750 crop=320:240:54:0

The reported crop parameters can then be passed to ffplay to test and ffmpeg to recut the video:

ffplay -vf crop=320:240:54:0 cowboy-bebop.mp4
ffmpeg -i cowboy-bebop.mp4 -vf crop=320:240:54:0 -c:a copy cowboy-bebop-320px.mp4

Splash Screen

To replace the bootloader splash screen, just replace /usr/share/plymouth/themes/pix/splash.png. The image will seemingly work best if it’s 1024×768 even though that’s not the display resolution.