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

У меня в квартире установлен аналоговый домофон 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

После этого подключил параллельно через жилку витой пары на входящие клеммы 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 г.

© Habrahabr.ru