FFmpeg - Работа с видео

Материал из Кафедра ИУ5 МГТУ им. Н.Э.Баумана, студенческое сообщество
Перейти к навигации Перейти к поиску

FFmpeg - это программа (набор медиа-библиотек с исполняемым файлом), дающая неограниченную власть над видео и позволяющая сэкономить кучу времени.

Описание

Не однажды любой сталкивался с ситуацией, когда надо было:

  • разрезать видео на части или наоборот, склеить из двух;
  • вырезать звук из клипа, заменить звуковую дорожку в фильме (выкинуть бубляж, вставить оригинал);
  • наложить субтитры;
  • обрезать по кадру (crop);
  • сконвертировать для iPhone/PSP/ещёчо;
  • и прочее подобное.

И каждый раз, можно поспорить, начинались поиски, где бы украсть какой софт, чтобы это сделать. Так вот, всё это умеет делать FFmpeg, который не стоит при этом ни копейки (хотя желательно подкинуть пацанам немного помощи).

А ещё некоторые довольно известные видео-редакторы являются по сути лишь графической надстройкой поверх FFmpeg, вот так-то. Но никто не говорит, что это плохо, например XviD4PSP - прекрасный конвертер. Просто зачем использовать тяжёлый GUI, когда всё то же самое можно делать изящно и быстро.

Ссылки на FFmpeg:

Как это запускать

Готовим песочницу

Работает из консоли (командной строки). GUI нет, только хардкор. Подразобравшись с возможностями, можно написать сотни bat'ников или скриптов и творить великие дела со скоростью молнии (той самой, которая на логотипе)

Да, кстати - он кроссплатформенный, есть версии для Windows, Linux и даже OS X.

Статья будет про Windows-версию, но всё описанное применимо и к остальным.

Для начала можно подготовить песочницу следующим образом:

  1. загрузить архив с программой, распаковать её в куда-нибудь;
  2. открыть Total Commander (или любой другой... хотя, зачем другой?) двухпанельник и перейти в каталог bin;
  3. скопировать в этот же каталог видео-файлы, которые требуется обработать. Для удобства можно дать им короткие имена, например 1.mp4;
  4. открыть командную строку из этого каталога;
  5. всё, можно творить.

Набор команд

Далее идёт некоторый список команд с примерами.

Конечно же, всё это и гораздо большее можно найти в официальной документации.

Некоторые операции над видео выполняются без перекодирования (-vcodec copy -acodec copy), некоторые требуют перекодирования (не вникая в детали, можно ставить в таких случаях опцию -crf 18).

Получение информации по файлу

Самая основная команда, будет нужна как предваряющая для многих других.

Выполняется очень просто:

ffprobe.exe 1.mp4

Результат будет примерно такой:

Среди кучи инфы можно найти, что видео идёт две минуты (Duration: 00:02:00.07) и в контейнере две дорожки:

  1. Stream #0:0(und): Video: h264 (High) (avc1 / 0x31637661), yuv420p, 1280x720, 1389 kb/s, 29.97 fps
  2. Stream #0:1(und): Audio: aac (mp4a / 0x6134706D), 44100 Hz, stereo, fltp, 192 kb/s

Вырезать фрагмент видео

Хотим сохранить определённый фрагмент видео:

ffmpeg -i 1.mp4 -ss 00:03:05 -t 00:01:06 -vcodec copy -acodec copy cut.mp4

Эта команда вырежет из файла 1.mp4 начиная с 00:03:05 видеофрагмент продолжительностью 66 секунд (00:01:06) и сохранит его в файл под именем cut.mp4.

Вырезать фрагмент видео из исходника с несколькими звуковыми дорожками

Смотрим информацию по файлу:

ffprobe.exe 1.mp4

Помимо прочей информации видим, например, такое:

Duration: 01:52:52.80, start: 0.000000, bitrate: 2768 kb/s 
  Stream #0:0: Video: mpeg4 (XVID / 0x44495658), yuv420p, 704x384 [SAR 1:1 DAR 11:6]
  Stream #0:1: Audio: ac3 ([0] [0][0] / 0x2000), 48000 Hz, 5.1(side), s16, 448 kb/s
  Stream #0:2: Audio: ac3 ([0] [0][0] / 0x2000), 48000 Hz, 5.1(side), s16, 448 kb/s

Хотим сохранить 63 секунды видео с определённого момента и вторую дорожку (потому что первая, скажем, мерзкий бубляж):

ffmpeg -i 1.avi -map 0:0 -map 0:2 -ss 01:37:34 -t 63 -vcodec copy -acodec copy cut.avi

Тут есть нюанс. Если дорожка в AC3, то изломается CodecID (был раньше такой косяк контейнера AVI, но возможно его исправили), и звук играться не будет. Однако, можно сложить всё в MKV:

ffmpeg -fflags genpts -i 1.avi -map 0:0 -map 0:2 -ss 01:37:34 -t 63 -vcodec copy -acodec copy cut.mkv

Вырезать субтитры из контейнера

Сначала смотрим информацию по файлу (как в примере выше), определяем номер дорожки и:

ffmpeg -i 1.mkv -map 0:2 1.ass

Это же подходит для извлечения аудиодорожек. Ну и видео тоже. Короче, вообще для любого потока из контейнера. Естественно, расширение выходного файла надо задавать в соответствии с потоком.

Поставить на каждый кадр ватермарку

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

Делается это так:

ffmpeg.exe -i 1.mp4 -vf "movie=logo.png [logo]; [in][logo] overlay=16:16[out]" -crf 18 2.mkv

Тут необходимо перекодирование, потому надо задать параметры кодировки, что и выполняет опция -crf 18. Ватермарка лежит в том же каталоге под именем logo.png. Параметр 16:16 - координаты позиционирования верхнего левого угла ватермарки.

Кодирование видео

В основном, с целью уменьшить размер файла. Например, видеозапись с цифровика или захваченное видео Fraps.

Я видел команды на несколько строк, где расписывались битрейты, квантификаторы, фигнификаторы и прочий хардкор, но я же в этом ничего не понимаю, хотелось бы что-то попроще. И оно такое есть, проще некуда:

ffmpeg.exe -i 1.avi -crf 18 out.mp4

Параметр CRF является некоторым уровнем качества и принимает значения от 0 до 51, где:

  • 0 - наилучшее качество;
  • 51 - наихудшее качество. Если выбрать больше 51, например 54 или 9000 - будет браться всё равно 51.

В документации рекомендуется значение 18, выдающее качество "практически равное исходному файлу".

Обрезка (crop) видео

Допустим, у вас исходный файл с разрешением 1366x768, и вы хотите отрезать слева 300 пикселей (или что это за единица размерности). Команда будет такая:

ffmpeg.exe -i 1.mp4 -filter:v "crop=1066:768:300:0" -crf 18 cut.mp4

Первая пара (1066:768) задаёт новый размер кадра, а вторая (300:0) - координаты его левого верхнего угла относительно исходного.

Для этого необходимо перекодирование, потому надо задать параметры кодировки, что и выполняет опция -crf 18.

Захват экрана

Можно захватывать происходящее на экране и писать в файл, как это делает Fraps. Но! Тут это можно делать уже сразу с кодированием видео.

Для этого предварительно потребуется установить устройство захвата (в примере используется Screen Capture Recorder).

ffmpeg.exe -f dshow -i audio="virtual-audio-capturer":video="screen-capture-recorder" -acodec pcm_s16le 
-vcodec libx264 -preset ultrafast -qp 0 testing.mkv

Конвертировать видео в GIF

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

ffmpeg.exe -i video.mov -pix_fmt rgb24 -r 10 output.gif

Ещё команды

В большом количестве такие же сбоники рецептов есть в интернетах, например: