Igor Kulman

Ako streamovať obraz Raspberry Pi webkamery

· Igor Kulman

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.