This guide should work on the following hardware:
The Raspberry Pi 5 does not have a hardware video encoder so you would need to make some configuration changes.1
Use the following commands to download and install the latest go2rtc release for your version of Raspberry Pi OS.2
if [[ $(uname -m) = aarch64 ]]; then ver=arm64; else ver=armv6; fi
wget https://github.com/AlexxIT/go2rtc/releases/latest/download/go2rtc_linux_$ver
sudo mv ./go2rtc_linux_$ver /usr/local/bin/go2rtc
sudo chmod +x /usr/local/bin/go2rtcImportant note: The minimum ffmpeg version is 5.0 (check with ffmpeg -version). Older versions of Raspberry Pi OS have an outdated ffmpeg package so you may have to install it manually.
There are several ways to do this but I prefer the builds and instructions available here: https://johnvansickle.com/ffmpeg
Create the following two files. Substitute your local user name (e.g. pi) for [USER] in both the file locations as well as in the go2rtc.env and go2rtc.service files.
I have this configured for a Raspberry Pi Camera and a USB camera. You'll probably want to delete the picam_h264 line unless you're using a Raspberry Pi Camera. Replace the path after video= with the path to your camera, which you should have from configuring Crowsnest.
File: /home/[USER]/printer_data/config/go2rtc.yaml
streams:
linux_usbcam: ffmpeg:device?video=/dev/v4l/by-id/usb-Ruision_UVC_Camera_20200623-video-index0&input_format=yuyv422&w=1280&h=720#video=h264#hardware
picam_h264: exec:libcamera-vid --width 1640 --height 1232 --awb daylight --sharpness 6.0 --ev 10 --exposure sport -t 0 --inline -o -
ffmpeg:
h264: "-vcodec h264_v4l2m2m -b:v 6M -an"
api:
origin: "*"File: /home/[USER]/printer_data/systemd/go2rtc.env:
GO2RTC_ARGS="-config /home/[USER]/printer_data/config/go2rtc.yaml"Create the following file. You'll need to use sudo for this. If your username isn't pi, set your actual username after User=.
File: /etc/systemd/system/go2rtc.service:
[Unit]
Description=go2rtc for webcam streaming
After=udev.service network-online.target nss-lookup.target
Wants=udev.service network-online.target
StartLimitBurst=10
StartLimitIntervalSec=180
[Install]
WantedBy=multi-user.target
[Service]
Type=simple
User=pi
RemainAfterExit=Yes
EnvironmentFile=/home/[USER]/printer_data/systemd/go2rtc.env
ExecStart=/usr/local/bin/go2rtc $GO2RTC_ARGS
Restart=on-failure
RestartSec=5
Nice=10
IOSchedulingClass=idle
IOSchedulingPriority=7
CPUWeight=20
AllowedCPUs=1-2
MemoryMax=250MYou should end up with the following file structure:
/
├── etc
│ └── systemd
│ └── system
│ └── go2rtc.service
└── home
└── [USER]
└── printer_data
├── systemd
│ └── go2rtc.env
└── config
└── go2rtc.yamlNow you can start go2rtc by running
sudo systemctl start go2rtcThe go2rtc web interface is at http://YOUR_IP_ADDRESS:1984/
Your camera should be listed. Check the stream link in the row for linux_usbcam. If something isn't working, you'll have to troubleshoot, starting with the streams entry in go2rtc.yaml. You can use the Config button at the top of the go2rtc web interface to do this.
Once everything is working, you can enable the systemd service so that it starts on every boot.
sudo systemctl enable go2rtcMake sure you select WebRTC (go2rtc) as the service and use the following URL for the stream, replacing the ALL_CAPS text with your IP address or URL:
http://YOUR_IP_ADDRESS:1984/stream.html?src=linux_usbcam&mode=webrtcThis is URL for snapshots:
http://YOUR_IP_ADDRESS:1984/api/frame.jpeg?src=linux_usbcamAt a minimum you'd need to use a different vcodec for ffmpeg in go2rtc.yaml. I don't have a Pi 5 to test it but it looks like you can remove replace h264_v4l2m2m with libx264. You should probably also remove #hardware from the end of the linux_usbcam line. ↩
This should work in bash and zsh. It will not work in fish, but if you're using that you likely understand enough of what's happening to modify the command on your own to make it work. Or you can launch bash then run the command as-is. ↩