Главная микросхема на устройствах аналогово видеоввода - видеокодер. В настоящее время распространены видеокодеры следующих производителей:
Примечания:
Логически, все платы видеозахвата можно выделить 2 класса устройств:
* С аппаратным сжатием. На таких платах, дополнительно к видеокодерам, устанавливают специализированные 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 вещи:
Драйвер не всегда автоматически определяет тип платы. Особенно это касается устройств без телевизионного тюнера, используемых для задач видеонаблюдения.
Для определения типа платы вручную нам понадобятся следующие утилиты:
С помощью 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)
Далее, смотрим как драйвер определил плату:
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. Смотрим видео:
user@host:~$ xawtv -nodga -noxv -geometry 640x480 -c /dev/video0
Таким образом, нужно пробежаться по пунктам 1-4 для всех плат из списка, поддерживаемых драйвером.
card=0×69
(Provideo
PV143), что соответствует простой плате с базовой функциональностью
и без ТВ-тюнера.Если плата нормально заработала, нужно просто прописать параметры для загрузки модуля bttv, согласно правил Вашего дистрибутива.
В 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, попытаться по различию некоторых свойств (доступных udev) «раздать» имена устройств в нужном порядке. В качестве примера поищите как это делается для аналогичной проблемы, только с сетевыми платами.
Запрещаем автозагрузку модулей устройств видеоввода:
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