Как получить видео с камеры обычного квартирного домофона в умный дом

от автора

У меня в квартире установлен аналоговый домофон Vizit, которому больше 10 лет. Уже давно хотел сделать автоматизацию для умного дома, которая при вызове от входной двери в подъезд с первого этажа мне в телеграм присылала бы фотографию набравшего номер квартиры.

Немного теории

Поскольку домофон у меня не современный, а координатный, аналоговой, то в этом случае у домофона аудио и видеосигналы разделены. Не у всех квартир есть видео подключение, но вот к аудио обычно подключены все. Обычно подключение физически выглядит следующим образом:

Аудио (интерком Ln+ и Ln-)

  1. Ln+ (положительный аудиосигнал): по этому проводу передается положительная половина аудиосигнала. Он отвечает за передачу речевого сигнала от одного устройства к другому.

  2. Ln- (аудио-негативный): по этому проводу передается отрицательная половина аудиосигнала, который по сути является инверсией сигнала Ln+. Это помогает снизить шум и помехи, обеспечивая более четкую передачу звука.

Видео (GND и VIN1)

  1. GND (Земля): этот провод служит опорной точкой для видеосигнала. Это общее заземление, которое помогает стабилизировать видеосигнал и минимизировать электрические шумы.

  2. VIN1 (Видеовход): по этому проводу передается видеосигнал от камеры к монитору. Видеосигнал обычно представляет собой аналоговый композитный видеосигнал, который объединяет всю видеоинформацию (яркость, цвет, синхронизация и т. д.) в один сигнал.

Видеосигнал, передаваемый через VIN1, представляет собой стандартный аналоговый композитный сигнал. Это означает, что вся необходимая видеоинформация кодируется на одной несущей, которая затем декодируется принимающим монитором.

Это означает, что для того чтобы хоть что-то сделать с этим видеосигналом придётся подключить его к плате видеозахвата.

Физическое подключение

Мне понадобилась самая дешевая USB карта видеозахвата EasyCAP (HD), у разных продавцов она стоит от 300 до 600 рублей.

Kарта видеозахвата EasyCAP (HD) для ОС Win 10,8,7, XP / оцифровка / easycap

Kарта видеозахвата EasyCAP (HD) для ОС Win 10,8,7, XP / оцифровка / easycap

На самой плате понадобится только разъем «CVBS in» — расшифровывается как Composite Video Baseband Signal — это формат аналогового видеосигнала, который передает видео стандартной четкости, обычно с разрешением 480i или 576i.

Слаботочный щит до всех манипуляций

Слаботочный щит до всех манипуляций

Для подключения используется стандартный RCA (или тюльпан) разъем, но подумал и решил его срезать и использовать разъёмы как для 12 вольтового питания камер. Все равно на домофоне нет стандартного разъема, а витую пару проще заводить в разъем питания DC для камер видеонаблюдения.

"CVBS in" - расшифровывается как Composite Video Baseband Signal

«CVBS in» — расшифровывается как Composite Video Baseband Signal

После этого подключил параллельно через жилку витой пары на входящие клеммы GND и VIN1 блока Vizit BKM-440.

Подключение к блоку Vizit BKM-440

Подключение к блоку Vizit BKM-440

На этом с физическим подключением всё. Осталось понять как программно увидеть это изображение.

Программное подключение. Попытка №1

В качестве сервера умного дома у меня используется Home Assistant Operating System, установленная на Raspberry Pi 4 Model B. Изначально плату видеозахвата я воткнул в его USB порт.

       ▄██▄           _   _      ▄██████▄        | | | | ___  _ __ ___   ___    ▄████▀▀████▄      | |_| |/ _ \| '_ ` _ \ / _ \  ▄█████    █████▄    |  _  | (_) | | | | | |  __/ ▄██████▄  ▄██████▄   |_| |_|\___/|_| |_| |_|\___|          _ ████████  ██▀  ▀██      / \   ___ ___(_)___| |_ __ _ _ __ | |_ ███▀▀███  ██   ▄██     / _ \ / __/ __| / __| __/ _` | '_ \| __| ██    ██  ▀ ▄█████    / ___ \\__ \__ \ \__ \ || (_| | | | | |_ ███▄▄ ▀█  ▄███████   /_/   \_\___/___/_|___/\__\__,_|_| |_|\__| ▀█████▄   ███████▀  Welcome to the Home Assistant command line.  System information   IPv4 addresses for wlan0:   IPv4 addresses for end0:  192.168.165.5/24   IPv6 addresses for end0:  fe80::a1fb:ad4a:dcd3:4227/64    OS Version:               Home Assistant OS 12.3   Home Assistant Core:      2024.5.5    Home Assistant URL:       http://homeassistant.local:8123   Observer URL:             http://homeassistant.local:4357 ~ # dmesg ... [57002.035727] usb 1-1.3: new high-speed USB device number 4 using xhci_hcd [57002.137540] usb 1-1.3: New USB device found, idVendor=534d, idProduct=0021, bcdDevice= 1.21 [57002.137569] usb 1-1.3: New USB device strings: Mfr=1, Product=2, SerialNumber=3 [57002.137583] usb 1-1.3: Product: AV TO USB2.0 [57002.137594] usb 1-1.3: Manufacturer: MACROSILICON [57002.137604] usb 1-1.3: SerialNumber: 20150130 [57002.148506] hid-generic 0003:534D:0021.0001: hiddev96,hidraw0: USB HID v1.10 Device [MACROSILICON AV TO USB2.0] on usb-0000:01:00.0-1.3/input4 [57002.185721] usb 1-1.3: Found UVC 1.00 device AV TO USB2.0 (534d:0021) [57002.186785] usb 1-1.3: UVC non compliance - GET_DEF(PROBE) not supported. Enabling workaround. [57002.191729] usbcore: registered new interface driver uvcvideo [57002.202828] usbcore: registered new interface driver snd-usb-audio ~ #

Плата обнаруживается как устройство с идентификатором USB ID 534d:0021.

Но дальше проблема — она не распознаётся как /dev/video0. После некоторых поисков нашёл решение, которое позволяет использовать команду modprobe uvcvideo для загрузки модуля ядра uvcvideo в работающее ядро.

Но у меня это решение вызывало только сообщение об ошибке «modprobe: невозможно изменить каталог на «/lib/modules»: такого файла или каталога нет» — это указывает на то, что команда «modprobe» не может найти каталог, в котором хранятся модули ядра.

Дальше я передумал предпринимать шаги по устранению этой ошибки, чтобы не повредить свою работающую систему, потому что там много всего установлено — не хотелось тратить время потом на восстановление.

Программное подключение. Попытка №2

Решил использовать другой микрокомпьютер для решения этой задачи — у меня ещё с 2017 года валялся Orange Pi Zero 512Mb. Поставил на него Armbian — дистрибутив операционной системы Linux, предназначенный для работы на одноплатных компьютерах и ffmpeg.

  ___  ____  _   _____  / _ \|  _ \(_) |__  /___ _ __ ___ | | | | |_) | |   / // _ \ '__/ _ \ | |_| |  __/| |  / /|  __/ | | (_) |  \___/|_|   |_| /____\___|_|  \___/  Welcome to Armbian_community 24.5.0-trunk.667 Jammy with Linux 6.6.31-current-su                                                                                        nxi  No end-user support: untested automated build  System load:   27%              Up time:       2 min Memory usage:  16% of 490M      IP:            192.168.165.106 CPU temp:      74°C             Usage of /:    13% of 15G RX today:      83.2 MiB  [ 4 security updates available, 4 updates total: apt upgrade ] Last check: 2024-05-25 22:17  [ General system configuration (beta): armbian-config ]  Last login: Wed May 22 03:20:41 2024 root@orangepizero:~# dmesg [    0.000000] Booting Linux on physical CPU 0x0 [    0.000000] Linux version 6.6.31-current-sunxi (armbian@next) (arm-linux-gnueabihf-gcc (Ubuntu 11.4.0-1ubuntu1~22.04) 11.4.0, GNU ld (GNU Binutils for Ubuntu) 2.38) #1 SMP Fri May 17 10:02:40 UTC 2024 [    0.000000] CPU: ARMv7 Processor [410fc075] revision 5 (ARMv7), cr=50c5387d [    0.000000] CPU: div instructions available: patching division code [    0.000000] CPU: PIPT / VIPT nonaliasing data cache, VIPT aliasing instruction cache [    0.000000] OF: fdt: Machine model: Xunlong Orange Pi Zero [    0.000000] Memory policy: Data cache writealloc [    3.820102] usb 2-1: new high-speed USB device number 2 using ehci-platform [    3.836094] usb 3-1: new high-speed USB device number 2 using ehci-platform [    3.982635] usb 2-1: New USB device found, idVendor=534d, idProduct=0021, bcdDevice= 1.21 [    3.982699] usb 2-1: New USB device strings: Mfr=1, Product=2, SerialNumber=3 [    3.982727] usb 2-1: Product: AV TO USB2.0 [    3.982750] usb 2-1: Manufacturer: MACROSILICON [    3.982772] usb 2-1: SerialNumber: 20150130  root@orangepizero:~# ffmpeg -sources |grep video ffmpeg version 4.4.2-0ubuntu0.22.04.1 Copyright (c) 2000-2021 the FFmpeg developers   built with gcc 11 (Ubuntu 11.2.0-19ubuntu1)   configuration: --prefix=/usr --extra-version=0ubuntu0.22.04.1 --toolchain=hardened --libdir=/usr/lib/arm-linux-gnueabihf --incdir=/usr/include/arm-linux-gnueabihf --arch=arm --enable-gpl --disable-stripping --enable-gnutls --enable-ladspa --enable-libaom --enable-libass --enable-libbluray --enable-libbs2b --enable-libcaca --enable-libcdio --enable-libcodec2 --enable-libdav1d --enable-libflite --enable-libfontconfig --enable-libfreetype --enable-libfribidi --enable-libgme --enable-libgsm --enable-libjack --enable-libmp3lame --enable-libmysofa --enable-libopenjpeg --enable-libopenmpt --enable-libopus --enable-libpulse --enable-librabbitmq --enable-librubberband --enable-libshine --enable-libsnappy --enable-libsoxr --enable-libspeex --enable-libsrt --enable-libssh --enable-libtheora --enable-libtwolame --enable-libvidstab --enable-libvorbis --enable-libvpx --enable-libwebp --enable-libx265 --enable-libxml2 --enable-libxvid --enable-libzimg --enable-libzmq --enable-libzvbi --enable-lv2 --enable-omx --enable-openal --enable-opencl --enable-opengl --enable-sdl2 --enable-pocketsphinx --enable-librsvg --enable-libdc1394 --enable-libdrm --enable-libiec61883 --enable-chromaprint --enable-frei0r --enable-libx264 --enable-shared   libavutil      56. 70.100 / 56. 70.100   libavcodec     58.134.100 / 58.134.100   libavformat    58. 76.100 / 58. 76.100   libavdevice    58. 13.100 / 58. 13.100   libavfilter     7.110.100 /  7.110.100   libswscale      5.  9.100 /  5.  9.100   libswresample   3.  9.100 /  3.  9.100   libpostproc    55.  9.100 / 55.  9.100 Auto-detected sources for video4linux2,v4l2:   /dev/video0 [AV TO USB2.0]   /dev/video1 [AV TO USB2.0]  root@orangepizero:~# 

Консольная программа FFmpeg сразу после установки без дополнительных манипуляций отобразила что плата видео захвата доступна устройством /dev/video0.

Тестовое получение фото и видео от входной двери в подъезд с домофона Визит в Linux

Делаю запрос на поддерживаемые форматы устройства видеозахвата, расположенного в /dev/video0

root@orangepizero:~# ffmpeg -list_formats all -i /dev/video0 ffmpeg version 4.4.2-0ubuntu0.22.04.1 Copyright (c) 2000-2021 the FFmpeg developers   built with gcc 11 (Ubuntu 11.2.0-19ubuntu1)   configuration: --prefix=/usr --extra-version=0ubuntu0.22.04.1 --toolchain=hardened --libdir=/usr/lib/arm-linux-gnueabihf --incdir=/usr/include/arm-linux-gnueabihf --arch=arm --enable-gpl --disable-stripping --enable-gnutls --enable-ladspa --enable-libaom --enable-libass --enable-libbluray --enable-libbs2b --enable-libcaca --enable-libcdio --enable-libcodec2 --enable-libdav1d --enable-libflite --enable-libfontconfig --enable-libfreetype --enable-libfribidi --enable-libgme --enable-libgsm --enable-libjack --enable-libmp3lame --enable-libmysofa --enable-libopenjpeg --enable-libopenmpt --enable-libopus --enable-libpulse --enable-librabbitmq --enable-librubberband --enable-libshine --enable-libsnappy --enable-libsoxr --enable-libspeex --enable-libsrt --enable-libssh --enable-libtheora --enable-libtwolame --enable-libvidstab --enable-libvorbis --enable-libvpx --enable-libwebp --enable-libx265 --enable-libxml2 --enable-libxvid --enable-libzimg --enable-libzmq --enable-libzvbi --enable-lv2 --enable-omx --enable-openal --enable-opencl --enable-opengl --enable-sdl2 --enable-pocketsphinx --enable-librsvg --enable-libdc1394 --enable-libdrm --enable-libiec61883 --enable-chromaprint --enable-frei0r --enable-libx264 --enable-shared   libavutil      56. 70.100 / 56. 70.100   libavcodec     58.134.100 / 58.134.100   libavformat    58. 76.100 / 58. 76.100   libavdevice    58. 13.100 / 58. 13.100   libavfilter     7.110.100 /  7.110.100   libswscale      5.  9.100 /  5.  9.100   libswresample   3.  9.100 /  3.  9.100   libpostproc    55.  9.100 / 55.  9.100 [video4linux2,v4l2 @ 0x1f22080] Compressed:       mjpeg :          Motion-JPEG : 480x320 640x480 720x480 [video4linux2,v4l2 @ 0x1f22080] Raw       :     yuyv422 :           YUYV 4:2:2 : 480x320 /dev/video0: Immediate exit requested  root@orangepizero:~# mkdir output root@orangepizero:~#

Команда Linux ffmpeg -loglevel error -i /dev/video0 -r 1 -t 5 output/grab-%d.jpg используется для захвата изображений с камеры которая, находится у входа в подъезд и сохранения их в виде файлов JPEG.

root@orangepizero:~# ffmpeg -loglevel error -i /dev/video0 -r 1 -t 5 output/grab-%d.jpg root@orangepizero:~#
Эта картинка просто как иллюстрация

Эта картинка просто как иллюстрация

Команда Linux ffmpeg -y -i /dev/video0 -t 30 -pix_fmt yuv420p -c:v libx264 output/video.mp4 используется для захвата видео с камеры которая, находится у входа в подъезд и сохранения его в виде файла MP4.

root@orangepizero:~# ffmpeg -y -i /dev/video0 -t 30 -pix_fmt yuv420p -c:v libx264 output/video.mp4 ffmpeg version 4.4.2-0ubuntu0.22.04.1 Copyright (c) 2000-2021 the FFmpeg developers   built with gcc 11 (Ubuntu 11.2.0-19ubuntu1)   configuration: --prefix=/usr --extra-version=0ubuntu0.22.04.1 --toolchain=hardened --libdir=/usr/lib/arm-linux-gnueabihf --incdir=/usr/include/arm-linux-gnueabihf --arch=arm --enable-gpl --disable-stripping --enable-gnutls --enable-ladspa --enable-libaom --enable-libass --enable-libbluray --enable-libbs2b --enable-libcaca --enable-libcdio --enable-libcodec2 --enable-libdav1d --enable-libflite --enable-libfontconfig --enable-libfreetype --enable-libfribidi --enable-libgme --enable-libgsm --enable-libjack --enable-libmp3lame --enable-libmysofa --enable-libopenjpeg --enable-libopenmpt --enable-libopus --enable-libpulse --enable-librabbitmq --enable-librubberband --enable-libshine --enable-libsnappy --enable-libsoxr --enable-libspeex --enable-libsrt --enable-libssh --enable-libtheora --enable-libtwolame --enable-libvidstab --enable-libvorbis --enable-libvpx --enable-libwebp --enable-libx265 --enable-libxml2 --enable-libxvid --enable-libzimg --enable-libzmq --enable-libzvbi --enable-lv2 --enable-omx --enable-openal --enable-opencl --enable-opengl --enable-sdl2 --enable-pocketsphinx --enable-librsvg --enable-libdc1394 --enable-libdrm --enable-libiec61883 --enable-chromaprint --enable-frei0r --enable-libx264 --enable-shared   libavutil      56. 70.100 / 56. 70.100   libavcodec     58.134.100 / 58.134.100   libavformat    58. 76.100 / 58. 76.100   libavdevice    58. 13.100 / 58. 13.100   libavfilter     7.110.100 /  7.110.100   libswscale      5.  9.100 /  5.  9.100   libswresample   3.  9.100 /  3.  9.100   libpostproc    55.  9.100 / 55.  9.100 Input #0, video4linux2,v4l2, from '/dev/video0':   Duration: N/A, start: 36448.666588, bitrate: 61440 kb/s   Stream #0:0: Video: rawvideo (YUY2 / 0x32595559), yuyv422, 480x320, 61440 kb/s, 25 fps, 25 tbr, 1000k tbn, 1000k tbc Stream mapping:   Stream #0:0 -> #0:0 (rawvideo (native) -> h264 (libx264)) Press [q] to stop, [?] for help [libx264 @ 0x5de820] using cpu capabilities: ARMv6 NEON [libx264 @ 0x5de820] profile High, level 2.1, 4:2:0, 8-bit [libx264 @ 0x5de820] 264 - core 163 r3060 5db6aa6 - H.264/MPEG-4 AVC codec - Copyleft 2003-2021 - http://www.videolan.org/x264.html - options: cabac=1 ref=3 deblock=1:0:0 analyse=0x3:0x113 me=hex subme=7 psy=1 psy_rd=1.00:0.00 mixed_ref=1 me_range=16 chroma_me=1 trellis=1 8x8dct=1 cqm=0 deadzone=21,11 fast_pskip=1 chroma_qp_offset=-2 threads=6 lookahead_threads=1 sliced_threads=0 nr=0 decimate=1 interlaced=0 bluray_compat=0 constrained_intra=0 bframes=3 b_pyramid=2 b_adapt=1 b_bias=0 direct=1 weightb=1 open_gop=0 weightp=2 keyint=250 keyint_min=25 scenecut=40 intra_refresh=0 rc_lookahead=40 rc=crf mbtree=1 crf=23.0 qcomp=0.60 qpmin=0 qpmax=69 qpstep=4 ip_ratio=1.40 aq=1:1.00 Output #0, mp4, to 'output/video.mp4':   Metadata:     encoder         : Lavf58.76.100   Stream #0:0: Video: h264 (avc1 / 0x31637661), yuv420p(tv, progressive), 480x320, q=2-31, 25 fps, 12800 tbn     Metadata:       encoder         : Lavc58.134.100 libx264     Side data:       cpb: bitrate max/min/avg: 0/0/0 buffer size: 0 vbv_delay: N/A frame=  250 fps= 24 q=-1.0 Lsize=       9kB time=00:00:09.88 bitrate=   7.5kbits/s dup=28 drop=0 speed=0.965x video:5kB audio:0kB subtitle:0kB other streams:0kB global headers:0kB muxing overhead: 71.028900% [libx264 @ 0x5de820] frame I:1     Avg QP: 9.00  size:    78 [libx264 @ 0x5de820] frame P:63    Avg QP: 9.14  size:    25 [libx264 @ 0x5de820] frame B:186   Avg QP:12.67  size:    17 [libx264 @ 0x5de820] consecutive B-frames:  0.8%  0.0%  0.0% 99.2% [libx264 @ 0x5de820] mb I  I16..4: 100.0%  0.0%  0.0% [libx264 @ 0x5de820] mb P  I16..4:  0.0%  0.0%  0.0%  P16..4:  0.0%  0.0%  0.0%  0.0%  0.0%    skip:100.0% [libx264 @ 0x5de820] mb B  I16..4:  0.0%  0.0%  0.0%  B16..8:  0.0%  0.0%  0.0%  direct: 0.0%  skip:100.0% [libx264 @ 0x5de820] 8x8 transform intra:0.0% [libx264 @ 0x5de820] coded y,uvDC,uvAC intra: 0.0% 0.0% 0.0% inter: 0.0% 0.0% 0.0% [libx264 @ 0x5de820] i16 v,h,dc,p: 95%  0%  5%  0% [libx264 @ 0x5de820] i8c dc,h,v,p: 100%  0%  0%  0% [libx264 @ 0x5de820] Weighted P-Frames: Y:0.0% UV:0.0% [libx264 @ 0x5de820] kb/s:3.80 root@orangepizero:~#

Продолжение в следующей части статьи

После того картинка появилась необходимо будет программно как будто создать IP-камеру на базе Armbian, которая состоит из карты видеозахвата, подключенной к /dev/video0 и транслировать RTSP с помощью MediaMTX (ранее назывался RTSP Simple Server).

Это позволит интегрировать RTSP поток в Home Assistant и в какую-нибудь систему видеонаблюдения, например Synology Surveillance Station.

А уже из Home Assistant можно легко сделать автоматизацию для умного дома, которая при вызове от входной двери в подъезд с первого этажа в телеграм присылала бы фотографию набравшего номер квартиры.

Про это как раз будет вторая часть этой статьи, которая будет опубликована в течении двух недель.

Автор: Михаил Шардин,

27 мая 2024 г.

Только зарегистрированные пользователи могут участвовать в опросе. Войдите, пожалуйста.

Будете ждать вторую часть статьи?

70.94% Да83
21.37% Нет25
7.69% Не знаю9

Проголосовали 117 пользователей. Воздержались 5 пользователей.

Только зарегистрированные пользователи могут участвовать в опросе. Войдите, пожалуйста.

Подключить подъездную камеру к своему умному дому?

70% Да56
18.75% Нет15
11.25% Не знаю9

Проголосовали 80 пользователей. Воздержались 5 пользователей.

ссылка на оригинал статьи https://habr.com/ru/articles/817117/


Комментарии

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *