- Подписка на печатную версию:
- Подписка на электронную версию:
- Подшивки старых номеров журнала (печатные версии)
LXF105:Повесть о
Материал из Linuxformat.
Содержание |
Повесть о настоящих линуксоидах с элементами квеста и (не очень) счастливой развязкой
- «Опасное это дело – выходить за порог», говаривал старый хоббит Бильбо Бэггинс, и был, разумеется, прав. Вот Андрей Боровский собирался всего лишь купить web-камеру, а написал целую повесть...
Все началось с того, что мне для тестирования разрабатываемого программного продукта понадобилась простенькая web-камера. Заказывать ее на работе – долго и хлопотно, проще самому купить, так что в выходные я отправился на соседний радиорынок. Ларек, в котором торговали дешевыми китайскими мышами, клавиатурами и web-камерами, нашелся довольно быстро. Услышав вопрос, поддерживают ли эти устройства Linux, продавец посмотрел на меня испуганно. Впрочем, поддержка Linux мне не требовалась, а вопрос я задал скорее из любопытства. Ладно, решил я вслух, уж под Windows они точно будут работать (продавец энергично закивал головой)...
Рассматривая купленный товар, я понял, что приобрел действительно безымянную web-камеру. Коробку с устройством украшала единственная глубокомысленная надпись: «Digital USB PC Camera». К чему относилось прилагательное «digital», я так и не понял – то ли к PC, то ли к Camera, а может, и к USB. Внешне устройство напоминало вражеский самолет-диверсант: никаких опознавательных знаков на корпусе. Только один из винтов был заклеен голографической наклейкой, что, видимо, символизировало гарантийные обязательства, взятые на себя неизвестным изготовителем. Кроме самой камеры, в коробке я нашел мини-диск. Надпись на диске гласила, что на него можно записать 255 мегабайт данных или 25 минут музыки. Оставалось надеяться, что там записаны драйверы, а не музыка. Ни о каких инструкциях и описаниях, разумеется, речи не шло. Придя домой, я воткнул камеру в компьютер и выяснил, наконец, что стал обладателем устройства под названием Vimicro ZC0301PLH. Система Windows XP обнаружила драйверы на минидиске и установила их, после чего заявила, что новое устройство работать не может. Чтобы камера заработала, пришлось перезагружать ОС и переустанавливать драйверы. Я получил все, что мне было нужно, но, вспомнив разговор с продавцом, решил проверить, будет ли камера работать и с Linux.
Сначала мне показалось, что на подключение нового устройства компьютер с Kubuntu не отреагировал вообще. Однако, когда я заглянул в директорию /dev, то с удивлением обнаружил новое устройство – /dev/video0. Прошу заметить, что ни перезагрузок системы, ни закачек дополнительных модулей из репозитория Kubuntu для его установки не потребовалось, при этом никакие другие устройства видеозахвата на данном компьютере ранее не устанавливались. Вот он, настоящий Plug and Play! Дрожащими от нетерпения руками я запустил программу VLC из командной строки и уже через несколько минут мог смотреть транслируемое камерой видео с любого компьютера локальной сети (с помощью MPlayer или все того же VLC). Для тех, кого интересуют технические подробности моего эксперимента, привожу текст команды запуска VLC в режиме трансляции видео с устройства /dev/video0:
vlc -vvv -I rc v4l:// :v4l-vdev=»/dev/video0» :v4l-norm=3 :v4l-frequency=-1 --sout '#transcode{vcodec=mpgv,vb=3000,ab=256,venc=ffmpeg{keyint=80,hurr y-up,vt=800000},deinterlace}:std{access=http,mux=ts,dst=192.168.1.36}' --ttl 4
Здесь 192.168.1.36 – адрес узла-источника видео. В результате видеопоток можно смотреть в любом способном на это плейере, введя URL
http://192.168.1.36:8080
Итак, что же это, товарищи, получается? В системе Windows, для которой производитель, вроде бы, специально обеспечил поддержку своего устройства, камера установилась довольно криво, а в Linux, для которого официальная поддержка отсутствует, заработала сразу, без всяких дополнительных усилий – как это принято теперь говорить, «прямо из коробки».
Откуда дровишки?
Мы не будем углубляться в детали строения web-камер USB, а рассмотрим только те параметры, которые влияют на выбор программного обеспечения, обслуживающего устройство. С точки зрения подбора драйвера важнейшим компонентом камеры является чип моста USB (USB bridge). Именно он обеспечивает взаимодействие камеры с шиной USB вашего компьютера. Например, сочетание ZC0301PLH в названии купленной мной камеры как раз указывает на микросхему моста USB (говоря точнее, в данном случае микросхема выполняет всю обработку видеоданных, начиная с опроса состояния матрицы CMOS и заканчивая сжатием потока и отправкой его по шине USB). К счастью для разработчиков драйверов, оригинальных чипов для USB-мостов существует не так уж много. Камеры разных производителей зачастую оснащаются одними и теми же чипами, что позволяет использовать для них одни и те же (или незначительно модифицированные) драйверы.
Второй важный компонент – датчик и изображения (image sensor). Казалось бы, этот элемент камеры не имеет прямого отношения к драйверам, однако разработчикам последних приходится учитывать протокол управления сенсором, используемый камерой.
С точки зрения драйверов и прикладного программного обеспечения, важную роль играет формат, в котором камера передает видеоданные. Некоторые камеры передают видео в форме несжатого потока, другие камеры сжимают отдельные кадры в JPEG или используют для передачи видео один из MPEG-форматов.
Желая выяснить происхождение столь замечательных драйверов для Linux, я погрузился в Интернет. Нельзя не отметить некоторую иронию ситуации – обычно поиском драйверов занимаются тогда, когда какое-то устройство отказывается работать, я же начал искать источник драйверов именно потому, что все заработало лучше, чем я ожидал.
Мои поиски вывели меня на группу GSPCA, занимающуюся разработкой драйверов web-камер для Linux. Официальным сайтом проекта, как я понимаю, является страница его руководителя Мишеля Ксаарда [Michel Xhaard] – http://mxhaard.free.fr. Список оборудования, поддерживаемого на данный момент, вы можете найти по адресу http://mxhaard.free.fr/spca5xx.html (там есть и моя модель). К сожалению, информация из этого списка не всегда может помочь вам с выбором web-камеры, поскольку многие производители (как это было и в моем случае) не снабжают свои устройства сопроводительной информацией.
GSPCA – не единственная группа, которая занимается разработкой драйверов для USB-устройств видео-захвата. Важную роль в этой работе играет так же Linux UVC (http://linux-uvc.berlios.de).
UVC (USB Video Class) – это спецификация, описывающая единый интерфейс для различных устройств (web-камер, камкордеров и т.п.), передающих или принимающих видеопоток по шине USB. Чтобы понять, как повсеместное распространение устройств UVC может изменить нашу жизнь, следует вспомнить ситуацию с фотокамерами и аудио-плеерами, подключаемыми к компьютеру с помощью USB. Еще 5–6 лет назад каждое такое устройство поставлялось с собственным набором драйверов и программ, которые позволяли перекачивать данные с него на компьютер и обратно. Сейчас, как вы, конечно, знаете, ситуация коренным образом изменилась. Любой современный фотоаппарат или плейер, наделенный интерфейсом USB, воспринимается компьютером как внешний диск. Никаких специальных драйверов для подключения такого устройства к компьютеру не требуется, а передача данных выполняется с помощью стандартного файл-менеджера.
Все это стало возможным благодаря тому, что современные USB- устройства, хранящие информацию в виде файлов (будь то плейер, фотокамера, «флэшка» или внешний дисковод), поддерживают единый стандарт, описанный в спецификации USB Mass Storage Specification (UMS). UVC должна стать для USB-устройств, генерирующих и принимающих видеопотоки, тем же, чем UMS стала для устройств, хранящих данные. Когда UVC получит повсеместное распространение, для подключения всех USB-устройств видео-захвата и видео-вывода будет достаточно одного общего UVC-драйвера. Пока же разные устройства продолжают использовать «фирменные» интерфейсы, работа группы GSPCA не теряет актуальности.
Драйверы устройств видеозахвата основаны на системе V4L (Video for Linux), которая реализована в модуле ядра videodev и вспомогательных модулях. В настоящее время драйверы разрабатываются для интерфейса V4L2, хотя старый интерфейс V4L1 сохраненради обратной совместимости. Для того, чтобы ваша система могла работать с камерами, для которых существуют драйверы GSPCA, в ней так же должен быть установлен модуль gspca. Именно благодаря наличию этого модуля в ядре Kubuntu моя web-камера заработала «сама собой», сразу после подключения. Для поддержки устройств UVC требуется, соответственно, модуль uvc.
Как видим, с драйверами для Web-камер у Linux нет проблем. С прикладным ПО дела обстоят ничуть не хуже. Лично я для работы с web-камерой воспользовался программой VLC. Это кроссплатформенное приложение позволяет просматривать видео, переданное камерой (также как и видео из других источников), и сохранять его на диске. Кроме того, VLC можно использовать как сервер и клиент для передачи видео по локальной сети. Список программ, которые могут заинтересовать тех, кто работает с web-камерами, можно найти, например, на сайте http://linuxtv.org/v4lwiki/index.php/Streaming.
Слово разработчику
Как и во многих других Linux-проектах, в группе GSPCA трудятся и наши соотечественники. Один из них, Сергей Сучков, любезно согласился ответить на наши вопросы.
LXF: Как вы пришли к разработке драйверов для Web-камер, что вами движет? Ведь вряд ли производители этих устройств станут когда-нибудь спонсировать вашу работу.
СС: Однажды купил web-камеру, которая не поддерживалась в Linux. А поскольку на рабочем столе и на ноутбуке я не использую ничего, кроме этой ОС, начиная с 1995 года, пришлось разбираться с драйвером [вот он, путь настоящего линуксоида! – прим. авт.].
GSPCA (в то время он еще назывался spca5xx) оказался самым простым в плане модификации исходного кода. Сам по себе код GSPCA имеет очень длинную историю, и в нем отметилось более 200 разработчиков. Сначала мной двигало просто желание заставить работать новое устройство, а потом уже любопытство. Мою работу никто не спонсирует, но, насколько я знаю, некоторые разработчики довольно тесно контактируют с производителями оборудования или даже являются штатными сотрудниками таких компаний.
LXF: Я обнаружил, что установить web-камеру, даже «безымянную», под Linux проще, чем под Windows. Как вы можете это объяснить?
СС: Дело в различных концепциях поддержки устройств в Linux и в Windows. В Windows обычно производитель оборудования отдельно прилагает драйвер для той или иной модели. Эти драйверы пишутся либо программистами самой компании, либо аутсорсерами (что бывает гораздо чаще) по спецификациям, предоставляемым производителем устройства. В Linux это не гарантировано (хотя в последние несколько лет все больше производителей устройств кроме драйверов для Windows стали предоставлять и драйвера для Linux). В этом плане GSPCA (который, кстати, пока не является частью ядра) представляет собой «комбайн», который одновременно поддерживает более 250 различных web-камер и развивается одной командой. Кроме GSPCA, есть еще несколько аналогичных проектов по поддержке web-камер в Linux. Например, UVC Linux поддерживает web-камеры, соответствующие спецификации UVC. Поэтому вероятность получить поддержку популярной web-камеры «из коробки» в Linux весьма высока.
Ну и потом, web-камеры «безымянны» только для конечного пользователя. Внутри них находятся вполне конкретные наборы системной логики (те самые USB-мосты) и сенсоры вполне конкретных производителей, которые создатель web-камеры собрал в единое целое и поставил (или не поставил) на ней свою торговую марку.
LXF: По мнению многих разработчиков, написать драйвер для Linux проще, чем для Windows. Так ли это?
СС: В общем – да. Есть особенности и для той, и для другой системы, но Linux в этом плане проще (по крайней мере, для меня).
LXF: Что самое трудное в разработке драйверов для web-камер?
СС: Сегодня это, в основном, отсутствие спецификаций на протокол управления тем или иным сенсором и на закрытые форматы кодирования видеоданных при передаче (хотя в настоящее время с большинством таких форматов уже разобрались).
LXF: Каким образом вы получаете технические сведения о камерах, для которых пишутся драйверы?
СС: Во-первых, обратным инжинирингом (Reverse Engineering, RE) USB-протокола «общения» web-камеры и компьютера (т.н. USB snoop) под Windows. Во-вторых – анализом полученных данных и сравнением с существующими драйверами. Иногда удается получить спецификации [от производителей, – прим. авт.].
LXF: Приходится ли дизассемблировать драйверы для Windows?
СС: Сами драйверы лично я никогда не дизассемблировал.
LXF: Какого уровня разработчики требуются в вашу группу? Если с вами захочет сотрудничать человек, который хорошо знает C/C++, знаком с основными классическими алгоритмами, писал прикладные программы для Linux, но не имеет опыта разработки драйверов, вы найдете для него задачу?
СС: Конечно. Писать драйвера не так сложно, как это кажется на первый взгляд. Разумеется, придется немного разобраться в архитектуре ядра. Не обязательно во всей, но в основных моментах, плюс, конечно, в тех подсистемах, с которыми придется работать непосредственно. Основных проблем у разработчиков GSPCA, на мой взгляд, две: отсутствие свободного времени и отсутствие всего спектра поддерживаемого оборудования для тестирования новых возможностей или аспектов, связанных с изменением архитектуры драйвера (оборотная сторона поддержки более 250 камер).
LXF: Предположим, я — производитель ноутбуков. Я хочу предустанавливать Linux на свою продукцию. При этом я строго соблюдаю законы, охраняющие права интеллектуальной собственности, поэтому я не устанавливаю такие программные продукты, как, например, MPlayer. Есть ли в наборах ваших драйверов нечто такое, что помешало бы сверхосторожному производителю оборудования предустанавливать их на свою продукцию в России или за ее пределами?
СС: Это зависит от законодательства конкретной страны. В некоторых странах RE разрешен, в некоторых – нет. Насколько мне известно, в России (равно как и в Европе) эта деятельность не запрещена. Но это, в общем, довольно легко обойти чисто технически. Данные, полученные посредством RE, можно сделать «загружаемыми», как это, например, происходит с прошивками (firmware) в некоторых устройствах. На мой взгляд, каких-то серьезных юридических проблем для производителя ноутбуков это не представляет. Всегда есть возможность договориться с производителем того или иного компонента, тем более что таких конкурирующих производителей десятки.
LXF: Несколько лет назад часто говорили о том, что основной причиной невысокой популярности Linux на рабочих столах является отсутствие необходимых драйверов, кодеков и тому подобного. Сейчас ситуация существенно изменилась: и драйверы, и кодеки вроде бы есть, но Linux на ПК по-прежнему – редкость. В чем, на ваш взгляд, причина такого положения дел?
СС: Причины, скорее всего, в большей степени нетехнического характера. Если говорить о ситуации в мире вообще, то значительная часть компьютеров сейчас используется с предустановленной системой, и среднестатистический пользователь относительно нечасто (в массе своей) занимается установкой системы. Кроме того, есть исторический фактор обратной совместимости (то же самое было при переходе от DOS к Windows 3.x, а затем с Win16 на Win32). Конечный пользователь привык к некоторому набору используемых им программ, и ему не так уж и просто перейти даже на хороший функциональный аналог.
Послесловие
Итак, на сегодняшний день поддержка драйверов web-камер (и видеокамер вообще) реализована в Linux на весьма достойном уровне. Если вы хотите организовать систему видеонаблюдения, транслировать живое видео или просто поболтать с друзьями по видеотелефону, ОС Linux готова придти вам на помощь. Тем не менее, проблемы с драйверами остаются, и некоторые из них носят принципиальный характер. Речь идет о пресловутых патентах на технологии, используемые в драйверах.
К сожалению, даже тогда, когда спецификация UVC получит повсеместное распространение, проблемы с правами интеллектуальной собственности не исчезнут. Практически все устройства видеозахвата используют сжатие данных. Проприетарные алгоритмы сжатия, прежде всего семейства MPEG-4, могут стать серьезным препятствием на пути распространения открытого ПО, предназначенного для работы устройствами видеозахвата. Проблема не в технической реализации, и когда Сергей Сучков говорит, что с основными форматами разработчики уже разобрались, он немного скромничает.
На сегодняшний день Linux «разобрался» со всеми форматами, которые поддерживаются (или будут поддерживаться в ближайшее время) цифровыми видеокамерами. Декодирование MPEG-1, 2, 4, MJPEG, VYUV уже не представляет никаких проблем. Однако юридический статус открытых кодеков в большинстве стран не позволяет разработчикам оборудования предустанавливать их на свою продукцию. Эти ограничения пока что не актуальны для России, но наш рынок и не является ориентиром для ведущих производителей. В результате «самой предустанавливаемой» ОС в мире была и остается Windows, а пользователи, в большинстве своем, просто не готовы удалять с ноутбука продукт, за который они все равно уже заплатили, и ставить вместо него Linux. Неудивительно, что число тех, кто, как Сергей Сучков, пользуется на настольных компьютерах исключительно нашей любимой ОС, составляет около 3% от общего числа обладателей ПК.
Проблему прав интеллектуальной собственности на технологии, используемые в драйверах, могли бы решить закрытые двоичные драйверы. Производители оборудования включают отчисления (royalty), причитающиеся держателю патентов на различные кодеки, в стоимость своих устройств (причем вы, как покупатель, выплачиваете их независимо от того, в какой системе будет работать ваше устройство). Фактически, отсутствие драйверов для Linux, разработанных производителем оборудования, означает, что вас, как пользователя Linux, лишают права пользоваться теми функциями устройства, за которые вы уже заплатили. К сожалению, часть вины за отсутствие фирменных драйверов для Linux ложится и на самих разработчиков Linux.
Отсутствие Linux на рабочих столах объясняется, на мой взгляд, отнюдь не только предубеждением пользователей и производителей. Предубеждение – слишком простое и слишком универсальное объяснение. Почему мало людей пользуется Macintosh? Из-за предубеждения пользователей ПК, отвечают сторонники Mac. Если уж говорить о предубеждениях, препятствующих широкому распространению Linux среди «обычных людей», то следует коснуться и тех предубеждений, которые царят среди разработчиков Linux.
В этом смысле любопытна полемика, развернувшаяся некоторое время назад на форумах разработчиков V4L. Как уже отмечалось, в настоящее время для Linux существует две системы V4L – изначальная, названная позднее V4L1, и более новая V4L2. Первая версия V4L появилась в далеком уже 1999 году, и неудивительно, что для нее разработано множество драйверов и прикладных программ. До сих пор далеко не все эти драйверы и программы портированы на V4L2, которая стала частью Linux начиная с версии 2.5 (экспериментальной). Особенно остро эту проблему почувствовали те, кто был вынужден пользоваться закрытыми драйверами, выпущенными производителями устройств. По мере того, как V4L2 набирала популярность, пользователи начали требовать обеспечения обратной совместимости с V4L1. Позиция разработчиков V4L2 заключалась в том, что обратная совместимость не требуется. Новая версия V4L, не совместимая с прежней версией, будет стимулировать производителей оборудования писать открытые драйверы, а если некоторые производители не захотят этого делать, тем хуже для них.
Излишне говорить, что применительно к драйверам такая модель обновления не очень подходит. Разработчики оборудования не так уж охотно пишут драйверы для Linux, а желающих обновлять драйверы для морально устаревшего (читай – уже распроданного) оборудования и вовсе немного. В конце концов здравый смысл победил, и модуль v4l1 остался в ядре Linux, в «компактном» варианте, предназначенном для обеспечения обратной совместимости. Стоит отметить, однако, что группа UVC Linux разрабатывает свои драйверы и инструменты исключительно для V4L2. Те, кто хочет ознакомиться с полемикой между разработчиками UVC Linux и пользователями их продукции, могут почитать дискуссию на http://lists.berlios.de/pipermail/linux-uvc-devel/2006-February/000292.html. От себя добавим, что вопреки предсказаниям разработчиков, модуль V4L1 до сих пор «живет» в новейших ядрах Linux.
Таким образом, фанатичные приверженцы открытого ПО не только не считают отсутствие обратной совместимости интерфейсов модулей ядра недостатком, но даже видят в этой несовместимости хороший способ «перетряхивать систему», освобождая ее от закрытого и не развивающегося «балласта». Мнение же пользователей, которым удобство работы важнее, чем модель создания ПО, может категорически не совпадать с мнением разработчиков. Сторонники бескомпромиссной открытости победят только в том случае, если их идеи примут производители компьютерного оборудования. В противном же случае победа (по крайней мере, на рабочих столах) гарантирована другой ОС. LXF