Захват видео в Linux
Добрый день. На днях мне представилась возможность попробовать себя в качестве оцифровщика видеокассет. Об этом и расскажу.
Такого опыта я не имел, поэтому пришлось изучать все практически с нуля. Надеюсь моя статья поможет новичкам в этом деле сократить время на изучение премудростей захвата и кодирования видео в Linux.
Во-первых, о железе: необходимо иметь установленный в компьютере тв-тюнер или видеокарту с композитным входом и видеомагнитофон, который подключаем RCA-кабелем (в обиходе тюльпан). В моем случае это тв-тюнер на PCI-шине, видеомагнитофон и обычный антенный (RF) кабель (каким раньше денди к телевизорам подключали).
Захват видео, как настоящий тру-линуксоид, я делал с помощью консольного mencoder. Можно, конечно, и в графическом варианте сделать подобное, например в VLC плеере, но он предлагет сразу кодировать видео, а я хотел захватить видео практически без сжатия (lossless кодек) для дальнейшей его обработки в любом видеоредакторе. Раньше эта утилита была в комплекте с консольным плеером mplayer (который наверняка уже установлен в вашей системе как зависимость какого-нибудь видеоплеера), но в моем арче (находящемся в актуальном состоянии) он идет отдельным пакетом. Установить его можно вот так:
Команда для захвата видео с помощью mencoder обычно трехэтажная и выглядит устрашающе, поэтому я набросал небольшой скрипт, облегчающий ее составление:
if [ $# -ne 1 ]
then
echo "
Использование: <скрипт> <имя файла на выходе>
"
exit
fi
cd $PWD
WIDTH=720
HEIGHT=540
AUDIO="-oac pcm"
VIDEO="-ovc lavc -lavcopts vcodec=ffvhuff:mbd=2:trell:v4mv:autoaspect:threads=4"
AUDIO_FILTERS=""
VIDEO_FILTERS="-vf pp=lb,harddup"
OPTIONS="-endpos 30:00 -forceidx -mc 0 -noskip"
TV="-tv driver=v4l2:width=$WIDTH:height=$HEIGHT:input=1:device=/dev/video0:buffersize=1024:alsa:audiorate=32000"
mencoder tv:// -o "$1.avi" $TV $VIDEO $AUDIO $AUDIO_FILTERS $VIDEO_FILTERS $OPTIONS
Запускаетя скрипт так: <имя скрипта> <имя видео файла на выходе>. Выходной файл сохранится в той же папке, откуда запускаете скрипт, поэтому удостовертесь что в разделе жесткого диска, на котором вы собираетесь запускать этот скрипт достаточно свободного места. У меня, например, 30-ти минутное видео заняло 15 Гб.
Теперь о самом скрипте. В общем случае mencoder запускается так:
В нашем случае:
<что кодируем> - это tv://, то есть видеопоток из тв-тюнера или устройство /dev/video0;
driver=v4l2 - самый лучший в мире линукс драйвер для видео! ) ;
WIDTH и HEIGHT - ширина и высота видео в пикселях, думаю, это понятно;
input=1 - для моей модели тв-тюнера обозначает режим "Television (Mono only)". Так как звук все равно одноканальный;
alsa - без этого параметра видео у меня захватывалось без звука;
audiorate=32000 - частота дискретизации звука. Пробовал ставить повыше (44100), но появлялись "потрескивания", поэтому 32000;
-oac pcm - аудио кодек pcm, означает что звук будет без сжатия;
-ovc lavc - видео кодек из состава библиотеки кодеков libavcodec;
-lavcopts - соответственно опции кодека из предыдущего пункта;
vcodec=ffvhuff - lossless-кодек, обеспечивает "почти нетронутое" качество видео, но уже не RAW-видео. Из-за этого кодека я и начал разбираться с mencoder`ом. Чтобы дальше уже в видеоредакторе производить обрезку/нарезку/применение всяческих фильтров и так далее...;
mbd=2:trell:v4mv - эти опции в интернете рекомендуют для получения хорошего качества кодирования. Не уверен что они нужны при кодировании lossless-кодеком, но на всякий случай оставил;
autoaspect - сохраняет пропорции видео как в источнике принимая во внимание все изменения (масштаб, обрезка, ...);
threads=4 - количество потоков кодирования (по умолчанию 1), для ускорения кодирования желательно устанавливать значение, равное количеству ядер процессора. В моем случае threads=4;
-vf pp=lb,harddup - видео фильтры. pp=lb - устранение интерлейсинга, а harddup - используется для принудительного кодирования дублирующихся кадров (также очень рекомендуется к использованию повсеместно в интернете);
-endpos 30:00 -forceidx -mc 0 -noskip - опции mencoder`а. -endpos 30:00 - задает длительность видео в минутах:секундах, которое нужно кодировать, -forceidx - принудительно индексирует видео, а -mc 0 -noskip - опять же очень рекомендуют для лучшей синхронизации видео и аудио.
Вот и все параметры, аудио фильтров я не задавал.
В итоге, как я уже писал, у меня 30-ти минутное видео занимает 15 Гб. Думаю, неплохо. Дальше уже можно с ним делать что душа пожелает. Я, например, хочу сделать из него DVD диск с меню.
Надеюсь эта статья пригодится начинающим линуксоидам-видеоредакторам. Всем удачи и комментируем, не стесняемся.