Table of Contents

Raspberry Pi Camera on ZoneMinder

I spent a lot of time trying to find some good software to run on a Raspberry Pi to turn it into a camera. Even tried to write my own using Perl, but all the libraries are in Python, so it took too much for a simple project.

I found the v4l2rtspserver (https://github.com/mpromonet/v4l2rtspserver) and decided to try it. The author has a good page, but assumes I knew how to configure ZoneMinder (which was mistaken).

Anyway, no GUI needed, so I did the Raspberry Pi OS Lite (https://www.raspberrypi.org/software/operating-systems/) and set it up, then did the following. Ended up with a pretty decent camera that is not “phoning home” with all your images.

Get raspbian image onto SD

  1. Download the Lite version of Raspbian from https://www.raspberrypi.org/downloads/raspbian/
  2. write the downloaded image to the micro-sd (do not uncompress)
  3. mount /boot from SD onto /mnt
touch /mnt/boot/ssh # enable ssh
# only do the following if you need wifi. Change country code, ssid and psk for your system
# see [[https://www.raspberrypi.org/documentation/configuration/wireless/headless.md]]
cat <<EOF >/mnt/boot/wpa_supplicant.conf
ctrl_interface=DIR=/var/run/wpa_supplicant GROUP=netdev
update_config=1
country=<Insert country code here>
 
network={
 ssid="<Name of your WiFi>"
 psk="<Password for your WiFi>"
}
EOF

Insert SD into your Pi and boot up.

Configure Raspberry Pi

Enable wlan by adding the following to /etc/wpa_supplicant/wpa_supplicant.conf

country=US
network={
   ssid="your ssid"
   psk="your psk"
}

Now, do the install

# Set up Camera
raspi-config # go to Interface, and enable camera
reboot
ls -lh /dev/video*
raspistill -v -o test.jpg # Verify camera works
# Remove Swap File
sudo systemctl stop dphys-swapfile.service
sudo systemctl disable dphys-swapfile.service
sudo systemctl mask dphys-swapfile.service
sudo rm /var/swap
# add zram for swap
sudo apt-get install zram-tools
sed -i 's\.*ALLOCATION=.*\ALLOCATION=100\g' /etc/default/zramswap
sudo systemctl enable zramswap
sudo systemctl restart zramswap
# Set up ntp
sudo apt-get install ntp
sudo timedatectl set-timezone America/Chicago
# add base packages needed
sudo apt install \
liblivemedia-dev liblog4cpp5-dev libasound2-dev git gdebi-core cmake build-essential v4l-utils
# get and build v4l2...
git clone https://github.com/mpromonet/v4l2rtspserver
cd v4l2rtspserver
cmake .
make
sudo make install
# do the install
sudo gdebi v4l2rtspserver-0.2.0-6-g3542b6f-Linux-armv6l.deb
# create systemd module
cat <<EOF >/etc/systemd/system/v4l2rtspserver.service
# systemd configuration for v4l2rtspserver
# /etc/systemd/system/v4l2rtspserver.service
 
[Unit]
Description=v4l2rtspserver rtsp streaming server
After=network.target
 
[Service]
#ExecStartPre=/usr/bin/v4l2-ctl --set-ctrl vertical_flip=1
ExecStartPre=/usr/bin/v4l2-ctl --set-ctrl h264_i_frame_period=5
ExecStart=/usr/local/bin/v4l2rtspserver -F 5 -W 1280 -H 720
#ExecReload=/bin/kill -HUP $MAINPID
Type=simple
User=root
Group=video
Restart=always
 
[Install]
WantedBy=multi-user.target
EOF
 
# enable the service
sudo systemctl enable --now v4l2rtspserver.service

At this point, you should be able to get an rtsp by pointing vlc to rtsp://{pi zero ip}:8554/unicast

Zoneminder Configuration

Create a new monitor in ZoneMinder with the following parameters

You should soon see the output in zoneminder.

Production

For production, change the resolution of both the camera and the ZoneMinder configuration

  1. Edit /etc/systemd/system/v4l2rtspserver.service
    1. Change -W and -H (width and height) to your desired parameters
      1. 1920 x 1080 (1080p) Gives you a lot of details, but also transfers a lot of traffic and is fuzzy
      2. 1280 x 720 (720p) Is a lot lower bandwidth and “prettier” picture
      3. # reload the systemctl daemon
        systemctl daemon-reload
        # reload the config for v4l2rtspserver
        systemctl restart v4l2rtspserver
        # Set v4l2rtspserver to autostart
        systemctl enable v4l2rtspserver
  2. Edit Monitor on ZoneMinder
    1. Set Capture Resolution to same values as camera