8/22/2007

Видеозахват и сжатие видео в 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 комментариев:

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

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

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

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

    ОтветитьУдалить
  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

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

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

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

    ОтветитьУдалить
  7. а почему бы не использовать 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://

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

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

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

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

    ОтветитьУдалить
  9. и вам за ваш сайт спасибо - тоже много нового почерпнул :)

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

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

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

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

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

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

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

    ОтветитьУдалить
  15. Вот таким образом я захватываю с тюнера:

    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 секунд.

    ОтветитьУдалить
  16. 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), что нужно подправить ?

    ОтветитьУдалить
  17. > Пишет отлично, но без звука ( у меня вывод звука идет через 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

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

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

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

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

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

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

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

    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 мегам.
    Можно ли писать на лету? Что бы сразу кодировалось?
    Выше приведенные примеры у меня не работают (( Очень сильно жду ваших ответов ))

    ОтветитьУдалить
  24. Жду ответов с нетерпением

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

    ОтветитьУдалить
  26. Может кому поможет! у меня тв на 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- колличество минут записи=)))

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

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

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

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

    ОтветитьУдалить