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

Материал из Кафедра ИУ5 МГТУ им. Н.Э.Баумана, студенческое сообщество
Перейти к навигации Перейти к поиску
 
(не показано 9 промежуточных версий 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] - это программа (набор медиа-библиотек с исполняемым файлом), дающая неограниченную власть над видео и позволяющая сэкономить кучу времени.


== Описание ==
== Описание ==
Строка 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>.


=== Вырезать фрагмент видео из исходника с несколькими звуковыми дорожками ===
=== Вырезать фрагмент видео из исходника с несколькими звуковыми дорожками ===
Строка 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=1066:768:300:0" -crf 18 cut.mp4
ffmpeg.exe -i 1.mp4 -filter:v "crop=1066:768:300:0" -crf 18 cut.mp4
Строка 137: Строка 153:
ffmpeg.exe -f dshow -i audio="virtual-audio-capturer":video="screen-capture-recorder" -acodec pcm_s16le  
ffmpeg.exe -f dshow -i audio="virtual-audio-capturer":video="screen-capture-recorder" -acodec pcm_s16le  
-vcodec libx264 -preset ultrafast -qp 0 testing.mkv
-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>), чтобы файл получился поменьше.
<syntaxhighlight lang="bash">
ffmpeg.exe -i video.mov -pix_fmt rgb8 -r 15 -vf scale=700:-1 output.gif
</syntaxhighlight>
</syntaxhighlight>


Строка 144: Строка 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

Ещё команды

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