Як в linux перетворити dv-камеру в web-камеру (статті - комп'ютерне linux як перестати

Але, як сказали на якомусь форумі, випадків підключення цієї камери в Linux у вигляді WEB-камери в інтернеті не виявлені. При підключенні через USB камера нормально визначається як USB-пристрій, і на цьому все закінчується. Пристрої / dev / videoX не створюється, бо в ядерних драйвери підтримки даної камери немає і, мабуть, ніколи не буде.

Але не лежати ж камері без діла! Тим більше що бабуся з далекого міста дивується, чому вона може налаштувати скайп з камерою, щоб ми її бачили, а такі просунуті комп'ютерники як я - ні. Мені стало прикро, і я вирішив будь-що-будь завести цю камеру під Linux-ом.

Отже, з'ясувалося, що деякі умільці підключають DV-камери по шнуру FireWire, а потім, скориставшись модулем ядра vloopback. створюють пристрій / dev / video0. Це стандартний файл пристрою веб-камери, з ним можуть працювати такі програми як Kopete і Skype. Повністю опису даного процесу і потрібні команди ніде не знайшов, тому почав розбиратися, так би мовити, з нуля.

Перше, що з'ясувалося - це те, що модуль vloopback існує тільки для ядер 2.6.x, і його реалізації для 3.2.x немає в природі. А у мене система Debian Testing Squeezy з ядром 3.2.0-4-686-pae. Зібрати vloopback з початкових кодів для ядра 3.2.x теж не вийшло, а на офіційному сайті ні слова про підтримку ядер версії 3.

Для установки даного модуля необхідно встановити пакети з заголовками файлами ядра, які зазвичай називаються linux-headers *. У моєму випадку це був пакет linux-headers-3.2.0-4-common. Я його встановив, після чого розпакував архів v4l2loopback і запустив компіляцію з установкою:

  1. make (від користувача)
  2. make install (від рута)

В результаті модуль був скомпільований і встановлений в систему. Автозапуск модуля ніде інсталл-скриптом не описує, на перших порах його можна запускати руками:

У разі вдалого запуску модуля, в системі буде створено файл / dev / video0. а в списку модулів (можна подивитися через команду lsmod) з'являться рядки:

v4l2loopback 22660 0
videodev 61658 1 v4l2loopback

Можна вважати, що половина справи зроблена.

Далі необхідно перевірити, чи приймає Linux-система дані по FireWire. Пам'ятаючи про те, що починаючи з якоюсь версії ядра 2.6.x в Linux видалили модуль raw1394. і замінили його модулями firewire_ohci + firewire_core. з якими половина софта не працює, я приготувався до довгого колупання. Але, на подив, монтажна програма Kino бадьоро показала картинку з камери. Я зрадів і став перевіряти, чи можна передати FireWire потік в mplayer / mencoder.

Для початку я просто перевірив каптюрінг в файл через консольну програму dvgrab:

Далі я перевірив, чи може mplayer показувати потокові дані з камери. Програма dvgrab може передавати FireWire дані в стандартний потік. Для цього треба в кінці команди поставити знак "-". А програма mplayer може приймати дані зі стандартного потоку. Для цього в кінці команди теж потрібно поставити знак "-".

В результаті, сформувалася ось така команда:

dvgrab -noavc - | mplayer -noconsolecontrols -

Можна подивитися потік FireWire і через VLC:

dvgrab -noavc - | vlc -

Але VLC відображає картинку з сильним лагом в порівнянні з MPlayer.

Тепер потрібно зробити наступне:

Перші три пункти реалізуються за допомогою такої команди:

dvgrab -noavc - | mencoder -ovc raw -nosound -vf tfields = 0, detc, scale = 320: 340, format = yuy2 -o / dev / video0 -

Пробіжимося коротко по опціях mencoder-а.

Could not connect to video device (/ dev / video0).

Pleace check connection.

Кажуть, що ця помилка виникає через те, що користувач не включений в групу video. Перевіряємо - мій пользоватьель в групі video. Тоді в чому ж справа?

Як в linux перетворити dv-камеру в web-камеру (статті - комп'ютерне linux як перестати

Картинка мерехтіла, була вся в зелених і синіх смужках, колір був відсутній як такий. Ох і довго ж я розбирався чому так. Зрештою так і не розібрався, але частково зміг обійти проблему.

Чому зеленуватий відтінок? Тому що в README програми test написано:

since all pixels are set to "0" it will be green.

Я плюнув на все, заліз в исходник test.c. поруч з глобальної змінної debug завів глобальну змінну pixel_byte:

static int debug = 0;
__u8 pixel_byte = 128;

У коді знайшов заповнення пам'яті константою 0:

memset (buffer, 0, framesize);
memset (check_buffer, 0, framesize);
for (i = 0; i check_buffer [i] = 0;
>

memset (buffer, pixel_byte, framesize);
memset (check_buffer, pixel_byte, framesize);
for (i = 0; i check_buffer [i] = pixel_byte;
>

Скомпілював, запустив, і підібрав значення константи pixel_byte = 128. При ній видається картинка в сірих тонах, а не в зелених. В ході підбору та перезапуску програми test, несподівано виявив, що після трьох-п'яти запусків програми test зникає весь цифровий шум, і картинка стає чіткою, без будь-яких артефактів:

Як в linux перетворити dv-камеру в web-камеру (статті - комп'ютерне linux як перестати

Я попросив його зробити скріншот картинки, який видає скайп на його стороні. І ось що я побачив:

Як в linux перетворити dv-камеру в web-камеру (статті - комп'ютерне linux як перестати
Подивитися реальний розмір

З одного боку - огидні вертикальні смужки невідомого походження. З іншого боку, маємо дозвіл 720x360 (чому, цікаво? Mencoder повинен був смасштабіровать потік до 320x160

170). На лінійці читаються цифри, і видно міліметрові розмітка. Для того, щоб співрозмовник отримав уявлення про те, з ким він говорить, такого "якості" досить.

Взагалі, я вважаю, що ця картинка набагато краще, ніж видають ширвжитковий WEB-камери за 700-800 руб. Тільки чорно-біла.