Best way to leverage your existing camera(s) on UDR or Unifi Protect is via Unifi Cam Proxy on GitHub.
It will create a dummy Unifi G3 Micro camera and enable you to use your RTSP (Real Time Streaming Protocol) enabled cameras even if they are not Unifi.
Optimal setup of Unifi Cam Proxy is via Docker on Raspberry Pi with the standard Raspbian OS on Pi.
Remember that if you are doing a clean install of OS on Pi, you will need to have keyboard and screen via HDMI to enable SSH, or you can edit the SSH file before you turn PI on.
Putty is the easiest and best tool to connect to Pi via SSH.
You need to know the IP address of the Pi, check the router screen or if you have it connected via HDMI, just type ifconfig.
Initial Raspberry Pi configuration
Once you have Raspbian OS installed on MicroSD, boot it and make sure you do the basics:
- Change default password (Pi / Raspberry) =
passwd
- Enable Wifi and connect to your local network =
raspi-config
- Update to latest version =
sudo apt update
andsudo apt full-upgrade
- Clean up old packages =
sudo apt clean
Install Docker and Docker Compose on Raspberry Pi
- Check Raspberry Pi OS version =
cat /etc/os-release
- Install Docker using this 1 line command:
curl -sSL https://get.docker.com/ | sh
- Check Docker version =
docker version
- Add user permission to docker group
sudo usermod -aG docker ${USER}
groups ${USER}
- Install Docker Compose
sudo apt-get install libffi-dev libssl-dev
sudo apt install python3-dev
sudo apt-get install -y python3 python3-pip
sudo pip3 install docker-compose
Enable Docker at startup sudo systemctl enable docker
I suggest a sudo reboot
of the Raspberry Pi and a test of Hello World docker run hello-world
and you should get “Hello from Docker!”
UniFi Cam Proxy
Pre requirements includes few steps
1. Self-signed certificate generation created from another UniFi camera or directly from Raspberry Pi OS. These are steps to generate /tmp/client.pem certificate:
openssl ecparam -out /tmp/private.key -name prime256v1 -genkey -noout
openssl req -new -sha256 -key /tmp/private.key -out /tmp/server.csr -subj "/C=TW/L=Taipei/O=Ubiquiti Networks Inc./OU=devint/CN=camera.ubnt.dev/emailAddress=support@ubnt.com"
openssl x509 -req -sha256 -days 36500 -in /tmp/server.csr -signkey /tmp/private.key -out /tmp/public.key
cat /tmp/private.key /tmp/public.key > client.pem
rm -f /tmp/private.key /tmp/public.key /tmp/server.csr
cp /tmp/client.pem /home/pi/Documents/client.pem
cd /home/pi/Documents/
ls
2. Adoption token created in Protect UI page in UDR [valid for 60 minutes from time of generation]
- Open https://{UDR_IP}/protect/devices/add
- Login with your Unifi credential
- Select G3 Micro from “Select device to add” list
- Select “Continue on Web” and type random text in SSID / Password fields
- Click “Generate QR Code”
- Save QR Code as image file
- Upload QR Code to https://zxing.org/w/decode.jspx
- Extract the token above UDR IP in the ‘Raw Text’ field
- Adoption token looks like this: cpZaMhfzmBgAqLIHPR0psvoMp3mvCDtu
3. Confirm RTSP support for your cameras using VideoLan Client VLC -> Network Stream.
For Amcrest cameras, the default local credential is admin / admin and RTSP standard URL has this format rtsp://[username]:password@CAM_IP:554/cam/realmonitor?channel=1&subtype=0
Docker configuration
Make sure you have all pre requirements completed before you move fwd with the docker configuration file:
- Certificate
/home/pi/Documents/client.pem
- Adoption Token
cpZaMhfzmBgAqLIHPR0psvoMp3mvCDtu
- RTSP URL for your camera
rtsp://[username]:password@CAM_IP:554/cam/realmonitor?channel=1&subtype=0
- Docker is working properly and you have permission to run container
Create Docker Compose YAML file in /home/pi/Documents/docker-cameras.yaml
using VI docker-cameras.yaml
version: "3.9"
services:
unifi-cam-proxy-1:
restart: unless-stopped
image: keshavdv/unifi-cam-proxy
volumes:
- "./client.pem:/client.pem"
command: unifi-cam-proxy --host {UDR_IP} --mac {CAM_MAC1} --cert /client.pem --token {Adoption token} rtsp -s rtsp://[username]:password@CAM_IP1:554/cam/realmonitor?channel=1&subtype=0 --ffmpeg-args '-c:v copy -vbsf "h264_metadata=tick_rate=50"'
unifi-cam-proxy-2:
restart: unless-stopped
image: keshavdv/unifi-cam-proxy
volumes:
- "./client.pem:/client.pem"
command: unifi-cam-proxy --host {UDR_IP} --mac {CAM_MAC2} --cert /client.pem --token {Adoption token} rtsp -s rtsp://[username]:password@CAM_IP2:554/cam/realmonitor?channel=1&subtype=0 --ffmpeg-args '-c:v copy -vbsf "h264_metadata=tick_rate=50"'
Start Docker Compose with docker-compose -f
/home/pi/Documents/
docker-cameras.yaml up -d --remove-orphans
Wait for download and extract of all the components needed.
Connect to UDR https://{UDR_IP}/protect/devices/ and verify you can see the cameras:
Stop Docker Compose with docker-compose -f docker-cameras.yaml down
Please note that CPU load is high on Raspberry PI during live streaming, monitor it with top
command:
Optimize CPU load
Amcrest cameras stream using H.265 codec for video and AAC codec for audio as you can review in VLC -> Tools -> Codec Information:
Unifi Cam Proxy settings expect H.264 codec which causes a lot of overload on Raspberry Pi CPU and ffmpeg library to transcode from H.265 to H.264 codec.
Unifi G3 Micro streams in H.264 with bi-directional audio as reported in the quick start guide
Docker command in YAML file provides arguments to ffmpeg library --ffmpeg-args '-c:v copy -vbsf "h264_metadata=tick_rate=50"'
and according to ffmpeg documentation:
-c:v copy
define the codec name and specifically, set FFmpeg to copy the bitstream of the video to the output-vbsf
"h264_metadata=tick_rate=50"
set the video bitstream and codec to H264 [deprecated]
Reducing frame rate and resolution
Amcrest cameras have 2 substreams on channel #1 you can connect:
SubStream | Resolution | Codec | URL |
0 | 1920×1080 @ 30 fps | H.265 hevc with AAC MP4 | rtsp://[usr]:psw@CAM_IP:554/cam/realmonitor?channel=1&subtype=0 |
1 | 640×480 @ 30 fps | H.264 AVC with AAC MP4 | rtsp://[usr]:psw@CAM_IP:554/cam/realmonitor?channel=1&subtype=1 |
Using SubStream #1 which is VGA, instead of SubStream #0 (Full HD) allows to have PI at ~30% CPU load.
Sources:
hi, is this still working with the latest update? I cannot run “https://{UDR_IP}/protect/devices/add” with protect 2.1.2
LikeLiked by 1 person