Skip to content

Commit 3853009

Browse files
committed
Multicam now works
1 parent 6fa5b67 commit 3853009

17 files changed

Lines changed: 267 additions & 115 deletions

.gitignore

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,2 +1,2 @@
11
workspace
2-
scripts/files/camera-streamer.zip
2+
scripts/files/camera-streamer/camera-streamer.zip

scripts/03-update-libcamera-apps

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,4 +6,4 @@ export LC_ALL=C
66
source /common.sh
77
install_cleanup_trap
88

9-
apt-get install --yes --only-upgrade libcamera-apps-lite
9+
apt-get install --yes libcamera-apps-lite

scripts/10-install-camera-streamer

Lines changed: 22 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -6,8 +6,10 @@ export LC_ALL=C
66
source /common.sh
77
install_cleanup_trap
88

9+
# install dependencies
910
apt-get install --yes libavformat-dev libavutil-dev libavcodec-dev libcamera-dev liblivemedia-dev v4l-utils pkg-config xxd build-essential cmake libssl-dev
1011

12+
# install camera-streamer
1113
cp /files/camera-streamer/camera-streamer.zip /tmp/camera-streamer.zip
1214
unzip /tmp/camera-streamer.zip -d /tmp/camera-streamer
1315
rm /tmp/camera-streamer.zip
@@ -18,25 +20,35 @@ pushd /tmp/camera-streamer/camera-streamer
1820
popd
1921
rm -rf /tmp/camera-streamer
2022

23+
# enable camera auto-detection
2124
sed -i 's/^camera_auto_detect=0/camera_auto_detect=1/' /boot/config.txt
2225

23-
cp /files/camera-streamer/camera-streamer.conf /boot/camera-streamer.conf
26+
# install default configs
27+
mkdir -p /boot/camera-streamer
28+
cp /files/camera-streamer/libcamera.conf /boot/camera-streamer/libcamera.conf
29+
cp /files/camera-streamer/usb.conf /boot/camera-streamer/usb.conf
2430

31+
# install libcamera service
2532
cp /files/camera-streamer/camera-streamer-libcamera.service /etc/systemd/system/camera-streamer-libcamera.service
2633
systemctl enable camera-streamer-libcamera.service
2734

28-
cp /files/camera-streamer/camera-streamer-usb.service /etc/systemd/system/camera-streamer-usb.service
29-
systemctl enable camera-streamer-usb.service
35+
# install USB camera service
36+
cp /files/camera-streamer/camera-streamer-control /root/bin/camera-streamer-control
37+
chmod +x /root/bin/camera-streamer-control
3038

31-
cp /files/camera-streamer/camera-streamer-usb.path /etc/systemd/system/camera-streamer-usb.path
32-
systemctl enable camera-streamer-usb.path
39+
cp /files/camera-streamer/camera-streamer-usb@.service /etc/systemd/system/camera-streamer-usb@.service
40+
cp /files/camera-streamer/camera-streamer-usb@.path /etc/systemd/system/camera-streamer-usb@.path
41+
cp /files/camera-streamer/camera-streamer.service /etc/systemd/system/camera-streamer.service
3342

34-
# prepare multicam template folder
35-
cp /files/camera-streamer/camera-streamer-usb-multi@.service /etc/systemd/system/camera-streamer-usb-multi@.service
36-
systemctl enable camera-streamer-usb.service
43+
systemctl enable camera-streamer.service
3744

38-
mkdir -p /boot/camera-streamer.conf.d
39-
cp /files/camera-streamer/multi-example.conf /boot/camera-streamer.conf.d/example.conf
45+
# install helper scripts
46+
cp /files/camera-streamer/add-usb-camera /root/bin/add-usb-camera
47+
cp /files/camera-streamer/remove-usb-camera /root/bin/remove-usb-camera
48+
cp /files/camera-streamer/list-usb-cameras /root/bin/list-usb-cameras
49+
chmod +x /root/bin/add-usb-camera
50+
chmod +x /root/bin/remove-usb-camera
51+
chmod +x /root/bin/list-usb-cameras
4052

4153
# clean up the old crap
4254
systemctl disable webcamd
Lines changed: 95 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,95 @@
1+
#!/bin/bash
2+
3+
if [ "$EUID" -ne 0 ]
4+
then echo "Please run as root/with sudo"
5+
exit 1
6+
fi
7+
8+
NAME=$1
9+
PORT=$2
10+
DEVICE=$3
11+
12+
## Name
13+
14+
if [ -z "$NAME" ]; then
15+
echo "Usage: $0 <name> <port> <device>"
16+
exit 1
17+
fi
18+
19+
# make sure the name is unique
20+
if [ -e "/boot/camera-streamer/$NAME.conf" ]; then
21+
echo "Camera $NAME already exists"
22+
exit 1
23+
fi
24+
25+
## Port
26+
27+
if [ -z "$PORT" ]; then
28+
port=8080
29+
while grep -qs "PORT=$port" /boot/camera-streamer/*.conf; do
30+
port=$((port+1))
31+
done
32+
PORT=$port
33+
echo "No port provided, automatically selected port $PORT"
34+
echo
35+
fi
36+
37+
# make sure the port is available
38+
if grep -qs "PORT=$PORT" /boot/camera-streamer/*.conf; then
39+
echo "Port $PORT is already used by another camera"
40+
exit 1
41+
fi
42+
43+
## Device
44+
45+
if [ -z "$DEVICE" ]; then
46+
echo "Please make sure your USB camera is plugged in and select it below:"
47+
echo
48+
PS3="? "
49+
options=($(echo /dev/v4l/by-id/usb-*-video-index0)) # list all the USB v4l2 devices
50+
select opt in "${options[@]}"; do
51+
if [ -n "$opt" ]; then
52+
DEVICE=$opt
53+
break
54+
fi
55+
echo
56+
done
57+
echo
58+
fi
59+
60+
# make sure the device exists
61+
if [ ! -e "$DEVICE" ]; then
62+
echo "Device $DEVICE does not exist"
63+
exit 1
64+
fi
65+
66+
sudo cat > /boot/camera-streamer/$NAME.conf <<EOF
67+
### Options for USB based cameras
68+
69+
# The port on which the webcam server for the camera should listen on.
70+
PORT=$PORT
71+
72+
# The path to the camera device.
73+
DEVICE=$DEVICE
74+
75+
# The image format of the camera.
76+
FORMAT=YUYV
77+
78+
# The resolution to set on the camera. Defaults to 1280x720.
79+
WIDTH=1280
80+
HEIGHT=720
81+
82+
# The framerate to set on the camera. Defaults to 15fps.
83+
FRAMERATE=15
84+
85+
# Additional options. Leave at log-debug=0 if not needed.
86+
OPTIONS='-log-debug=0'
87+
EOF
88+
89+
sudo systemctl start camera-streamer-usb@$NAME.path
90+
91+
echo "Camera $NAME added"
92+
echo
93+
echo "Port: $PORT"
94+
echo "Device: $DEVICE"
95+
echo "Configuration file: /boot/camera-streamer/$NAME.conf"
Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
#!/bin/bash
2+
3+
action=$1
4+
5+
systemctl $action "camera-streamer-libcamera.service"
6+
7+
# iterate over all the camera confs in /boot/camera-streamer
8+
for conf in /boot/camera-streamer/*.conf; do
9+
# skip the libcamera.conf
10+
if [ "$conf" = "/boot/camera-streamer/libcamera.conf" ]; then
11+
continue
12+
fi
13+
14+
# get the name of the camera
15+
name=$(basename "$conf" .conf)
16+
17+
# enable the camera
18+
systemctl $action "camera-streamer-usb@$name.path"
19+
systemctl $action "camera-streamer-usb@$name.service"
20+
done

scripts/files/camera-streamer/camera-streamer-libcamera.service

Lines changed: 10 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1,20 +1,21 @@
11
[Unit]
22
Description=camera-streamer libcamera
33
After=network.target
4-
ConditionPathExistsGlob=/sys/bus/i2c/drivers/*/*/video4linux
4+
StartLimitIntervalSec=120
5+
StartLimitBurst=10
56

67
[Service]
7-
EnvironmentFile=/boot/camera-streamer.conf
8-
ExecStart=/usr/local/bin/camera-streamer \
8+
EnvironmentFile=/boot/camera-streamer/libcamera.conf
9+
ExecCondition=/bin/sh -c "/usr/bin/libcamera-hello --list-cameras | grep -o '/base/soc/[^)]*'"
10+
ExecStart=/bin/sh -c "/usr/local/bin/camera-streamer \
11+
-http-port=${PORT} \
912
-camera-type=libcamera \
10-
; YUYV offers best quality in camera-streamer
13+
-camera-path=$(/usr/bin/libcamera-hello --list-cameras | grep -o '/base/soc/[^)]*') \
1114
-camera-format=YUYV \
12-
-camera-width=${LIBCAMERA_WIDTH} -camera-height=${LIBCAMERA_HEIGHT} \
13-
-camera-fps=${LIBCAMERA_FRAMERATE} \
15+
-camera-width=${WIDTH} -camera-height=${HEIGHT} \
16+
-camera-fps=${FRAMERATE} \
1417
-camera-nbufs=2 \
15-
-camera-high_res_factor=1 \
16-
-camera-low_res_factor=2 \
17-
${LIBCAMERA_OPTIONS}
18+
${OPTIONS}"
1819

1920
DynamicUser=yes
2021
SupplementaryGroups=video i2c

scripts/files/camera-streamer/camera-streamer-usb-multi@.service

Lines changed: 0 additions & 32 deletions
This file was deleted.

scripts/files/camera-streamer/camera-streamer-usb.service

Lines changed: 0 additions & 30 deletions
This file was deleted.

scripts/files/camera-streamer/camera-streamer-usb.path renamed to scripts/files/camera-streamer/camera-streamer-usb@.path

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,9 @@
11
[Unit]
2-
Description=camera-streamer usb autolaunch
2+
Description=camera-streamer %i autolaunch
3+
After=network.target
34

45
[Path]
56
PathExistsGlob=/dev/v4l/by-id/usb-*-video-index0
6-
Unit=camera-streamer-usb.service
77

88
[Install]
99
WantedBy=multi-user.target
Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,34 @@
1+
[Unit]
2+
Description=camera-streamer %i
3+
After=network.target
4+
After=camera-streamer-libcamera.service
5+
ConditionPathExistsGlob=/dev/v4l/by-id/usb-*-video-index0
6+
StartLimitIntervalSec=120
7+
StartLimitBurst=10
8+
9+
[Service]
10+
EnvironmentFile=/boot/camera-streamer/%i.conf
11+
ExecCondition=/bin/sh -c "[ -e $DEVICE ]"
12+
ExecStart=/bin/sh -c "/usr/local/bin/camera-streamer \
13+
-http-port=${PORT} \
14+
-camera-path="${DEVICE}" \
15+
-camera-type=v4l2 \
16+
-camera-format=${FORMAT} \
17+
-camera-width=${WIDTH} -camera-height=${HEIGHT} \
18+
-camera-fps=${FRAMERATE} \
19+
-camera-nbufs=2 \
20+
${OPTIONS}"
21+
22+
DynamicUser=yes
23+
SupplementaryGroups=video i2c
24+
Restart=always
25+
RestartSec=10
26+
Nice=10
27+
IOSchedulingClass=idle
28+
IOSchedulingPriority=7
29+
CPUWeight=20
30+
AllowedCPUs=1-2
31+
MemoryMax=250M
32+
33+
[Install]
34+
WantedBy=multi-user.target

0 commit comments

Comments
 (0)