четверг, 6 августа 2015 г.

Захват и обработка видео из консоли

Для обработки видео существует такая утилита, как ffmpeg, которая поддерживает огромное количество кодеков и форматов аудио и видео.

Захват видео с экрана

$ ffmpeg -y -f x11grab -threads 0 -r 10 -s 1920x1080 \
-i :0.0 -preset slower -tune stillimage -an file.mkv
Описание:
  • -y – перезаписывать существующие файлы;
  • -f x11grab – запись с экрана;
  • -threads 0 – автоматически задавать максимальное количество потоков, если указать, число, то можно задать максимальное количество потоков;
  • -r 10 – кадров в секунду;
  • -s 1920x1080 – размер изображения;
  • -i :0.0 – экран для захвата (можно и удалённо), если указать :0.0+10,20 , то запись будет идти с соответствующим смещением на экране;
  • -preset slower — предустановка режима записи, существует множество (от ultrafast – самый быстрый режим с большим битрейтом, до placebo – очень медленный режим с минимальным битрейтом), лучше смотреть man x264 и подобрать настройку под производительность системы и выбранную частоту кадров;
  • -tune stillimage – предустановка для типа изображения, в данном случае - статическое изображение, т.е. запись с экрана обычных действий (игры записать не получится, для этого нужно указать film или вообще не указывать ничего);
  • -an – записывать без звука.
Кодек для записи видео можно указать явно через -vcodec …, по умолчанию для mkv используется libx264.
Для записи звука нужно указать -f oss -i /dev/dsp -acodec libfaac -ab 192k для oss (для ALSA не знаю…).
  • -f oss – запись через oss;
  • -i /dev/dsp – устройство записи (если несколько звуковых карт, указать своё);
  • -acodec libfaac – кодек записи, этот более-менее оптимальный, хотя faac гораздо хуже оригинального от nero;
  • -ab 192k — битрейт аудио.

Разрезать видео

ffmpeg -i video.mkv -ss 10:20 -t 15:00 -vcodec copy -acodec copy video2.mkv
Здесь следует сказать только о двух параметрах:
  • -ss – смещение относительно начала файла мин:сек;
  • -t – длина видео. 
Время может быть указано в формате  hh:mm:ss[.xxx] вплоть до миллисекунд.

Склеить несколько видео

Судя по всему, можно склеивать только видео формата ts и mpg. Для склеивания видео в формате mkv или mp4 с кодеком h264 видимо можно только перекодировав.
ffmpeg -i concat:"video1.mpg|video2.mpg" -vcodec copy -acodec copy video_out.mpg
Три варианта использования с перекодированием:
  • Первый вариант с последовательным перекодированием каждого видео:
    ffmpeg -i input1.avi -qscale:v 1 intermediate1.mpg
    ffmpeg -i input2.avi -qscale:v 1 intermediate2.mpg
    cat intermediate1.mpg intermediate2.mpg > intermediate_all.mpg
    ffmpeg -i intermediate_all.mpg -qscale:v 2 output.avi
    
  • Вариант с отдельным перекодированием и одновременной склейкой и обратным перекодированием средствами ffmpeg:
    ffmpeg -i input1.avi -qscale:v 1 intermediate1.mpg
    ffmpeg -i input2.avi -qscale:v 1 intermediate2.mpg
    ffmpeg -i concat:"intermediate1.mpg|intermediate2.mpg" -c copy intermediate_all.mpg
    ffmpeg -i intermediate_all.mpg -qscale:v 2 output.avi
    
  • Вариант, позволяющий делать всё параллельно (идеально подходит для многоядерных процессоров):
    mkfifo intermediate1.mpg
    mkfifo intermediate2.mpg
    ffmpeg -i input1.avi -qscale:v 1 -y intermediate1.mpg < /dev/null &
    ffmpeg -i input2.avi -qscale:v 1 -y intermediate2.mpg < /dev/null &
    cat intermediate1.mpg intermediate2.mpg |\
    ffmpeg -f mpeg -i - -c:v mpeg4 -acodec libmp3lame output.avi
    

Комментариев нет:

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