Видеозахват и сжатие видео в Linux

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

О настройке TV Tuner в Linux на примере Beholder 409FM говорилось в этом посте.

Запись видеопотока с устройств захвата на примере ТВ Тюнера

Большинство программ просмотра телепередач, например tvtime, умеют только просматривать программы и снимать скриншоты. Но время от времени требуется и записывать передачи, особенно когда они идут в неподходящее время. Для этого, в соответсвии с UNIX way, есть другие утилиты. Одна из них называется streamer.

#aptitude install streamer
После того, как пакет streamer будет установлен, он сможет писать и снимать скриншоты из из /dev/video0 и /dev/dsp в картинки jpeg, png и в видеофайлы со звуком. И ролики пишет, и скриншоты делает (в том числе несколько через равные промежутки времени). Программа,
естественно, консольная, так что завернуть её в скрипт труда не
составит.

Для подробной справки у streamer есть очень хороший ключик, который называется -h. Справка написана очень толково, с примерами и простым языком.
Программа пишет в файл заданного имени данные с указанного тюнера, в формате raw и с разными типами компрессии, с заданным числом кадров в секунду и проч.

Вот, например, мой скрипт на bash:
#! /bin/sh

if [ -z $1 ]; then
kmvTimeToRecord=50;
else
kmvTimeToRecord=$1;
fi

streamer -o ~/movie.avi -r 24 -f mjpeg -j 90 -s 720x520 -F mono8 -t $kmvTimeToRecord:00 -p2

Скрипт пишет в файл movie.avi 120 минут телепрограммы с тюнера (если время не передано скрипту явно) 24 кадра в секунду с mpeg-компрессией и в полном формате 720x520 и восьмибитным звуком.
Включение скрипта в нужное время осуществляется командой at, позволяющей выполнять любые задания в указанное пользователем время. Это ещё раз иллюстрирует мощь UNIX-way: несколько мелких программ можно связывать в цепочку для получения нужного результата.


Сжатие видеоданных
Если вы будете захватывать в jpeg-сжатии для экономии места, качество будет посредственным, а если в rawvideo rgb15, то минута видео займёт гигабайт. И тут потребуется сжать видеопоток...
Естественное желание - всё это как-то скомпрессировать. Есть несколько программ данного класса: например ffmpeg и mencoder.

Показательна следующая история. Мой коллега, использующий виндовс, обратился ко мне с просьбой: не могу ли я сжать видеофайл 50Гб, перегнанный с видеокассеты? Могу, конечно, а что, говорю, под виндой с этим проблемы? На что мне было отвечено, что некий VirtualDub попросил под это дело 7Гб и 16 часов времени. Ладно, скидываю данные на переносной винчестер, прихожу домой, врубаю mencoder и выпадаю в осадок: mencoder попросил 370Мб и 32 минуты на всё. Как говорится, почувствуйте разницу.


Пример с ffmpeg
Установим ffmpeg из стандартного дистрибутива Дебиан. После её установки у нас появляется возможность задавать множество параметров для пережатия захваченного видео с тюнера в MPEG4 с хорошим сжатием и неплохим качеством. Дабы не утомлять читателя man ffmpeg (а он там действительно впечатляющий), привожу свой башевский скрипт, настройки которого более или менее разумны:

#! /bin/sh
ffmpeg -i movie.avi -f avi -vcodec mpeg4 -b 800 -g 300 -bf 2 new.avi
Этот скрипт вызывает ffmpeg и указывает сжать файл movie.avi в новый, new.avi, с кодеком mpeg4 и хорошим качеством. Пережатие - долгая операция, так что можно за это время выпить чашечку любимого напитка или даже принять ванну.


Пример с mencoder

Входящая в комплект вместе с Mplayer, утилита mencoder так же очень здорово сжимает видеоданные, в том числе с ТВтюнера. Вот пример с настройками, дающие удовлетворительное качество видеоизображения для просмотра:
mencoder movie.avi -o new.avi -oac copy -ovc lavc -lavcopts vcodec=mpeg4:mbd=1:vbitrate=1800 -ofps 24
При этом перекодируется входной файл movie.avi в новый файл, new.avi с визуально удовлетворительным качеством. Чтобы каджый раз не вбивать параметры в командную строку добавил профили в mencoder.conf, например так:

[ppc]
profile-desc="ppc"
vf=scale=320:240
oac=mp3lame=1
lameopts=mode=3:cbr=1:br=48
ovc=lavc=1
lavcopts=vcodec=mpeg4:vbitrate=270
ffourcc=DIVX

Для уменьшения размера с точными пропорциями можно vf=scale=320:240 заменить на

vf=scale=1
zoom=1
xy=320

Теперь видео будет иметь ширину 320, а высота будет просчитана автоматически с соблюдением пропорций.


Заключение
Наверное, есть ещё много разных способов и параметров конвертирования, которые знают уважаемые комментаторы. Просьба не стесняться и выкладывать в комментариях полезные ссылки, программы и свои оригинальные идеи по сжатию видео.

30 комментариев: |высказаться!| RSS-лента дискуссии.|
Анонимный комментирует...

Спасибо, большое за статью. Совсем недавно приобрел ТВ-тюнер. Статья очень кстати. (:

virens комментирует...

2 Анонимный пишет...
Спасибо, большое за статью.
Пожалуйста. На самом деле, я разделил большую статью про Beholder TV409 на две, поправив обе.

Совсем недавно приобрел ТВ-тюнер. Статья очень кстати. (:
Ещё немного поправил пост, поставив в нём обратную ссылку на пост с тюнером. Может, тоже пригодится :-)

nagos комментирует...

370Мб и 32 минуты на всё.
+1. Сжимал недавно HDTV фильм (xvid-xvid+ фильтры). Виндовс потратил 12 часов на 1.5ч. фильм, mencoder в linux около 4ч.

Анонимный комментирует...

Вот так я перекодирую видео с DV-видеокамеры:
#! /bin/bash
# Перекодировка в почти высшем качестве(interlaced): vhq *.avi bitrate
nice -n 19 mencoder -ovc lavc -lavcopts vcodec=mpeg4:vbitrate=$2:mbd=2:trell:v4mv:last_pred=2:dia=-1:vmax_b_frames
vb_strategy=1:cmp=3:subcmp=3:precmp=0:vqcomp=0.6:turbo:vpass=1 -oac copy -o /dev/null $1
nice -n 19 mencoder -ovc lavc -lavcopts vcodec=mpeg4:vbitrate=$2:mbd=2:trell:v4mv:last_pred=2:dia=-1:vmax_b_frames
vb_strategy=1:cmp=3:subcmp=3:precmp=0:vqcomp=0.6:turbo:vpass=2 -vf kerndeint,pullup,softskip,hqdn3d=2:1:2 \
-oac mp3lame -lameopts br=128:vbr=3 -af volnorm,volume=0:1 -o VideoOut.divx $1
rm divx2pass.log

virens комментирует...

2 nagos пишет...
+1. Сжимал недавно HDTV фильм (xvid-xvid+ фильтры). Виндовс потратил 12 часов на 1.5ч. фильм, mencoder в linux около 4ч.
Да я думал, что в винде хоть это можно проще сделать. Сам удивился: думал, неправильно указал параметры сжатия. Коллега на работе попросил эту программу. Получил Кноппикс, Убунту и Кубунту :-)

2 Анонимный пишет...
Вот так я перекодирую видео с DV-видеокамеры:
Ух ты... Круто! Двухпроходный?
Попробую и если что добавлю в пост. Если не возражаете, конечно :-)

Анонимный комментирует...

да двухпроходный, адаптировал из скрипта http://www.lissyara.su/?id=1274

wiz комментирует...

А не пора ли жать в h264?

prickly комментирует...

а почему бы не использовать mencoder для сжатия на-лету с тв-тюнера?

mencoder -tv driver=v4l:width=768:height=576 \
-ovc lavc -lavcopts vcodec=mpeg4:vbitrate=350:vhq:vqmax=31:keyint=300 \
-oac mp3lame -lameopts cbr:br=48 -sws 1 -o output.avi \
-vf crop=720:540:24:18,pp=lb,scale=384:288 tv://

это пример из мана (с довольно посредственным качеством). даже довольно дохлые процессоры по современным меркам, могут давать очень даже приемлемое качество в реалтайме. граблю подобным способом видеокассеты.

virens комментирует...

2 Анонимный пишет...
да двухпроходный, адаптировал из скрипта http://www.lissyara.su/?id=1274
Интересный сайт, и скрипт забористый. Как много узнаёшь из комментов! Блеск! Спасибо.

2 wiz пишет...
А не пора ли жать в h264?
Я в алгоритмах видеосжатия не спец, так что если расскажете вкратце - буду только рад.

prickly пишет...
а почему бы не использовать mencoder для сжатия на-лету с тв-тюнера?
Да, я пробовал, но не получилось. Толи mencoder у меня старый, то ли ещё чего... Но попробую.

Aleksandr комментирует...

и вам за ваш сайт спасибо - тоже много нового почерпнул :)

Анонимный комментирует...

здравствуйте!
а каким образом в етче можно создать видеозапись каких-либо действий юзера в определенном окне? нужно для обучающих целей
Заранее спасибо

Dormestmass комментирует...

Весьма полезный пост. Давно уже задумывался о захвате видео с ТВ-тюнера, но никак руки не доходили. Теперь дошли :).
Спасибо!

Анонимный комментирует...

[b]а каким образом в етче можно создать видеозапись каких-либо действий юзера в определенном окне?[/b]
sudo apt-get install recordmydesktop
там есть возможность записи "из окна"

virens комментирует...

2 Анонимный пишет...
а каким образом в етче можно создать видеозапись каких-либо действий юзера в определенном окне?
Мне больше нравится istanbul. Пошукайте в поиске по Линукс-блогам по этому слову - у коллег пробегал интересный топик по этому поводу.

2 Dormestmass пишет...
Весьма полезный пост.
Самое смешное, что это remake - чась этого поста была в статье о настройке тюнера. Когда просматривал старые статьи на отдыхе, счёт эту слишком длинной - разбил на две и вторую часть выложил сейчас. Кстати, пост по тюнеру только что ещё улучшил :-)

Давно уже задумывался о захвате видео с ТВ-тюнера, но никак руки не доходили. Теперь дошли :). Спасибо!
Пожалуйста. У меня вот всё руки не доходили ядро себе обновить на главной машине - хотелось FUSE, tickless kernel и прочих радостей. Обновил, всё собралось, работает - перенастроил ТВ Тюнер, поймал кучу новых каналов. Рад :-)

Анонимный комментирует...

А как каналы то задавать? Не могу разобраться( То есть надо например канал VideoHits1 записывать. По дефолту то он грабит только помехи.

Dekoder комментирует...

Вот таким образом я захватываю с тюнера:

mencoder -tv driver=v4l:freq=49.75:width=768:height=576:audiorate=48000 tv:// -endpos 3300 -o ~/tv.avi -ovc lavc -lavcopts vcodec=mpeg2video:vbitrate=4000:vhq -oac mp3lame -lameopts cbr:br=128

49.75 - это частота первого канала в нашей сетке вещания. И время здесь ограничено на 3300 секунд.

Анонимный комментирует...

mencoder -tv driver=v4l:freq=49.75:width=768:height=576:audiorate=48000 tv:// -endpos 3300 -o ~/tv.avi -ovc lavc -lavcopts vcodec=mpeg2video:vbitrate=4000:vhq -oac mp3lame -lameopts cbr:br=128
Пишелт отлично, но без звука ( у меня вывод звука идет через line), что нужно подправить ?

Анонимный комментирует...

> Пишет отлично, но без звука ( у меня вывод звука идет через line), что нужно подправить ?

Скорее всего нужно указать правильный параметр input соотвествующего драйвера video4linux.
Например, в моём случае (вывод звука на line-in звуковой карты, ТВ-тюнер с моно звуком на основе saa713x) это input=1

Конкретный пример:
mencoder -tv driver=v4l2:input=1:freq=695.25:width=384:height=288:audiorate=44100 tv:// -endpos 3300 -o ~/capture/movie.avi -af volnorm=1 -ovc xvid -xvidencopts bitrate=1025 -oac mp3lame -lameopts cbr:br=128

Анонимный комментирует...

доброго времени суток,делаю по аналогии с вышенаписанным,и mencoder и streamer пишут звук,видео...но пишут так что потом воспроизводится в ускоренном режиме

Вячеслав комментирует...

А как исправить, чтобы запись SECAM каналов шла в цвете?
PAL каналы записываются нормально - цветными!

Анонимный комментирует...

А как исправить, чтобы запись SECAM каналов шла в цвете?

У mencoder, как и у mplayer есть параметр normid (кажется и norm тоже)
normid=6 соответствует SECAM-DK.
параметру norm передаются строковые значения, т.е. norm=SECAM. Но я с normid больше люблю.
запускается примерно так
mplayer tv:// -tv normid=6

igor1102828 комментирует...

Смотрю russiantvonline на компьютере (купленная у них услуга) через RealPlayer, это - их требование; до этого пробовал другие, VLC, Movie Player, MPlayer - ничего не брало, пришлось ставить RealPlayer. Они посылают файл в формате ram (film.ram). Часто линия перегружена и подкачка занимает так много времени, что смотреть фильм становится невозможно. Нет ли способа вначале принять все и записать, а потом спокойно смотреть уже без связи с ними? Смотрю прямо на компе, безо всяких промежуточных тюнеров, поэтому не знаю, можно ли эти предложения как-то использовать.
У меня стоит ubuntu 8.10, оперативки 2 Gb, streamer установлен

Анонимный комментирует...

>Например, в моём случае (вывод звука на line-in звуковой карты, ТВ-тюнер с моно звуком на основе saa713x) это input=1
У меня подобная ситуация. Я пробовал запускать mencoder и с input=0, и с input=1. В первом случае записывается только видео, а звук слышен в динамиках. Во втором случае в видео записывается черный квадрат :). Что еще нужно подкрутить?

Анонимный комментирует...

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

sudo streamer -o ~/movie.avi -r 25 -f mjpeg -j 90 -s 640x480 -F mono8 -t 00:10 -p2

Не знаю как у вас, но с такими параметрами у меня чуть тормозит, видно что в картинках записано. Что подправить?

Ну и потом кодирую:
sudo mencoder movie.avi -o ~/new.avi -af volnorm=1 -ovc xvid -xvidencopts bitrate=1025 -oac mp3lame -lameopts cbr:br=128

Все бы нечего, но по первой команде файл mouve.avi занимает много места. 10 мин = примерно 900 мегам.
Можно ли писать на лету? Что бы сразу кодировалось?
Выше приведенные примеры у меня не работают (( Очень сильно жду ваших ответов ))

velik.84 комментирует...

Жду ответов с нетерпением

Алексей комментирует...

Не мешало бы народу сообщить в посте про xawtv. Я, лично, в своей генту таких вещей не заводил, и только через e-file узнал, что за streamer такой...

Анонимный комментирует...

Может кому поможет! у меня тв на video1 поэтому строка для записи выглядит следующим образом: "streamer -o ~/movie.avi -r 24 -f mjpeg -j 90 -s 720x520 -F mono8 -t 90:00 -c /dev/video1 -p65" -р65 - номер канала а 90:00- колличество минут записи=)))

Анонимный комментирует...

А какой канал ставить если с видеомагнитофона. подключенного через ТВ-кабель (обычный. как антенный), пытаешься писать?

Анонимный комментирует...

а возможно устроить захват от ЮСБ Даззл Видео Креатор Платинум
(Dazzle Video Creator Platinum)
подскажите как и в каком направлении "копать"?

Анонимный комментирует...

Добрий день! У меня такая задачка.

1. Нужно считать с тюнера поток данних с камери каждий кадр отдельно.
2. Просумировать n кадров в один и видать на просмотр.
3. Сохранять кадри одиночние что дайот камера. помоему 25к/с.

Отправить комментарий

Подписаться на RSS-ленту комментариев к этому посту.