FFmpeg - Работа с видео: различия между версиями

Материал из Кафедра ИУ5 МГТУ им. Н.Э.Баумана, студенческое сообщество
Перейти к навигации Перейти к поиску
м (→‎Описание: половины)
 
(не показано 18 промежуточных версий 3 участников)
Строка 1: Строка 1:
[[Файл:FFmpeg-logo.png|right]]
[[Файл:FFmpeg-logo.png|right]]


[http://ru.wikipedia.org/wiki/FFmpeg FFmpeg] - это программа (набор медиа-библиотек с исполняемым файлом), дающая неограниченную власть над видео и позволяющая сэкономить много денег и времени.
[http://ru.wikipedia.org/wiki/FFmpeg FFmpeg] - это программа (набор медиа-библиотек с исполняемым файлом), дающая неограниченную власть над видео и позволяющая сэкономить кучу времени.


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


И каждый раз, можно поспорить, начинались поиски, где бы украсть какой софт, чтобы это сделать. Так вот это всё умеет делать FFmpeg, который не стоит при этом ни копейки (хотя желательно подкинуть пацанам [http://www.ffmpeg.org/donations.html немного помощи]).
И каждый раз, можно поспорить, начинались поиски, где бы украсть какой софт, чтобы это сделать. Так вот, всё это умеет делать FFmpeg, который не стоит при этом ни копейки (хотя желательно подкинуть пацанам [http://www.ffmpeg.org/donations.html немного помощи]).


А ещё некоторые довольно известные видео-редакторы являются по сути лишь графической надстройкой поверх FFmpeg, вот так-то. Но никто не говорит, что это плохо, например [http://www.winnydows.com/ XviD4PSP] - прекрасный конвертер. Просто зачем использовать тяжёлый GUI, когда всё то же самое можно делать изящно и быстро.
А ещё некоторые довольно известные видео-редакторы являются по сути лишь графической надстройкой поверх FFmpeg, вот так-то. Но никто не говорит, что это плохо, например [http://www.winnydows.com/ XviD4PSP] - прекрасный конвертер. Просто зачем использовать тяжёлый GUI, когда всё то же самое можно делать изящно и быстро.
Строка 33: Строка 33:
Для начала можно подготовить песочницу следующим образом:
Для начала можно подготовить песочницу следующим образом:
# загрузить архив с программой, распаковать её в куда-нибудь;
# загрузить архив с программой, распаковать её в куда-нибудь;
# открыть Total Commander (или любой другой... хотя, зачем другой?) и перейти в каталог <code>bin</code>;
# открыть Total Commander (или любой другой... хотя, зачем другой?) двухпанельник и перейти в каталог <code>bin</code>;
# скопировать в этот же каталог видео-файлы, которые требуется обработать. Для удобства можно дать им короткие имена, например <code>1.mp4</code>;
# скопировать в этот же каталог видео-файлы, которые требуется обработать. Для удобства можно дать им короткие имена, например <code>1.mp4</code>;
# открыть командную строку из этого каталога;
# открыть командную строку из этого каталога;
Строка 40: Строка 40:
== Набор команд ==
== Набор команд ==


В разных местах в интернетах разбросаны рецепты и команды на ту или иную операцию. Есть также и сборники таких рецептов, но мы всё равно решили написать и свой тоже.
Далее идёт некоторый список команд с примерами.


Конечно же, всё это и гораздо большее можно найти в [http://www.ffmpeg.org/documentation.html официальной документации].
Конечно же, всё это и гораздо большее можно найти в [http://www.ffmpeg.org/documentation.html официальной документации].
Строка 70: Строка 70:
</syntaxhighlight>
</syntaxhighlight>


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


=== Вырезать фрагмент видео из исходника с несколькими звуковыми дорожками ===
=== Вырезать фрагмент видео из исходника с несколькими звуковыми дорожками ===
Строка 92: Строка 92:
</syntaxhighlight>
</syntaxhighlight>


Тут есть нюанс. Если дорожка в AC3, то изломается CodecID (был раньше такой косяк, но возможно его исправили), и звук играться не будет. Однако, можно сложить всё в MKV:
Тут есть нюанс. Если дорожка в AC3, то изломается CodecID (был раньше такой косяк контейнера AVI, но возможно его исправили), и звук играться не будет. Однако, можно сложить всё в MKV:
<syntaxhighlight lang="bash">
<syntaxhighlight lang="bash">
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 -fflags genpts -i 1.avi -map 0:0 -map 0:2 -ss 01:37:34 -t 63 -vcodec copy -acodec copy cut.mkv
Строка 117: Строка 117:


Тут необходимо перекодирование, потому надо задать параметры кодировки, что и выполняет опция <code>-crf 18</code>. Ватермарка лежит в том же каталоге под именем <code>logo.png</code>. Параметр <code>16:16</code> - координаты позиционирования верхнего левого угла ватермарки.
Тут необходимо перекодирование, потому надо задать параметры кодировки, что и выполняет опция <code>-crf 18</code>. Ватермарка лежит в том же каталоге под именем <code>logo.png</code>. Параметр <code>16:16</code> - координаты позиционирования верхнего левого угла ватермарки.
=== Кодирование видео ===
В основном, с целью уменьшить размер файла. Например, видеозапись с цифровика или захваченное видео Fraps.
Я видел команды на несколько строк, где расписывались битрейты, квантификаторы, фигнификаторы и прочий хардкор, но я же в этом ничего не понимаю, хотелось бы что-то попроще. И оно такое есть, проще некуда:
<syntaxhighlight lang="bash">
ffmpeg.exe -i 1.avi -crf 18 out.mp4
</syntaxhighlight>
Параметр [https://trac.ffmpeg.org/wiki/Encode/H.264#crf CRF] является некоторым уровнем качества и принимает значения от 0 до 51, где:
* 0 - наилучшее качество;
* 51 - наихудшее качество. Если выбрать больше 51, например 54 или 9000 - будет браться всё равно 51.
В документации рекомендуется значение 18, выдающее качество "практически равное исходному файлу".


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


Допустим, у вас исходный файл с разрешением 1366x768, и вы хотите отрезать слева 200 пикселей (или что это за единица размерности). Команда будет такая:
Допустим, у вас исходный файл с разрешением 1366x768, и вы хотите отрезать слева 300 пикселей (или что это за единица размерности). Команда будет такая:
<syntaxhighlight lang="bash">
<syntaxhighlight lang="bash">
ffmpeg.exe -i 1.mp4 -filter:v "crop=1060:768:300:0" -crf 18 cut.mp4
ffmpeg.exe -i 1.mp4 -filter:v "crop=1066:768:300:0" -crf 18 cut.mp4
</syntaxhighlight>
</syntaxhighlight>
Первая пара (<code>1066:768</code>) задаёт новый размер кадра, а вторая (<code>300:0</code>) - координаты его левого верхнего угла относительно исходного.


Для этого необходимо перекодирование, потому надо задать параметры кодировки, что и выполняет опция <code>-crf 18</code>.
Для этого необходимо перекодирование, потому надо задать параметры кодировки, что и выполняет опция <code>-crf 18</code>.
Строка 129: Строка 147:
=== Захват экрана ===
=== Захват экрана ===


Можно захватывать происходящее на экране и писать в файл, как это делает [http://www.fraps.com/ Fraps].
Можно захватывать происходящее на экране и писать в файл, как это делает [http://www.fraps.com/ Fraps]. Но! Тут это можно делать уже сразу с кодированием видео.
 
Для этого предварительно потребуется установить устройство захвата (в примере используется [http://sourceforge.net/projects/screencapturer/files/ Screen Capture Recorder]).
<syntaxhighlight lang="bash">
ffmpeg.exe -f dshow -i audio="virtual-audio-capturer":video="screen-capture-recorder" -acodec pcm_s16le
-vcodec libx264 -preset ultrafast -qp 0 testing.mkv
</syntaxhighlight>
 
=== Конвертировать видео в GIF ===
 
Попутно снижаем качество картинки (<code>-pix_fmt rgb8</code>), число кадров в секунду (<code>-r 15</code>) и размер кадра (<code>-vf scale=700:-1</code>), чтобы файл получился поменьше.


Для этого предварительно потребуется установить устройство захвата (здесь используется [http://sourceforge.net/projects/screencapturer/files/ Screen Capture Recorder]), потому как FFmpeg сам такое делать всё же не умеет.
<syntaxhighlight lang="bash">
<syntaxhighlight lang="bash">
ffmpeg.exe -f dshow -i audio="virtual-audio-capturer":video="screen-capture-recorder" -acodec pcm_s16le -vcodec libx264 -preset ultrafast -qp 0 testing.mkv
ffmpeg.exe -i video.mov -pix_fmt rgb8 -r 15 -vf scale=700:-1 output.gif
</syntaxhighlight>
</syntaxhighlight>


Строка 141: Строка 168:
* [http://habrahabr.ru/post/171213/ 19 команд FFmpeg для любых нужд];
* [http://habrahabr.ru/post/171213/ 19 команд FFmpeg для любых нужд];
* [http://rus-linux.net/nlib.php?name=/MyLDP/mm/7-tricks-with-ffmpeg-ru.html Семь трюков с FFmpeg];
* [http://rus-linux.net/nlib.php?name=/MyLDP/mm/7-tricks-with-ffmpeg-ru.html Семь трюков с FFmpeg];
* [http://shurshun.ru/ffmpeg-bazovyie-komandyi/ FFmpeg - базовые команды].
* [http://shurshun.ru/ffmpeg-bazovyie-komandyi/ FFmpeg - базовые команды];
* [http://nosovdn-cisco.blogspot.ru/2014/09/ffmpeg.html Кодировка с FFmpeg].


[[Категория:Мультимедиа]]
[[Категория:Мультимедиа]]

Текущая версия от 19:38, 29 мая 2017

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

Попутно снижаем качество картинки (-pix_fmt rgb8), число кадров в секунду (-r 15) и размер кадра (-vf scale=700:-1), чтобы файл получился поменьше.

ffmpeg.exe -i video.mov -pix_fmt rgb8 -r 15 -vf scale=700:-1 output.gif

Ещё команды

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