Видеонаблюдение через интернет в веб-браузере

Платы видеозахвата в Linux.

Эта статья не предназначена для потребителей, выбирающих ТВ-тюнер или других бытовых целей. Эта статья возможно будет полезна людям, собирающим цифровые видеорегистраторы на Linux с использованием аналоговых многоканальных плат видеоввода (видеограбберов).

Теория (коротко).

Главная микросхема на устройствах аналогово видеоввода - видеокодер. В настоящее время распространены видеокодеры следующих производителей:

  • Connexant Fusion:
    • BT878 (8 bit АЦП);
    • CX2388x (10 bit АЦП);
  • Philips SAA713x (9bit АЦП);
  • Techwell TW68xx (9bit АЦП).

Примечания:

  1. На практике, разрядность АЦП имеет некоторое влияние на качество изображения (а стало быть и значение) только на цветных камерах не ниже 560 твл.
  2. Качество изображения, в основном портится (в отличие от сетевых камер), на старом, как мир, аналоговом способе передачи электрических сигналов по двухпроводной схеме.
Каждый из этих видеокодеров имеют следующие входные каналы: 4 видео и 1 аудио. Однако не все каналы физически выведены на разъёмы, это зависит от модели платы.
АЦП для всех видео-каналов только один и это означает, что Вы не можете получить скорость более 25 кадров в секунду по нескольким или всем каналам видеокодера, работающим одновременно.
На практике, в режиме мультиплексирования каналов и при захвате в полном кадре, получаются скорости 25/[5-8]/[3-5]/[2-3] к/с для 1/2/3/4 подключенных камерах на один видеокодер, соответственно.

Логически, все платы видеозахвата можно выделить 2 класса устройств:

  • C программным сжатием (более правильно - без аппаратного сжатия). Микросхемы-видеокодеры на этих устройствах преобразовывают аналоговый сигнал в цифровой с помощью DAC (АЦП), как правило, в телевизионные форматы: YUV422 или YUV420, более компактные, по сравнению с RGB. Сжатием видео для записи на диск и дальнейшей передачей по сети «занимается» центральный процессор CPU.

* С аппаратным сжатием. На таких платах, дополнительно к видеокодерам, устанавливают специализированные DSP-процессоры для кодирования (JPEG, MPEG2, MPEG4) прямо на плате. Такие платы более дорогие, но они обеспечивают больщую камерную ёмкость на один системный блок видеорегистратора или большую общую скорость захвата, в сравнении с обычными платами, без аппаратного сжатия.

Разработку драйверов video4linux для большинства устройств ведёт(вёл?) Gerd Knorr.

В большинстве дистрибутивов Linux, поставляемое ядро включает драйвера video4linux. По-умолчанию, модули (драйвера) находятся каталоге:

/lib/modules/`uname -r`/kernel/drivers/media/video
где `uname -r` - выдаст версию установленного ядра linux, например: 2.6.18-4-686

Обычно, для правильной работы устройств(а) в системе необходимо сделать 2 вещи:

  1. Проверить, правильно ли драйвер определяет тип платы и «подсказать» ему, если он не определил или определил неправильно тип платы.
  2. Установить «автозагрузку» драйвера с нужными параметрами.

Определение типа платы.

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

Для определения типа платы вручную нам понадобятся следующие утилиты:

  • lspci из пакета pciutils;
  • v4l-info и xawtv из пакета xawtv (прим: в некоторых дистрибутивах v4l-info - отдельный пакет).

С помощью lscpi определяем тип видеокодера:

Пример вывода lscpi для платы на 4-х видеокодерах BT878

user@host:~$ lspci
...
03:00.0 Multimedia video controller: Brooktree Corporation Bt878 Video Capture (rev 11)
03:00.1 Multimedia controller: Brooktree Corporation Bt878 Audio Capture (rev 11)
03:04.0 Multimedia video controller: Brooktree Corporation Bt878 Video Capture (rev 11)
03:04.1 Multimedia controller: Brooktree Corporation Bt878 Audio Capture (rev 11)
03:08.0 Multimedia video controller: Brooktree Corporation Bt878 Video Capture (rev 11)
03:08.1 Multimedia controller: Brooktree Corporation Bt878 Audio Capture (rev 11)
03:0c.0 Multimedia video controller: Brooktree Corporation Bt878 Video Capture (rev 11)
03:0c.1 Multimedia controller: Brooktree Corporation Bt878 Audio Capture (rev 11) 

Вот так выглядит тюнер AverMedia Model 307 на одном Philips SAA7130

01:07.0 Multimedia controller: Philips Semiconductors SAA7130 Video Broadcast Decoder (rev 01)
Каждый видеокодер (не плата, на которой может быть несколько видеокодеров) отображен в системе в виде файла с именем: «/dev/videoN»,
где N - порядковый (как его определила система при запуске) номер декодера.

Далее, смотрим как драйвер определил плату:

user@host:~$ v4l-info /dev/video0 | head -n 9 | grep "^card"
card : "BT878 video ( *** UNKNOWN/GENER"

Если видим что-то подобное - в большинстве случаев такой вариант Вас не устроит и нужно определить тип платы вручную и «сообщить» об этом драйверу.

Все драйверы (модули):

Видео-декодер Основной модуль (драйвер) Список поддерживаемых устройств
BT878 bttv список
CX2388x cx88xx список
SAA713x saa7134 список
TW68xx tw68 список

принимают параметр card=тип_платы1,тип_платы2…тип_платыN

Покажем пример для плат на BT878 (драйвер bttv):

1. Выгружаем модуль bttv

user@host:~$ sudo rmmod bt878 bttv

2. Загружаем модуль с «принудительным» указанием типа платы:

user@host:~$ sudo modprobe -v bttv card=число_идентификатор_платы_из_списка  tuner=-1 autoload=0

3. Проверяем всё ли правильно сделали:

user@host:~$ v4l-info | head -n 10 | grep card
card: ... ProVideo PV143 ...

4. Смотрим видео:

  • запускаем телевизионную смотрелку (xawtv, tvtime, ..);
  • нажимаем правую клавищу мыши - меню;
  • устанавливаем телевизионный стандарт (TV norm): PAL для цветных видеокамер и PAL-NC для черно-белых;
  • в зависимости от разъёма, куда подключена камера, меняем каналы (вход, Videosource, может быть [Television(input=0), Composite1(input=1), Composite1(input=2), S-Video(input=3)]
    прим: названия каналов могут быть другими
user@host:~$ xawtv -nodga -noxv -geometry 640x480 -c /dev/video0

Таким образом, нужно пробежаться по пунктам 1-4 для всех плат из списка, поддерживаемых драйвером.

Для плат на видеокодерах bt878a в первую очередь стоит попробовать с card=0×69 (Provideo PV143), что соответствует простой плате с базовой функциональностью и без ТВ-тюнера.

Если плата нормально заработала, нужно просто прописать параметры для загрузки модуля bttv, согласно правил Вашего дистрибутива.

Модуль в автозагрузку.

Debian/Ubuntu

В Debian/Ubuntu драйвера для видеограбберов загружаются автоматически из initramfs.

Обычно, всё что Вам нужно сделать, так это передать правильные параметры драйверу (тип платы: см. выше).

Нужно создать файл «/etc/modprobe.d/video4linux.conf» и прописать в него одну или несколько строк. Есть нюансы, поэтому несколько примеров:

простая одночиповая плата на BT878, типа Orient SDVR-404

options bttv card=0x69 tuner=-1 autoload=0 

простая одночиповая плата на Techwell TW6805A, типа Orient SDVR-404A

options tw68 tuner=-1 

плата Drive (компания DSSL, софт Trassir) - как 4 ProVideo PV143

options bttv card=0x69,0x69,0x69,0x69 tuner=-1,-1,-1,-1 autoload=0 

4-x чиповая плата Kodikom 4400R на BT878

options bttv card=0x84,0x84,0x84,0x84 tuner=-1,-1,-1,-1 autoload=0

8-x чиповая плата Kodikom KMC-8800R

options bttv card=0x66,0x66,0x66,0x66,0x66,0x66,0x66,0x66 tuner=-1,-1,-1,-1,-1,-1,-1,-1 autoload=0

TIBET_CS16(4xBT878) и AVERMEDIA DVD EZMAKER(1xSAA7134)

alias char-major-81-0 bttv
alias char-major-81-1 bttv
alias char-major-81-2 bttv
alias char-major-81-3 bttv
alias char-major-81-4 saa7134
options bttv card=0x83,0x83,0x83,0x83 tuner=-1,-1,-1,-1 autoload=0
options saa7134 card=33

для платы семейства Orient SDVR-7008 (8 saa7130)

options saa7134 card=1,1,1,1,1,1,1,1 tuner=-1,-1,-1,-1,-1,-1,-1,-1 i2c_scan=0 disable_ir=1

Примечания:

При долгой загрузке модуля bttv (более 5 сек., обычно сопровождается выводом строк типа »I2C detect»), попробуйте добавить следующие опции:

options bttv ... i2c_scan=0 i2c_hw=-1


Большинство современных дистрибутивов Linux используют двухступенчатую загрузку initramfs/initrd(устаревший способ).

В этом случае, большинство модулей устройств подгружается именно из initramfs, и чтобы модули получили наши новые параметры, нужно пересобрать образ initramfs командами:

user@host:~$ sudo update-modules
user@host:~$ sudo update-initramfs -u

См: modprobe(8) и modprobe.conf(5).

Если одновременно используются разнотипные видеограбберы могут возникнуть проблемы. Что за проблемы и как с ними справиться, читаем ниже.

Дело в том, что начиная с некоторой версии (поправьте) udev обрабатывает устройства параллельно, то есть возможна гонка состояний при обнаружении устройств.

Этот эффект может привести к отличной от ожидаемой/желаемой привязке реальных чипов к устройствам /dev/videoN.

Избежать такого перемешивания можно двумя способами.

Cложный способ через udev.

C помощью правил udev, попытаться по различию некоторых свойств (доступных udev) «раздать» имена устройств в нужном порядке. В качестве примера поищите как это делается для аналогичной проблемы, только с сетевыми платами.

Простой способ - блокировка загрузки модуля из initramfs.

Запрещаем автозагрузку модулей устройств видеоввода:

user@host:~$ sudo echo 'blacklist bttv'     >> /etc/modprobe.d/blacklist
user@host:~$ sudo echo 'blacklist saa7134'  >> /etc/modprobe.d/blacklist
user@host:~$ sudo echo 'blacklist cx88xx'   >> /etc/modprobe.d/blacklist
user@host:~$ sudo update-initramfs -u

В файле «/etc/rc.local» перед «exit 0» прописываем команды ручной загрузки модулей:

/etc/rc.local

...
# загружаем драйвер для плат на видеокодерах BT878
# (как указывать типы плат см. выше)
insmod bttv  card=тип_платы_1,тип_платы_2, .....  tuner=-1 autoload=0
# достаточная для полной инициализации устройств пауза
sleep 2

# загружаем драйвер для плат на SAA7134
insmod saa7134  card=тип_платы_1,тип_платы_2, ..... 
sleep 2

# загружаем драйвер для плат на CX2388x
insmod cx88xx card=тип_платы_1,тип_платы_2, ..... 
sleep 2

exit 0
Примечание: скрипт /etc/rc.local выполняется из /etc/init.d/rc.local (см: init ), который в свою очередь выполняется последним (обычно).
Если в системе есть какие-то демоны, работающие с видеограбберами, то нужно обеспечить их запуск после /etc/init.d/rc.local.
См.: update-rc.d или для Debian/Ubuntu, chkconfig для RedHat/Fedora .
howto/linux-capture-cards.txt · Последние изменения: 2012-01-19