Ako streamovať obraz Raspberry Pi webkamery
Streamovanie obrazu z webkamery pripojenej k Raspberry Pi nie je tak jednoduché, ako by sa mohlo zdať, ak chcete dosiahnuť aspoň trochu rozumnú kvalitu.
Väčšina návodov odporúča motion, čo je síce rýchle a jednoduché riešenie, mne sa s ním však s mojou Logitech C920 nikdy nepodarilo dosiahnuť viac ako 10 snímkov za sekundu, teda plynulý obraz.
Najviac sa mi osvedčilo použiť mjpg-streamer, ktorý je priamo stavaný pre ziariadenia s nízkym výkonom, ako je práve Raspberry Pi.
Webkamera
Detekcia zariadenie
Správne pripojenie a rozpoznanie webkamery skontrolujete príkazom v4l2-ctl --list-devices
sudo v4l2-ctl --list-devices
HD Pro Webcam C920 (usb-3f980000.usb-1.5):
/dev/video0
/dev/video1
/dev/media3
V mojom prípade je webkamera detekovaná ako /dev/video0
, takže všetky ďalšie príkazy používajú toto zariadenie.
Voľba rozlíšenia a snímkov za sekundu
Pri streamovaní obrazu z webkamery je nutné presne určiť rozlíšenie a počet snímkov za sekundu.
Všetky podporované kombinácie týchto parametrov zistíte pomocou príkazu v4l2-ctl -d /dev/video0 --list-formats-ext
sudo v4l2-ctl -d /dev/video0 --list-formats-ext
ioctl: VIDIOC_ENUM_FMT
Type: Video Capture
[0]: 'YUYV' (YUYV 4:2:2)
Size: Discrete 640x480
Interval: Discrete 0.033s (30.000 fps)
Interval: Discrete 0.042s (24.000 fps)
Interval: Discrete 0.050s (20.000 fps)
Interval: Discrete 0.067s (15.000 fps)
Interval: Discrete 0.100s (10.000 fps)
Interval: Discrete 0.133s (7.500 fps)
Interval: Discrete 0.200s (5.000 fps)
...
Size: Discrete 2304x1536
Interval: Discrete 0.500s (2.000 fps)
[1]: 'H264' (H.264, compressed)
Size: Discrete 640x480
Interval: Discrete 0.033s (30.000 fps)
Interval: Discrete 0.042s (24.000 fps)
Interval: Discrete 0.050s (20.000 fps)
Interval: Discrete 0.067s (15.000 fps)
Interval: Discrete 0.100s (10.000 fps)
Interval: Discrete 0.133s (7.500 fps)
Interval: Discrete 0.200s (5.000 fps)
...
Size: Discrete 1920x1080
Interval: Discrete 0.033s (30.000 fps)
Interval: Discrete 0.042s (24.000 fps)
Interval: Discrete 0.050s (20.000 fps)
Interval: Discrete 0.067s (15.000 fps)
Interval: Discrete 0.100s (10.000 fps)
Interval: Discrete 0.133s (7.500 fps)
Interval: Discrete 0.200s (5.000 fps)
[2]: 'MJPG' (Motion-JPEG, compressed)
Size: Discrete 640x480
Interval: Discrete 0.033s (30.000 fps)
Interval: Discrete 0.042s (24.000 fps)
Interval: Discrete 0.050s (20.000 fps)
Interval: Discrete 0.067s (15.000 fps)
Interval: Discrete 0.100s (10.000 fps)
Interval: Discrete 0.133s (7.500 fps)
Interval: Discrete 0.200s (5.000 fps)
...
Size: Discrete 1920x1080
Interval: Discrete 0.033s (30.000 fps)
Interval: Discrete 0.042s (24.000 fps)
Interval: Discrete 0.050s (20.000 fps)
Interval: Discrete 0.067s (15.000 fps)
Interval: Discrete 0.100s (10.000 fps)
Interval: Discrete 0.133s (7.500 fps)
Interval: Discrete 0.200s (5.000 fps)
V tomto výpise si môžete všimnúť rôzne formáty, ktoré vaša webkamera podporuje. U mňa je to YUYV
, H264
a MJPG
.
Nás bude zaujímať práve MJPG
, takže vhodné rozlíšenie je napríklad 1920x1080
pri 30
snímkoch za sekundu.
Nastavenie parametrov
Pomocou príkazu v4l2-ctl -d /dev/video0 --list-ctrls
zistíte všetky parametre, ktoré môžete vašej webkamere nastaviť
sudo v4l2-ctl -d /dev/video0 --list-ctrls
brightness 0x00980900 (int) : min=0 max=255 step=1 default=128 value=128
contrast 0x00980901 (int) : min=0 max=255 step=1 default=128 value=128
saturation 0x00980902 (int) : min=0 max=255 step=1 default=128 value=128
white_balance_temperature_auto 0x0098090c (bool) : default=1 value=1
gain 0x00980913 (int) : min=0 max=255 step=1 default=0 value=0
power_line_frequency 0x00980918 (menu) : min=0 max=2 default=2 value=2
white_balance_temperature 0x0098091a (int) : min=2000 max=6500 step=1 default=4000 value=4000 flags=inactive
sharpness 0x0098091b (int) : min=0 max=255 step=1 default=128 value=128
backlight_compensation 0x0098091c (int) : min=0 max=1 step=1 default=0 value=0
exposure_auto 0x009a0901 (menu) : min=0 max=3 default=1 value=1
exposure_absolute 0x009a0902 (int) : min=3 max=2047 step=1 default=250 value=250 flags=inactive
exposure_auto_priority 0x009a0903 (bool) : default=0 value=1
pan_absolute 0x009a0908 (int) : min=-36000 max=36000 step=3600 default=0 value=0
tilt_absolute 0x009a0909 (int) : min=-36000 max=36000 step=3600 default=0 value=0
focus_absolute 0x009a090a (int) : min=0 max=250 step=5 default=0 value=0 flags=inactive
focus_auto 0x009a090c (bool) : default=1 value=1
zoom_absolute 0x009a090d (int) : min=100 max=500 step=1 default=100 value=100
Jednotlivé parametre môžete nastaviť príkazom sudo v4l2-ctl -d /dev/video0 --set-ctrl=nazov=hodnota
.
Pri mojej Logitech C920 bolo potrebné nastaviť exposure_auto=3
, pretože pri exposure_auto=1
bol obraz príliš svetlý. Okrem toho som ešte vypol auto focus pomocou focus_auto=0
.
Všetly tieto parametre môžete meniť aj počas streamovania a vidieť tak ich efekt v reálnom čase.
mjpg-streamer
Inštalácia
Pred inštaláciou mjpg-streamer
sa uistite, že máte nainštalované všetky závislosti
sudo apt-get install cmake libjpeg8-dev gcc g++
naklonujte si git repozitár projektu
git clone https://github.com/jacksonliam/mjpg-streamer.git
a projekt skompilujte a nainštalujte
cd mjpg-streamer
cd mjpg-streamer-experimental
make
sudo make install
Použitie
Stream z webkamery spustíte príkazom
sudo mjpg_streamer\
-i "input_uvc.so -d /dev/video0 -r 1920x1080 -f 24"\
-o "output_http.so -p 8085-w /var/www/mjpg_streamer"
ktorý obsahuje video zariadenie, rozlíšenie, počet snímkov za sekundu a port pre webové rozhranie, v tomto prípade 8085
.
Následne už len stačí v prehliadači otvoriť
http://IP_VASHO_RPI:8085/?action=stream
na sledovanie streamu alebo
http://IP_VASHO_RPI:8085/?action=snapshot
na získanie jednej fotky.