XrX Portal Новости статьи и обзоры из мира высоких технологий > Мир Линукса > Работа с цифровыми видеокамерами в Linux: киношедевр Пингвинопполы Вернуться назад
Работа с цифровыми видеокамерами в Linux: киношедевр ПингвинопполыДата: 5 декабря 2007. |
|
Сейчас я задам один вопрос, который, наверное, очень многих поставит в тупик. Вспомни-ка, когда ты в последний раз держал в руках старую добрую VHS кассету, не говоря уже о том, где находится твой пульт от видеомагнитофона? Ладно, не стоит себя утруждать – я и сам-то это не вспомню. Как-то слишком незаметно подкрался технический прогресс, и теперь чтобы посмотреть какой-нибудь фильм дома многие достают DVD с полки, либо загружают файл с жесткого диска. При такой распространенности цифровых технологий и тех благ, которые они нам несут, все стараются также избавиться от «аналоговых» пережитков прошлого и в своей домашней фото- и видеотехнике. Первыми полетели в «утиль» пленочные фотоаппараты – их цифровые коллеги, со всеми своими плюсами и относительной доступностью, окончательно вытеснили соперников с рынка, а коллекции фотографий с каждым прошедшим праздником занимают на хардах пользователей все больше и больше места. С видеокамерами примерно такая же история, правда, стоимость цифровых вариантов все еще остается достаточно высокой, и вряд ли существенно изменится в ближайшее время, но все же количество их счастливых обладателей увеличивается неукоснительно. Как известно, чтобы полноценно работать с этими девайсами и переписывать находящуюся на них информацию, так или иначе, требуется их подключение к компьютеру и поддержка соответствующих функций со стороны операционной системы и программного обеспечения. Из-за растущей популярности с Linux’а уже давно снят штамп «серверной» ОС, и требования, предъявляемые к нему, как к полноценной мультимедийной платформе, не меньше, чем к той же Windows. В этой статье мы будем разбираться, как и какими аппаратными, а главное, программными средствами осуществляется работа с цифровыми видеокамерами в GNU/Linux. Что такое DV?Перед тем как рассматривать программный аспект, интересно будет поговорить о технологических моментах работы цифровых камер и интерфейсах, которые используются при этом. Практически каждый более-менее разбирающийся в современных цифровых технологиях человек наверняка слышал о таких понятиях, как «DV камера», «DV видео» и т.д. За этими двумя, казалось бы, очень простенькими буковками стоят о-о-очень крупные акулы современной High-End индустрии. История эта началась в далеком 1993 году – уже тогда все крупные производители техники прекрасно понимали перспективу использования цифровых технологий в бытовой видеоаппаратуре. И дабы избежать появления на рынке большого количества несовместимых цифровых форматов и стандартов, в 93-м году был создан единый DVC (Digital Video Cassete) консорциум (впоследствии его название сократилось до «DV»). В консорциум вошли такие производственные гиганты, как Canon, Sharp, Sony, Panasonic. Со временем число участников увеличивалось с большой скоростью, и сейчас достигает порядка шестидесяти. Главной целью консорциума было создание единых стандартов цифровой записи на магнитную ленту для бытовой аппаратуры. Были стандартизированы следующие основные параметры: ширина видеоленты (6.35 мм), скорость вращения валов (18.8 мм/c), формат представления сигнала (YUV), коэффициент сжатия (5:1), разрешение кадра (720x576), кодек (DV25). Изначально формат DV задумывался для бытового/любительского уровня, но благодаря успешной реализации на его основе были созданы форматы DVCPro и DVCam, используемые в профессиональной телевизионной аппаратуре. В любительских камерах широкую распространенность получил формат miniDV – он полностью аналогичен оригинальному DV, но размер кассет существенно меньше (не в ущерб ширине пленки), что делает камеры такого вида очень компактными и функциональными. Видео в формате DV по качеству обходит MPEG-2, который используется в DVD-носителях. Запись звука осуществляется без сжатия в очень хорошем качестве – 2 дорожки 48 кГц/16 бит стерео. Звук не зависит от видео, создавая очень гибкие возможности для монтажа отснятого материала. Интерфейс FireWireВозможности и технические показатели стандарта DV очень впечатляют, но за подобные показатели приходится платить. Платой стал высокий объем DV потока, который минимально составил 25 Мбит/с для видео, плюс примерно 1.5 Мбит/с для аудио и 3.5 Мбит/с – для служебной информации. В итоге получается где-то 3.6 Мб/с, что равняется средней скорости копирования CD-диска. Причем из-за того, что головка видеокамеры вращается с постоянной фиксированной скоростью, поток передается в непрерывном режиме и наличие какой-либо задержки просто недопустимо. Было бы глупо, если бы в камерах такого типа отсутствовала возможность прямой передачи отснятого материала в компьютер. Конечно, можно подключить камеру через обычные RCA-разъемы к плате видеозахвата и кодировать поток с нее, но тогда возникает лишнее аналогово-цифровое преобразование, что, безусловно, негативно сказывается на качестве конечной картинки, и весь смысл цифрового видео пропадает. Перед разработчиками встала задача выбора подходящего интерфейса (шины), способного справиться с таким большим потоком цифровых данных и обеспечить стабильную скорость передачи. Также он должен был быть как можно более универсальным, и чтобы его цена не взлетала до заоблачных высот. Этим параметрам на тот момент мог удовлетворить только один интерфейс – IEEE 1394, он же FireWire. Разработка такой именитой компании, как Apple, просто не имела права оказаться плохой, и уже в самой первой своей версии интерфейс поддерживал скорость в 100 Мбит/с. На тот момент о USB 2.0 еще даже и не задумывались, а USB 1.0 отдыхал в сторонке со своими 10-12 Мбит/с. Помимо просто огромной скорости, интерфейс поддерживает работу в синхронных и асинхронных режимах. Первый – важен для данных, которым скорость приоритетнее, чем их сохранность, что идеально подходит для видеопотока, а второй, наоборот, обеспечивает сохранность и целостность денных в ущерб скорости, что важно для четкой передачи команд с компьютера в камеру. Все эти плюсы склонили участников DV-консорциума в сторону этого перспективного интерфейса. И теперь интерфейс FireWire считается стандартом де-факто при работе с цифровым видео. Спустя некоторое время Международной Электротехнической Комиссией (IEC) был разработан специальный протокол IEC-61883, определяющий правила взаимодействия цифровых устройств при передаче данных (видео, аудио и команд) через шину FiewWire. В последующем пропускная способность IEEE 1394 увеличивалась до 800 Мбит/с, и в перспективе могут быть достигнуты цифры в 1.6 Гбит/с и 3.2 Гбит/с, что еще раз подтверждает, что DV-консорциум не ошибся в своем выборе. Взаимодействие с LinuxПосле получения некоторых теоретических знаний по DV-камерам и интерфейсу FireWire мы можем рассмотреть как, на каких уровнях и какими средствами осуществляется взаимодействие оборудования с компьютером и операционной системой. Разобьем все взаимодействие на три уровня: физический уровень, уровень операционной системы и уровень приложений. На физическом уровне получается следующая картина: DV-камера при помощи интерфейсного кабеля соединяется с FireWire-контроллером, расположенным на материнской плате – тут, я думаю, все понятно. На уровне ОС мы остановимся поподробнее. Как известно, чтобы операционная система могла взаимодействовать с каким-либо аппаратным устройством (в нашем случае это FireWire-контроллер), нужна соответствующая поддержка устройства в пространстве ядра системы. В современных дистрибутивах Linux поддержка контроллеров FireWire уже имеется, и, как правило, не требуется прилагать каких-то сверхусилий, чтобы ее включить, но я думаю, будет интересно поподробнее рассмотреть, какие части ядра за нее отвечают. Заодно мы поможем тому, у кого это поддержка отсутствует. Поддержка FireWire-контроллеров и модулей для работы с DV-потоком в ядре включается следующими пунктами (make menuconfig, на примере ядер 2.6.x): Device Drivers ---> IEEE 1394 (FireWire) support ---> Texas Instruments PCILynx support (NEW) Первый пункт, собственно, включает поддержку FireWire в ядро, модуль ieee1394. Второй пункт включает модуль ohci1394 – это поддержка спецификации OHCI-1394 (Open Host Controller Interface). Производители большинства контроллеров придерживаются именно этого стандарта в разработке своих микросхем. Пункт, отмеченный как , включает поддержку специфического чипсета PCILynx компании Texas Instruments – обладателям таких контроллеров придется включить эту опцию. Следующая опция включает модуль video1394, отвечающий за поддержку видеоустройств, подключенных к контроллеру типа OHCI-1394. Этот модуль самым первым появился в ядрах Linux для работы с DV-камерами. К сожалению, video1394 получился не очень удачным из-за своей нестабильности. На смену video1394 пришел модуль dv1394 (следующий пункт), основанный на том же video1394, но за счет улучшенных алгоритмов работы с памятью он более надежен при работе с DV-потоком. И последний пункт подключает модуль raw1394, с помощью которого пользовательские программы получают непосредственный прямой доступ к девайсам, расположенным на шине FireWire, через так называемое виртуальное Raw-устройство. Предпочтительнее использование данного модуля, чем модуля dv1394, и тем более video1394, так как в этом случае программное обеспечение получает больше возможностей в работе с FireWire-устройствами. В этой статье мы будем ориентироваться именно на него, как на более удачный и современный вариант. Чтобы проверить, какие из этих модулей установлены в твоей системе, введи команду: # modprobe -l Она покажет все модули, поддерживаемые твоим ядром. Также ты можешь сам посмотреть их наличие, заглянув в каталог: /lib/modules/[версия ядра]/kernel/drivers/ieee1394. В случае полного отсутствия вышеперечисленных модулей, тебе придется пересобирать ядро. Также стоит убедиться, верно ли определяет ядро твой FireWire-контроллер. Для этого по команде lspci должно выводиться примерно следующее: 02:03.0 FireWire (IEEE 1394): VIA Technologies, Inc. IEEE 1394 Host Controller (rev 46) Дальше будем считать, что требуемые модули у тебя установлены, и ядро нормально определяет твой контроллер. Теперь пришло самое время подключить камеру к контроллеру и посмотреть, как на это отреагирует ядро. Сначала проверяем, все ли модули загружены: # lsmod Если ничего не загружено, то последовательно вводим команды для загрузки наших модулей. # modprobe ieee1394 # modprobe ohci1394 # modprobe raw1394 По команде dmesg мы должны увидеть вот такие строки: ohci1394: fw-host0: OHCI-1394 1.0 (PCI): IRQ=[11] MMIO=[de001000-de0017ff] Max Packet=[512] ieee1394: Host added: ID:BUS[0-00:1023] GUID[262d480001000000] ieee1394: raw1394: /dev/raw1394 device initialized Теперь подключаем камеру, переключаем ее в какой-нибудь из режимов (camera/player), и через несколько секунд смотрим вывод dmesg’а: ieee1394: Node added: ID:BUS[0-00:1023] GUID[0000f0000c5c1fe8] ieee1394: Node changed: 0-00:1023 -> 0-01:1023 Переводим камеру в OFF и снова смотрим вывод dmesg’а: ieee1394: Node suspended: ID:BUS[0-00:1023] GUID[0000f0000c5c1fe8] Видно, что при включении камеры ядро идентифицирует на шине соответствующий узел (Node), а при отключении – отключает его от общей FireWire-шины, переводя в suspend режим. У себя ты должен получить такой же результат. Теперь нужно проверить наличие в системе файла-устройства /dev/raw1394, через которое программное обеспечение будет взаимодействовать с нашей камерой. Если у тебя этого устройства не оказалось, то создай его командой: # mknod -m 666 /dev/raw1394 c 171 0 Разберемся с параметрами: -m 666 – этот «сотонинский» :) параметр указывает лишь на то, что для файла-устройтсва /dev/raw1394 устанавливаются права доступа «666», то есть все пользователи могут использовать устройство как для записи, так и для чтения; /dev/raw1394 – название устройства; c – указывает на то, что устройство символьно ориентированное. Особенность символьных устройств заключается в том, что данные с них (на них) передаются последовательно побайтно, то есть в один момент времени имеется доступ лишь к определенному байту информации. Именно к такому типу относятся носители на магнитной ленте, в частности, наша DV-камера. 171 – это так называемый старший номер устройства (Major Number), с помощью которого обозначается тип устройства. Для FireWire-устройств в Linux-системах этот номер равняется 171. 0 – младший номер устройства (Minor Number), конкретизирует устройства с одинаковыми старшими номерами. В нашем случае конкретизируется используемый модуль для работы с камерой. Для различных модулей используется определенный диапазон значений:
Тут «0» указывает на то, что работа с устройством осуществляется с помощью модуля raw1394. Что ж, мы создали файл-устройство, и на этом наши разборки с ядром закончились, и на уровне операционной системы мы получили следующее:
Теперь мы переходим к рассмотрению программных средств в пользовательском пространстве для работы с камерой. Программные средстваКонечно, использование модуля raw1394 дает огромные возможности приложениям, но, как правило, приложения не работают непосредственно напрямую с устройством, так как в этом случае они сильно зависят от версии ядра и модификации модуля, и в случае существенного изменения какого-либо из этих двух компонентов приходится перекомпилировать и сами приложения. Для того чтобы избежать подобного рода сложностей, создаются специальные библиотеки с различными процедурами и подпрограммами. Именно с помощью этих библиотек приложения и работают с устройствами, и в случае обновления ядра или модуля, пользователю нужно будет обновить всего лишь библиотеку, что гораздо удобнее, чем обновление всего используемого ПО. В случае с модулем raw1394 такой библиотекой выступает libraw1394 (http://www.linux1394.org/) – с ее помощью происходит взаимодействие между приложениями и FireWire-устройствами. На том же сайте доступна еще одна библиотека, libiec61883 – это уже специальный API для стандартизированного протокола IEC-61883. Библиотека предназначена для упрощения разработки приложений и увеличения эффективность передачи DV-видеопотока с шины FireWire. Обе эти библиотеки ты должен установить в свой дистрибутив (начать лучше с libraw1394). Это можно сделать прямо из исходников – благо все делается тремя классическими командами, и никаких затруднений вызвать не должно: # ./configure # make # make install После их установки введи команду: # testlibraw Она выводит всю информацию по твоему контроллеру и подключенным к шине узлам. Для того чтобы из приложений можно было управлять механическими блоками камеры, также придется установить специальную библиотеку ibavc1394 (http://sourceforge.net/projects/libavc1394). Ее инсталляция также проста, как и в случае с двумя вышеупомянутыми собратьями. И вот мы потихоньку подбираемся к практически заключительной части, а именно, к установке DV-кодека для декодирования DV-видеопотока с цифровой камеры. Для этого нужно установить заинсталить[Л1]... что? :) Правильно, еще одну библиотеку – libdv (http://libdv.sourceforge.net/)! На этом мы заканчиваем с собраниями сочинений отдельных программистов и переходим непосредственно к утилитам, которые в своей работе будут использовать все, что мы тут насобирали. Хочу сразу предупредить, что это только основные библиотеки, которые нужны для нормальной работы программ с DV-камерами. Не факт, что для твоей системы не потребуется еще что-нибудь, например, звуковая библиотека FLAC, – все зависит от конкретного дистрибутива и пакетов, установленных в нем. Поэтому при сборке программ внимательно смотри на сообщения, выдаваемые их конфигурационными скриптами, и если у тебя не будет чего-то хватать, они тебя обязательно об этом известят, и ты сможешь доустановить недостающие пакеты. Самой популярной и функциональной программой для работы с нелинейным DV-видео из всех существующих на данный момент в Linux является Kino (http://www.kinodv.org/). У программы имеются все необходимые возможности, которые могут потребоваться в работе с цифровым видео: функция захвата видеопотока с камеры в файл, осуществление монтажа отснятого материала прямо в программе, экспорт из DV-формата в другие популярные видеоформаты (MPEG2-DVD, MPEG4-DivX, H.264, VCD и другие) – в общем, все, что нужно хорошему видеоредактору. Если захочется добавить в свое домашнее видео какие-нибудь несложные видеоэффекты, титры, сделать монтаж и т.д., то для таких целей также есть несколько программ: например, Сinelerra (http://www.heroinewarrior.com) или LiVES (http://lives.sourceforge.net/). Ну а если захочется чего-то большего, то можно посмотреть в сторону профессиональной, но, к сожалению, коммерческой программы Shake (http://www.apple.com/shake) – с помощью нее делались спецэффекты к таким популярным голливудским хитам, как «Матрица», «Гладиатор» и «Ледниковый Период». ЗаключениеВот мы и познакомились с работой DV-камер в Linux-системах. Читатель может заметить, что данная поддержка в Linux присутствует достаточно давно и постоянно совершенствуется. Подтверждением этому является наличие в ядрах аж трех различных поколений модулей для работы с DV-камерами. Как наиболее современный вариант мы подробно рассмотрели модуль raw1394. Также мы рассказали про основные библиотеки, которые задействуются при работе программ с raw1394. В качестве основной программы мы рекомендуем использовать kino, так как в ней есть все самые необходимые возможности по работе с DV-видеопотоком. Для пользователей, которые хотят чего-то большего, в Linux также найдутся достойные приложения – кто знает, может кому-то захочется сделать мультик не хуже, чем творения Pixar. На этой позитивной ноте мы и закончим. Удачи :)! |