Видеозахват под Linux

itpress

August 26th, 2010

Сейчас цифровые технологии все больше проникают в нашу жизнь, с каждым днем число счастливых обладателей цифровых фотоаппаратов и камер увеличивается, а место на полках под новые диски с фильмами и музыкой стремительно уменьшается :). Вспомни, когда ты последний раз смотрел видеокассету на своем старом добром видеомагнитофоне? Но у многих из нас все же сохранились кусочки от той старой «аналоговой» жизни в виде кассет с домашними записями, передачами или фильмами, которые очень хотелось бы переписать на CD или DVD-диск и пользоваться всеми благами цифровых носителей информации и фичами ее обработки и воспроизведения. Многим покажется, что осуществить эту задачу в Linux очень сложно, если вообще возможно. Данная статья поможет читателю разобраться в теме видеозахвата и убедиться, что реализовать эту задачу в GNU/Linux вполне возможно, и для этого не требуется каких-то экстраординарных усилий.

Физика

Под видеозахватом понимается процесс преобразования аналогового видеосигнала, исходящего из его источника, в цифровой вид, с возможностью сохранения полученной информации на цифровой носитель. В роли источников видеосигнала могут выступать камера, видеомагнитофон, телевизионная антенна, а под устройствами видеозахвата подразумеваются всевозможные TV-tuner’ы или просто видеокарты с реализацией функций VIVO и соответствующими видеовходами. Для соединения источника с устройством видеозахвата используются кабели двух типов: композитный кабель (Сomposite, VHS) и S-Video(S-VHS) кабель. Для подключения композитного кабеля используется разъем RCA («тюльпан»), а для кабеля S-VHS – разъем S-Video. Если на источнике есть выход S-Video, то лучше использовать для подключения именно его, так как такое подключение позволяет добиться наилучшего качества передаваемого видеосигнала, и, как следствие, получаем более хорошее качество захваченного видеоизображения. На некоторых картах видеозахвата отсутствует композитный вход, тогда нужно воспользоваться переходником с RCA на S-Video.

Звуковой выход на источнике как правило выполнен в виде того же RCA-разъема, при помощи которого его можно подключить к RCA-разъему устройства видеозахвата. Если использовать подключение к звуковой карте, то потребуется переходник с RCA на mini-jack. Аудиопоток можно оцифровывать как с помощью средств карты видеозахвата, так и с помощью звуковой карты. Предпочтительнее все же использовать для этой цели звуковуху. Хочу предупредить, что если используется один кабель RCA, то аудиопоток передается в mono-формате, а если два – то в stereo, поэтому настройки аудиокодека стоит подбирать под соответствующий поток. При кодировании mono-звука как stereo качество не улучшится, но зато объем будет существенно больше.

Условия задачки

Итак, мы имеем какой-то внешний источник видеосигнала (видеомагнитофон), который соединен одним из двух типов кабелей (композитным) с нашим устройством видеозахвата (TV Tuner'ом). Нам требуется настроить поддержку данного устройства видеозахвата в Linux-системе и осуществить захват видеоизображения в файл, пользуясь каким-нибудь программным пакетом.

На данный момент подавляющее большинство карт видеозахвата собраны на чипсетах Bt848/Bt848a/Bt849/Bt878/Bt879 (Brooktree) фирмы Conexant, поэтому именно настройку карт на этих чипах мы рассмотрим подробно, но некоторые общие моменты одинаковы для всех чипсетов. Узнать модель чипа карточки можно из прилагаемой к ней документации, или прямо прочитав маркировку микросхемы на карточке.

Компиляция ядра системы

Перед тем как приступать к работе с каким-либо устройством, необходимо прежде всего, чтобы наше оборудование поддерживалось ядром системы. Для этого потребуется скомпилировать его, включив эту поддержку. Работа с устройствами аудио- и видеозахвата в Linux осуществляется с помощью системы Video for Linux (v4l), в которую входят как аппаратная поддержка устройств, так и программный интерфейс для работы с ними. Ее-то и необходимо включить в ядро. Чтобы скомпилировать ядро нам потребуются его исходные тексты. Скорее всего, они уже есть в системе в каталоге /usr/src/linux-[version], где [version] – номер версии ядра. Но если вдруг их там не оказалось, то как вариант можно скачать последнее ядро с официального сайта www.kernel.org или посмотреть на CD своего дистрибутива, в каталоге /kernel.

После того как ты нашел исходные тексты ядра и распаковал их в нужный каталог, перед компиляцией я тебе советую заглянуть в файл /usr/src/linux-[version]/Documentation/video4linux/bttv/Cards и найти там модель своей карты, чтобы точно удостовериться в ее поддержке.

Большая часть команд, которые я буду описывать далее, требуют привилегий root'а, поэтому если ты пока – не su, то настало самое время им стать.

Переходим в каталог с исходными текстами ядра и запустим меню программы настройки командами:

# cd /usr/src/linux-[version]

# make menuconfig

Драйвера, которые нам необходимы для поддержки устройств видеозахвата, лучше компилировать в виде модулей <M>. Это нужно потому, что нет необходимости в постоянной поддержке устройств видеозахвата, а модуль будет загружаться только тогда, когда она возникнет. Да и настройку модулей делать гораздо удобнее.

Сперва нужно включить поддержку шины I2C (Inter-Integrated Circuit) – она необходима для поддержки драйверов Video for Linux.

Character devices --->

I2C support --->

<M> I2C support

<M> I2C bit-banging interfaces (NEW)

Теперь можно включить поддержку самих драйверов (Video for Linux) и поддержку конкретных чипсетов Bt848/878...

Multimedia devices --->

<M> Video For Linux

Video For Linux --->

--- Video Adapters

<M> BT848 Video For Linux

Для поддержки аудио входа карты видеозахвата надо также включить поддержку аудиочасти чипсета.

Sound --->

<M> Sound card support

<M> BT878 audio dma

После настройки ядра выйди из menuconfig’а с сохранением. Программа создаст необходимые конфигурационные файлы. Теперь для компиляции ядра последовательно ты должен ввести следующие команды:

Создание зависимостей между компонентами ядра.

# make dep

Удаление объектных файлов и всяких ненужных вещей, которые остал8сь от предыдущей компиляции.

# make clean

Непосредственная компиляция ядра.

# make bzImage

Компиляция модулей ядра.

# make modules

Установка модулей в директорию /lib/modules/[kernel version]

# make modules_install

Установка самого ядра. После этой команды ядро и системный map-файл скопируются в корневой каталог раздела и будут иметь названия /vmlinuz и /System.map.

# make install

Я советую переименовать и перенести эти файлы в специальный каталог /boot, чтобы не возникло путаницы в дальнейшем, только не удали другие ядра в этом каталоге, они могут тебе пригодиться, если возникнут какие-нибудь ошибки в процессе загрузки с новым ядром.

# mv /vmlinuz /boot/vmlinuz-new

# mv /System.map /boot/System.map-new

Когда уже ядро и модули скомпилированы и установлены, необходимо наше новое ядро прописать в системный загрузчик, чтобы можно было с этим ядром загружаться. Привожу пример настройки конфигурационного файла самого популярного загрузчика, lilo (Linux Loader). Для этого в файл /etc/lilo.conf прописываем следующие строки:

...

image = /boot/vmlinuz-new

# путь, где находиться наше свежескомпилированное ядро.

root = /dev/hda5

# корневой раздел, где установлен Linux.

label = Linux-new

# метка, которой будет обозначено ядро в загрузочном меню.

read-only

...

Чтобы изменения вступили в силу, обновляем загрузчик командой:

# lilo

Настройка карты видеозахвата в Linux

Как ты уже наверное знаешь, устройства в Linux представлены в виде, так называемых файлов-устройств в каталоге /dev, через которые и происходит взаимодействие внешнего программного обеспечения с этим устройством. Так вот, файлы устройств для карт видеозахвата называются /dev/video[0,1,2..]. Для нашей карточки файл будет называться /dev/video0, если карточек несколько, то им присваиваются имена video1, video2 и т.д.

Зачастую эти файлы уже имеются в большинстве дистрибутивов, но все же для уверенности это лучше проверить. Выполняем команду:

# ls -l /dev/video0

Если вдруг данного устройства не оказалось, тогда воспользуемся специальным скриптом MAKEDEV, который есть в исходных текстах ядра. Для этого перейдем в каталог, где он находится, установим права для запуска и выполним его с параметрами video 0:

# cd /usr/src/linux-[version]/Documentation/video4linux/bttv

# chmod 711 ./MAKEDEV

# ./MAKEDEV video 0

Поскольку части ядра, отвечающие за поддержку нашего устройства, мы компилировали в виде отдельных модулей, то их надо настроить, хотя это и не обязательно. Возможно, модуль во время загрузки сам сможет определить, какая у тебя модель карточки видеозахвата, и подберет параметры самостоятельно, но все же, если возникнут проблемы, то придется вручную устанавливать нужные параметры – это не так уж и сложно.

Для этого необходимо отредактировать файл /etc/modules.conf – он должен иметь примерно следующее содержание:

#i2c

alias char-major-89 i2c-dev

options i2c-core i2c_debug=1

options i2c-algo-bit bit_test=1

#btv

alias char-major-81 videodev

alias char-major-81-0 bttv

options bttv card=2 radio=1

options tuner type=3 debug=1

Параметры модулей управления шиной I2C: i2c-core, i2c-algo-bit изменять не стоит. А вот в параметрах модулей настройки карточки следует кое-что поменять. Первый важный параметр – это «card», который определяет модель карты. Для того чтобы выяснить, чему он должен быть равен, следует заглянуть в файл: /usr/src/linux-[version]/Documentation/video4linux/bttv/CARDLIST и найти значение, которое соответствует модели твоей карты. Если там ее нет, то установи значение «card=0» которое соответствует совместимой с данным чипсетом карте.

Второй важный параметр – это «type», который устанавливает стандарт передаваемого сигнала. Существует три типа стандарта – это: PAL, SECAM и NTSC. PAL – используется в странах Европы, SECAM – используется на просторах бывшего CCCР, а NTSC – в Японии и США. Стандарты PAL и SECAM очень схожи: оба они передают сигнал с частотой 25 кадров/cек (у NTSC – 30), поэтому большая часть нашей техники поддерживает оба этих стандарта. Так что параметр «type» надо устанавливать в зависимости от типа передаваемого сигнала источником. Список значений можно посмотреть в том же файле CARDLIST, кроме того, значение type=3 подойдет для большинства аппаратуры, работающей в системах PAL и SECAM.

Параметр «radio» определяет поддержку устройством радио. Если карта его не поддерживает, то надо установить значение «radio=0».

Итак, после всех процедур нужно загрузить систему с новым ядром и внимательно изучить системные журнальные файлы на предмет возможных ошибок.

Проверка полученных результатов

Все, что происходит во время загрузки Linux, фиксируется в специальном журнальном файле /var/log/messages. Я советую его внимательно изучить, так как можно получить очень много полезной информации, касающейся системы в целом. Вот кусочек файла messages, из которого видно, что система нашла и определила PCI-карту видеозахвата AverMedia TVCapture. Что-то подобное ты должен найти и в своем журнале:

midian kernel: Linux video capture interface: v1.00

bttv: Bt8xx card found (0).

PCI: Found IRQ 12 for device 02:01.0

PCI: Sharing IRQ 12 with 02:01.1

midian kernel: bttv: driver version 0.7.106 loaded

midian kernel: bttv0: detected: AVerMedia TVCapture

video AVerMedia [card=13], PCI subsystem ID is 1851:1850

midian kernel: bttv0: using: BT878(AVerMedia TVCapture) [card=13,insmod option]

i2c-core.o: driver generic i2c audio driver registered.

i2c-core.o: driver i2c TV tuner driver registered.

Если ты обнаружил какие-то ошибки, то попробуй загружать модули постепенно – тем самым ты сможешь локализовать проблему и устранить ее. Вот последовательность загрузки:

# modprobe i2c-core

# modprobe i2c-algo-bit

# modprobe videodev

# modprobe bttv card=0

# modprobe tuner type=3

# modprobe tvaudio

Все, на этом разборки с ядром закончились. Надеюсь, что у тебя не возникло больших проблем, и ты можешь спокойно начать читать следующий раздел, в котором будет рассказано, как и какими средствами осуществить этот самый видеозахват в GNU/Linux.

Программное обеспечение

Выбор программных средств для оцифровки видеоизображения в Linux не столь велик, но даже существующие тулзы вполне подойдут для полноценной работы с видеопотоком. Одним из таких средств является программный пакет xawtv (http://bytesex.org/xawtv), который есть в большинстве популярных дистрибутивов. В состав пакета входят различные программы как для просмотра телевизионных программ (xawtv), так и для кодирования видео и видеозахвата (streamer).

Допустим, нам нужно сделать видеозахват в файл. Тогда можно воспользоваться такой командой:

# streamer -c /dev/video0 -f mjpeg -F mono 64 -r 25 -o test.avi

Разберемся с параметрами: -с /dev/video0 определяет устройство, с которого необходимо сделать видеозахват; -f mjpeg – выбор метода сжатия изображения; mjpeg, -F mono 64 – формат аудиоданных; -r 25 – частота кадров, -o test.avi – имя выходного файла.

Возможно, возникнет необходимость выводить видео через X-сервер, например, с использованием программы xawtv для просмотра телевизионных программ, тогда нужно включить в X-сервер поддержку video4linux. Для этого в секции «Module», конфигурационного файла X-сервера /etc/X11/xorg.conf надо прописать: Load «v4l» и перегрузить X-сервер.

Для просмотра телевизионных передач отлично подходит программа tvtime (http://tvtime.net/) - она очень удобна в использовании, да и качество картинки мне понравилось больше, чем в xawtv. Недостатком ее является отсутствие возможности делать захват в файл.

Mplayer

Про следующий пакет я расскажу поподробнее, так как возможности его в принципе неограниченны и совершенствуются с каждым днем. Это mplayer (www.mplayerhq.hu). Помимо популярного видеопроигрывателя mplayer в него входит прекрасная программа-кодировщик mencoder. C помощью этой утилиты можно осуществлять видеозахват и сжатие видеопотока «на лету» большим набором видеокодеков, а также использовать различные фильтры для улучшения качества изображения. В качестве примера приведем команду:

# mencoder tv:// -tv driver=v4l:device=/dev/video0:width=640:height=480:norm=secam:amode=0

-ovc lavc -lavcopts vcodec=mpeg4:vbitrate=950 -vf crop=624:272:8:42 -sws 2 -oac mp3lame

-lameopts cbr:br=64:mode=3 -o vc.avi

Опишем назначение параметров: -tv – режим видеозахвата; driver=v4l – использование драйверов Video for Linux; width=640:height=480 – вертикальное и горизонтальное разрешение; norm=secam – стандарт видео сигнала SECAM; amode=0 mono – параметры аудиосигнала. Вторая строчка: -ovc lavc – команда кодировать видеопоток кодеками библиотеки libavcodec; -lavcopts – задает параметры для видеокодека; vcodec=mpeg4 mpeg4 – кодек (DivX 4/5); vbitrate=950 – установка битрейта; -vf crop=624:272 – удаление пустых мест вокруг видеоизображения для сокращения размера файла и улучшения качества; -sws 2 – программное сглаживание для улучшения качества изображения. Третья строчка: -oac mp3lame – команда кодировать аудиопоток кодеком mp3lame; -lameopts – опции для кодека mp3lame; cbr – кодирование с постоянным битрейтом; br=64 – установка битрейта; mode=3 mono – тип сигнала.

Если ты собираешься после видеозахвата производить различные манипуляции с захваченным видео в других программах, например, добавлять фильтры в avidemux или использовать пакет cinelerra для создания видеоэффектов и нелинейного монтажа, то рекомендуется при захвате либо отказаться от сжатия вообще, но тогда одна секунда несжатого видео будет занимать 21 Мб на жестком диске, что, наверное, не очень здорово, либо, как вариант, использовать метод сжатия MJPEG (в mencoder установить vcodec=mjpeg), который позволяет хорошо сжимать видеопоток без явных искажений. А уже для финальной компрессии можно использовать какой-нибудь из MPEG4 кодеков DivX или XVid, например.

Выводы

Как видно, поддержка устройств видеозахвата в Linux реализована на достаточно хорошем уровне, и при желании настройка системы занимает не так много времени и не вызывает серьезных проблем. И с программным обеспечением тоже все хорошо: программный пакет mplayer с его огромными возможностями сможет удовлетворить самые изысканные пользовательские запросы. Удачных захватов :)!

Tags: soft