Сейчас я задам один вопрос, который, наверное, очень многих поставит
в тупик. Вспомни-ка, когда ты в последний раз держал в руках старую
добрую 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 --->
IEEE 1394 (FireWire) support
OHCI-1394 support
Texas Instruments PCILynx support (NEW)
OHCI-1394 Video support
OHCI-DV I/O support (NEW)
Raw IEEE1394 I/O support
Первый пункт, собственно, включает поддержку 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-15 – raw1394
-
16-31 – video1394
-
32-47 – dv1394
Тут «0» указывает на то, что работа с устройством осуществляется с помощью модуля raw1394.
Что ж, мы создали файл-устройство, и на этом наши разборки с ядром
закончились, и на уровне операционной системы мы получили следующее:
-
ieee1394 – для поддержки интерфейса FireWire;
-
ohci1394 – поддержка контроллеров OHCI-1394;
-
video1394, dv1394, raw1394 – модули для работы с камерами, подключенными через FireWire-интерфейс;
-
/dev/raw1391 – файл-устройство, через которое пользовательское ПО получает доступ к DV-камере.
Теперь мы переходим к рассмотрению программных средств в пользовательском пространстве для работы с камерой.
Программные средства
Конечно, использование модуля 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. На этой позитивной ноте мы и
закончим. Удачи :)!