Конвертируем видео с FFmpeg

FFmpeg – продвинутый конвертер видео и аудио файлов. У него нет графического интерфейса, управляется командами из консоли, зато функционал программы и качество итогового материала превосходят другие конвертеры.

Базовые возможности FFmpeg:

  • конвертация файлов (со сжатием или без потерь качества);
  • изменение разрешения;
  • кадрирование;
  • обрезка и склейка файлов;
  • замена, добавление, извлечение аудиодорожек и субтитров;
  • наложение водяного знака;
  • кодирование или стриминг потокового видео.

FFmpeg выручит и там, где не справятся другие программы. Например, при конвертации видео из устаревшего DV в современный HD формат, FFmpeg преобразует чересстрочное (25i) видео в прогрессивное (50p), повысит частоту кадров, увеличит разрешение с 720×576 до 1920×1080 и при этом сохранит оригинальное качество картинки.

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

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

Установка FFmpeg

FFmpeg распространяется в исходных кодах, но на официальном сайте есть ссылки на собранные бинарники для MaxOS и Windows.

Как установить FFmpeg в Windows

Скачайте сборку FFmpeg для Windows.

Разархивируйте содержимое скачанного архива, например в Program Files/ffmpeg (или в другую папку, например, где у вас хранятся портативные программы).

В PowerShell выполните следующую команду.

c:\"program files"\ffmpeg\bin\ffmpeg.exe -version

Для cmd немного модифицированная команда.

"C:\Program Files\ffmpeg\bin\ffmpeg.exe" -version

Если в консоли появилось сообщение о версии FFmpeg, значит программа работает.

FFmpeg в PowerShell

Чтобы каждый раз не вводить длинный путь к программе C:\Program Files\ffmpeg\bin\ffmpeg.exe рекомендую добавить ее в системную переменную Path, для этого:

  • перейдите в параметры Windows, в поиске введите Панель управления
  • перейдите в Панель управления – Система и безопасность – Система;
  • выберите пункт Дополнительные параметры системы;
  • нажмите кнопку Переменные среды;
  • в поле Системные переменные выберите значение Path и нажмите кнопку Изменить, чтобы добавить новое значение;
  • укажите путь к папке с FFmpeg содержащую ffmpeg.exe;
  • перезагрузите компьютер.
Переменная Path

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

ffmpeg

Как установить FFmpeg в MacOS

Самый простой способ установить FFmpeg на MacOS, это Homebrew.

brew install ffmpeg

Либо можно поставить FFmpeg вручную. Для этого, скачайте сборку FFmpeg для MacOS.

Перейдите в папку с загрузками, распакуйте скачанный архив, а затем переместите исполняемый файл ffmpeg в папку /usr/local/bin

sudo cp /путь/до/ffmpeg /usr/local/bin

Далее введите пароль и FFmpeg будет скопирован в директорию к остальным бинарникам.

Попробуйте выполнить следующую команду.

ffmpeg -version

Если в консоли появилось сообщение о версии FFmpeg, значит программа работает.

Как установить FFmpeg в Linux

Для Linux можно самостоятельно собрать FFmpeg из исходников, либо установить его, используя менеджер пакетов входящий в состав операционной системы.

Например, для Ubuntu это можно сделать через репозиторий mc3man ppa, поддерживаемый сообществом Ubuntu.

sudo apt-get install -y software-properties-common
add apt-repository ppa:mc3man/trusty-media
apt-get update
apt-get dist-upgrade
apt-get install ffmpeg

В Debian 9 FFmpeg доступен в официальном репозитории, поэтому для установки достаточно одной команды.

apt install ffmpeg

CentOS не предоставляет официальный репозиторий для FFmpeg, поэтому, как и в случае с Ubuntu, его можно установить с помощью стороннего репозитория.

yum install epel-release -y
yum update -y

В CentOS 7 и RHEL 7 используйте следующую команду:

rpm --import http://li.nux.ro/download/nux/RPM-GPG-KEY-nux.ro
rpm -Uvh http://li.nux.ro/download/nux/dextop/el7/x86_64/nux-dextop-release-0-5.el7.nux.noarch.rpm

В CentOS/RHEL 6/5 команда отличается.

rpm --import http://li.nux.ro/download/nux/RPM-GPG-KEY-nux.ro
rpm -Uvh http://li.nux.ro/download/nux/dextop/el6/x86_64/nux-dextop-release-0-2.el6.nux.noarch.rpm

Далее установите FFmpeg.

yum install ffmpeg ffmpeg-devel -y

После установки попробуйте выполнить следующую команду.

ffmpeg -version

Если в консоли появилось сообщение о версии FFmpeg, значит программа работает.

FFmpeg: быстрый старт

После установки FFmpeg можно творить магию преобразования видео в консоли.

ffmpeg -i input.avi output.mp4

Указанная команда сконвертирует видео из файла input.avi в output.mp4. По умолчанию для файлов mov и mp4 используется кодек H.264. Размер кадра и fps будут взяты из исходного файла.

В примере выше параметры по умолчанию могут не обеспечить желаемые качество или результат. Поэтому параметры можно задавать явно. Однако не обязательно указывать все, в этом случае FFmpeg возьмет их из исходного файла (например частоту кадров) или значение используемое по умолчанию.

Ниже перечислены основные параметры FFmpeg:

  • -i имя исходного файла, который предстоит сконвертировать, если файлов несколько перед каждым из них нужно указать -i;
  • -y ответит Да (yes) на все вопросы от FFmpeg, если они возникнут в процессе кодирования, например при для перезаписи файла, если тот уже существует;
  • -vcodec или кратко c:v – параметры видеокодека, либо copy (если перекодирование не требуется), либо пустой параметр (по умолчанию);
  • -f – формат контейнера;
  • -b:v (-vb, -b) – битрейт видео в килобитах или мегабитах в секунду задаётся буквой K или M;
  • -aspect – соотношение сторон картинки (4:3, 16:9, 1.3333, 1.7777);
  • -r – частота кадров;
  • -s — разрешение, поддерживаются как числовые значения (640×480) и буквенные обозначения (например, qcif, qvga);
  • -vf (или -filter:v) — опция со списком фильтров, которые будут применены к видео;
  • -c:a (или -acodec) – параметры аудиокодека, либо copy (если аудио дорожку нужно оставить как есть), либо пустой параметр (по умолчанию);
  • -f – формат аудио;
  • -af (или -filter:a) — опция со списком фильтров, которые будут применены к аудио;
  • -ab (или -b:a) – битрейт аудио;
  • -ar – частота дискредитации;
  • -ac – количество каналов.

Для примера рассмотрим следующую команду.

ffmpeg -y -i input.avi -c:v libx264 -preset medium -b:v 17000K -aspect 16:9 -r 25 -c:a aac -b:a 256K output.mp4

Данная команда перекодирует файл input.avi в output.mp4. В случае если в конечной папке будет содержаться файл output.mp4, он будет перезаписан (опция -y). В качестве кодека будет использован libx264 со среднем соотношением скорость/качество (-preset medium). Конечный битрейт 17000kbps, соотношение сторон картинки 16:9, частота 25 кадров в секунду. В качестве аудиокодека будет использован AAC с битрейтом 256kbps.

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

ffmpeg -i input.mkv -vcodec copy -acodec copy output.mov

или аналогичная (сокращенная запись)

ffmpeg -i input.mkv -c copy output.mov

Это может оказаться полезным, когда устройство, на котором вы хотите воспроизвести видео, не поддерживает исходный формат. Или, например программа видеомонтажа не умеет работать с каким либо форматом и не хочет импортировать его в проект (например Adobe Premiere не работает с mkv, хотя внутри – все тот же H.264). С помощью перепаковки проблема решиться.

С полным списком команд FFmpeg можно ознакомиться на странице официальной документации, а ниже разберем полезные примеры их использования.

Полезные команды FFmpeg

Чтобы получить информацию о видеофайле, передайте FFmpeg название файла без дополнительных опций.

ffmpeg -i video.mp4

Каждый раз при запуске ffmpeg, программа показывает информацию о себе. С помощью опции -hide_banner лишнюю информацию можно скрыть.

ffmpeg -i video.mp4 -hide_banner

Чтобы получить информацию о ключах и параметрах FFmpeg.

ffmpeg -help

Исходные и конечные файлы могут быть любого формата, FFmpeg работает почти со всеми из существующих. Список поддерживаемых форматов можно получить следующей командой.

ffmpeg -formats

Список поддерживаемых кодеков.

ffmpeg -codecs

Обрезка видео

ffmpeg -i input.mp4 -ss 00:00:05 -t 00:05:15 -c copy output.mp4

Выше уже был пример с перепаковкой файла, когда исходный поток остается не тронутым. Добавив пару опций, можно без пересжатия и потери качества обрезать или нарезать видео на фрагменты. Опция -ss задаёт начало обрезки, а опция -t продолжительность фрагмента. Время задаётся в формате «часы:минуты:секунды».

Склейка видео

ffmpeg -i "concat:file1.avi|file2.avi" -vcodec copy -acodec copy output.avi

Для склейки используется оператор concat. После двоеточия ему передаются входные файлы, разделённые вертикальной чертой. Соединяемые файлы обязательно должны быть одного формата (видео и аудио), их параметры должны совпадать. Если это не так, то предварительно нужно произвести перекодирование файлов к единому формату.

Файлы mp4 нельзя объединить напрямую с помощью concat, но можно предварительно преобразовать, например, MPEG-TS без перекодирования видео и звука.

ffmpeg -i video1.mp4 -acodec copy -vcodec copy -vbsf h264_mp4toannexb -f mpegts video1.ts
ffmpeg -i video2.mp4 -acodec copy -vcodec copy -vbsf h264_mp4toannexb -f mpegts video2.ts

А уже затем объединить в итоговый файл mp4.

ffmpeg -i "concat:video1.ts|video2.ts" -vcodec copy -acodec copy out.mp4

Важно учесть, что, если в одном из фрагментов звуковая дорожка короче по времени чем видеопоток, то звуковые дорожки остальных фрагментов сдвинутся и произойдёт рассинхронизация звука.

Когда входных файлов много, возможно окажется удобным не писать их все в консоль, а создать текстовый файл, как в примере ниже, который затем передать в FFmpeg.

file /home/sk/myvideos/part1.mp4
file /home/sk/myvideos/part2.mp4
file /home/sk/myvideos/part3.mp4
file /home/sk/myvideos/part4.mp4

Команда для объединения будет выглядеть следующим образом.

ffmpeg -f concat -i join.txt -c copy output.mp4

Если получите ошибку.

[concat @ 0x555fed174cc0] Unsafe file name '/path/to/mp4'
join.txt: Operation not permitted

Попробуйте добавить опцию -safe 0.

ffmpeg -f concat -safe 0 -i join.txt -c copy output.mp4

Конвертация видео

При конвертации видео контейнер выходного файла определяется его расширением (avi, mkv, mp4, mov и тд). По умолчанию кодек для кодирования, определяется автоматически, в зависимости от выбранного контейнера (например H.264 для mp4 и mkv, MPEG-2 для mpg). Однако вы можете изменить его, исходя из своих требований или стандартов.

Для видео популярные и широко поддерживаемые видеокодеки H.264, H.265, VP9, а самые известные аудио кодеки — это AAC и MP3.

Кодек и его параметры задаются опциями -c:v для видео, и -c:a для аудио. Для некоторых форматов (MPEG и DV) вместо указанных, используется опция -target.

Пример использования libx265 для видео и aac для аудио.

ffmpeg -i input.avi -c:v libx265 -c:a aac -b:v 15000k -b:a 320k output.mp4 

Пример использования libx264 для видео и aac для аудио.

ffmpeg -i input.avi -c:v libx264 -c:a aac -b:v 15000k -b:a 320k output.mp4

Пример использования vp9 для видео и mp3 для аудио.

ffmpeg -i input.avi -c:v vp9 -c:a libmp3lame -b:v 7000k -b:a 256k output.mp4

Вслед за кодеком указывается битрейт для видео и аудио потоков (опции -b:v и -b:a). Чем выше битрейт, тем выше качество, однако и больше размер файла.

Вместо битрейта можно указать опцию -crf (кофициент качества).

ffmpeg -i input.avi -c:v libx264 -preset medium -c:a aac -crf 15 output.mp4

Изменяется в пределах от 0 до 51. Чем ниже значение -crf, тем выше качество будет у выходного файла, однако, как и в случае с высоким битрейтом, увеличится его размер. При значениях 14-17 результат визуально почти неотличим от оригинала. Значение -crf равное 0, будет означать кодирование без потери качества.

У каждого кодека могут быть свои специфические параметры. Например, у H.264 и H.265 часто используется опция -preset влияющая на соотношение скорость кодирования/качество. Значения -preset могут быть: ultrafast, superfast, veryfast, faster, fast, medium (по умолчанию), slow, slower, veryslow. Для чернового варианта можно использовать «быстрые настройки» из категории fast, а для продакшена рекомендуется не ниже slow.

Для VP9 кодирование без потери качества задается опцией -lossless 1.

ffmpeg -i input.mp4 -c:v vp9 -lossless 1 output.webm

Подробнее с настройками кодеков H.264, H.265 и VP9 и можно ознакомится в документации.

Двухпроходное кодирование

При двухпроходном кодировании, на первом проходе кодек анализирует видео и пишет log-файл, а на втором сжимает видеозапись, используя полученную на первом проходе информацию. На простые (статические) сцены выделяется минимальное количество битрейта, а на сложные (динамические) — максимальное. Такой подход дает оптимальное распределение битрейта и соответственно лучшее качество картинки в сравнении с однопроходным кодированием.

Чтобы выполнить первый проход используйте следующую команду (с опцией -pass 1).

ffmpeg -y -i input.avi -c:v libx264 -b:v 17000K -pass 1 -f mp4 /dev/null

На первом проходе файл не создается, поэтому вместо него указанно /dev/null (или NULL если работаете в Windows).

На втором проходе (-pass 2), пример команды будет иметь следующий вид.

 ffmpeg -y -i input.avi -c:v libx264 -b:v 17000K -pass 2 -f mp4 -c:a aac -b:a 256K output.mp4

Двухпроходное кодирование удобно выполнять, используя скрипт. Примеры скриптов приведены в конце заметки, в разделе Пакетная обработка FFmpeg.

Конвертация для MPEG-совместимых устройств

Для устройств, работающих с форматом MPEG, параметры выходного файла рекомендуется задавать опцией -target. Значения могут быть следующими: vcd, svcd, pal-vcd, ntsc-svcd и должны иметь префикс pal-, ntsc- или film-. В этом случае битрейт, кодек и размер кадра будут подобраны автоматически в соответствии с указанным стандартом. При необходимости можно указать соотношение сторон экрана (опция -aspect), как правило 16:9 или 4:3.

Пример для DVD плееров.

ffmpeg -i input.avi -target pal-dvd -ps 2000000000 -aspect 16:9 output.mpeg

Опция -ps 2000000000 задает здесь максимальный размер конечного файла.

Пример для VCD (pal и ntsc).

ffmpeg -i input.avi -target pal-vcd output.mpg
ffmpeg -i input.avi -target ntsc-vcd output.mpg

Пример для SVCD (pal и ntsc).

ffmpeg -i input.avi -target pal-svcd output.mpg
ffmpeg -i input.avi -target ntsc-svcd output.mpg

Конвертация AVI в DV

Как и в случае с форматом MPEG, параметры для DV файла рекомендуется задавать опцией -target. Значения могут быть следующими: dv, dv50 и должны иметь префикс pal-, ntsc- или film-. В этом случае битрейт, кодек и размер кадра будут подобраны автоматически в соответствии со стандартом.

ffmpeg -i input.avi -target pal-dv output.dv

Однако параметры можно указать и явно.

ffmpeg -i input.avi -s pal -r pal -aspect 4:3 -ar 48000 -ac 2 output.dv

Конвертация в MJPEG

Если при монтаже привыкли использовать формат MJPEG, то следующая команда преобразует в него исходное видео. Опция -qscale 1 означает, что видео будет закодировано с максимальным качеством.

ffmpeg -i input.mp4 -vcodec mjpeg -qscale 1 -an output.avi

Конвертация AVI в DivX

Пример для некогда популярного формата DivX (mpeg4v2). Может пригодиться владельцам старых устройств.

ffmpeg -i input.avi -s 320x240 -vcodec msmpeg4v2 output.avi

Конвертация видео в формат PSP

ffmpeg -i input.avi -b 300 -s 320x240 -vcodec xvid -ab 32 -ar 24000 -acodec aac output.mp4

Конвертация аудио

Аудио файлы можно конвертировать независимо от видео.

ffmpeg -i input.wav -ar 44100 -ac 2 -ab 192K -f mp3 output.mp3

Изменение разрешения и кадрирование

Чтобы изменить разрешение конечного видео можно воспользоваться опцией -s.

ffmpeg -i input.mp4 -s 1280x720 output.mp4

Однако использование фильтра scale даст более качественный результат.

ffmpeg -i input.mp4 -vf scale=1280:720 output.mp4

Для кадрирования изображения предназначен фильтр crop. Его параметры имеют следующий вид crop=w:h:x:y, где w — ширина прямоугольника, который нужно вырезать из исходного видео, h — высота прямоугольника, x и y — x координаты точки начала обрезки.

$ ffmpeg -i input.mp4 -filter:v "crop=640:480:200:150" output.mp4

Команда выше вырежет из кадра прямоугольник шириной 640 и высотой 480 пикселей, начиная с позиции (200,150).

Но мне привычна, другая запись.

ffmpeg -i input.mp4 -vf crop=in_w-2*2:in_h-2*4 output.mp4

В данном примере видео будет обрезано на 4 пикселя сверху и снизу, а так же на 2 пикселя слева и справа.

Фильтры можно комбинировать.

ffmpeg -i input.mp4 -vf crop=in_w-2*2:in_h-2*4,scale=1280:720 output.mp4

Соотношение сторон

Соотношение сторон устанавливаются опцией -aspect.

ffmpeg -i input.mp4 -aspect 16:9 output.mp4

Еще пример.

ffmpeg -i input.mp4 -aspect 16:9 -vf scale=1280:720 output.mp4

Самые популярные соотношения сторон:

  • 16:9
  • 4:3
  • 16:10
  • 5:4
  • 2:21:1
  • 2:35:1
  • 2:39:1

Деинтерлейсинг

Для деинтерлейсинга в FFmpeg есть фильтр yadif (yet another deinterlacing filter).

ffmpeg -i input.mp4 -vf yadif output.mp4

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

Преобразование 25i в 50p

Чтобы не терять кадры при деинтерлейсинге и чересстрочное видео осталось таким же плавным как в оригинале, рекомендуется способ, при котором частота кадров удваивается, а недостающие строки в каждом поле восстанавливаются при помощи интерполяции. Видео 25i фактически будет преобразовано в 50p (30i в 60p соответственно).

Для преобразования используется уже знакомый фильтр yadif.

ffmpeg -i input.avi -vf yadif=1:-1:0 -r 50 output.mp4

Параметры 1:-1:0 переданные yadif выполнят деинтерлейсинг по методу описанному выше.

Полностью команда для преобразования чересстрочного широкоэкранного DV видео 25i в прогрессивное HD 50p будет выглядеть следующим образом.

ffmpeg -i input.dv -c:v libx264 -preset slow -b:v 20000K -aspect 16:9 -vf yadif=1:-1:0,crop=in_w-2*0:in_h-2*4,scale=1920:1080 -r 50 -c:a aac -b:a 256K output.mp4

Небольшое пояснение: crop я здесь использую, потому что во многих моих исходниках на DV видео есть артефакт в виде полоски внизу, от которой я избавляюсь, обрезая видео на 4 пикселя снизу и сверху.

Потоки

Для обращения к потокам (видео, аудио, субтитрам) используется опция -map.

Количество и идентификаторы потоков можно увидеть, запросив информацию о файле.

ffmpeg -i video.mp4

Среди прочей информации о файле будет выдано примерно следующее:

Stream #0:0(und): Video …
Stream #0:1(ger): Audio …
Stream #0:2(eng): Audio …
Stream #0:3(rus): Subtitle …

Потоки обозначаются двойным номером, через двоеточие — 0:0, 0:1, 1:0, 2:1 и т.д. Цифра до двоеточия — номер по порядку каждого выходного файла, нумерация ведется с нуля. А номер после двоеточия обозначает номер потока внутри файла.

В примере выше, 0 перед двоеточием означает, что это первый по порядку файл — video.mp4. А номера после двоеточия означают номера внутренних потоков этого файла. 0:0 — видео дорожка, 0:1 — первая аудиодорожка на немецком языке, 0:2 — вторая аудиодорожка на английском языке, 0:3 — дорожка с русскими субтитрами.

Добавление, извлечение и удаление и аудио

Чтобы добавить звуковую дорожку в видеофайл используйте опцию -i, в которой укажите путь к аудиофайлу.

ffmpeg -i noaudio.mpg -i audio.acc -vcodec copy -acodec copy output.mpg

Удалить из видеофайла звуковую дорожку можно с помощью опции -an (audio not).

ffmpeg -i input.mpg -vcodec copy -an noaudio.mpg

Сохранить аудиодорожку из видеофайла.

ffmpeg -i input.mpg audio.wav

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

ffmpeg -i input.avi -vn -ar 44100 -ac 2 -ab 192K -f mp3 audio.mp3

Опция -ar указывает частоту дискретизации, -ac — количество каналов, -ab — битрейт.

Опция -vn означает, что видео информация будет отброшена, а опция -f указывает формат полученного файла (в примере — это mp3). В новых версиях FFmpeg эти две опции можно не указывать, FFmpeg разберется сам.

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

ffmpeg -i input.avi -map 0:2 audio.wav

В примере ниже показано, как добавить несколько звуковых дорожек в видеофайл (мультиплексация).

ffmpeg -i video.avi -i audio1.mp3 -i audio2.mp3 -map 0:0 -map 0:1 -map 0:2 output.mkv

Так как в примере выше только один выходной файл, 0 перед двоеточием можно опустить.

ffmpeg -i video.avi -i audio1.mp3 -i audio2.mp3 -map 0 -map 1 -map 2 output.mkv

Изменение громкости

Для изменения громкости в FFmpeg существует аудиофильтр volume.

Следующая команда в половину уменьшит громкость.

$ ffmpeg -i input.mp3 -af 'volume=0.5' output.mp3

Аналогично, громкость можно увеличить (в примере ниже в полтора раза).

$ ffmpeg -i input.mp4 -c:v copy -af 'volume=1.5' output.mp4

Изменение скорости воспроизведения

Скорость воспроизведения видео и аудио изменяется раздельно.

Чтобы увеличить или уменьшить скорость видео, используется видеофильтр «setpts».

ffmpeg -i input.mp4 -vf "setpts=0.5*PTS" output.mp4

Команда выше удвоит скорость видео.

Не очевидно, но чтобы замедлить видео, нужно использовать множитель больше 1. Команда ниже замедлит исходное видео в 4 раза.

ffmpeg -i input.mp4 -vf "setpts=4.0*PTS" output.mp4

Чтобы увеличить или уменьшить скорость аудио, используется аудиофильтр «atempo». Следующая команда удвоит скорость звука.

ffmpeg -i input.mp4 -af "atempo=2.0" -vn output.mp4

Допустимы значения от 0.5 до 2.0.

Чтобы одновременно удвоить скорость воспроизведения для видео и аудио придется скомбинировать оба фильтра.

ffmpeg -i input.mp4 -vf "setpts=0.5*PTS" -af "atempo=2.0" output.mp4

Добавление субтитров

Ниже приведен пример добавления субтитров для файла формата MKV.

ffmpeg -i input.mp4 -i subtitles.srt -c copy -c:s copy output.mkv

В примере, к исходному видеофайлу video.mp4 будут добавлены субтитры из файла subtitles.srt. Опция -c copy означает, что видео и аудио потоки из video.mp4 будут скопированы как есть (без пересжатия), опция -c:s copy, означает, что титры будут вставлены без изменений.

Если нужно вставить несколько дорожек субтитров команда может выглядеть так.

ffmpeg -i input.mp4 -i ru_subtitles.srt -i en_subtitles.srt -map 0:0 -map 1:0 -map 2:0 -c:v copy -c:a copy -c:s copy output.mkv

Формат MKV, может использовать субтитры форматов srt, subrip, ssa или ass, за исключением mov_text.

ffmpeg -i input.mp4 -i subtitles.ass -map 0:0 -map 0:1 -map 1:0 -c:v copy -c:a copy -c:s copy output.mkv

В свою очередь MP4 поддерживает только один формат субтитров — mov_text. Прочие форматы можно использовать в качестве исходных, но обязательно укажите кодек для субтитров, чтобы на выходе сконвертировать их в mov_text (-c:s mov_text).

ffmpeg -i input.mp4 -i subtitles.srt -c copy -c:s mov_text output.mp4

Пример для нескольких потоков субтитров.

ffmpeg -i input.mp4 -i ru_subtitles.srt -i en_subtitles.srt -map 0:0 -map 1:0 -map 2:0 -c copy -c:s mov_text output.mp4

FFmpeg умеет конвертировать субтитры из одного формата в другой.

ffmpeg -i subtitles.srt subtitles.ass

Чтобы извлечь субтитры из видеофайла можно использовать следующую команду.

ffmpeg -i input.avi -txt_format text output.srt

А если необходимо удалить субтитры используйте опцию -sn.

ffmpeg -i input.mkv -c copy -sn output.mkv

Разбить видео на кадры

Следующая команда разобьет видео на кадры с именами image1.jpg, image2.jpg, image3.jpg и т.д.

ffmpeg -i video.mp4 image%d.jpg

В некоторых случаях, рекомендуют явно указывать выходной формат, опция -f image2 для изображений. В качестве конечного формата можно использовать jpg, jpeg, png и другие.

ffmpeg -i video.mp4 -f image2 image%d.jpg

После выполнения в конечной папке окажется огромное количество файлов изображений. Чтобы уменьшить их можно, понизить частоту кадров (опция -r).

ffmpeg -i video.mp4 -r 1 image%d.png

Собрать видео из изображений

Операция обратная предыдущей. В некоторых случаях, рекомендуют явно указывать входной формат (опция -f image2 для изображений).

ffmpeg -r 12 -f image2 -i image%d.jpg output.mpg

Создание превью

Следующая команда создаст графический файл в формате JPEG, взяв один кадр на 30 секунде.

ffmpeg -i video.mp4 -an -ss 30 -vframes 1 -s 340x180 -y -f mjpeg screenshot.jpg

А ниже приведен пример создания анимированного превью в формате GIF.

ffmpeg -i input.avi -an -pix_fmt rgb24 -ss 30 -vframes 64 -s 340x180 -loop_output 0 -f gif screenshot.gif

Опция -loop_output задает количество повторов, по умолчанию равен 1. Если указать 0, то анимация будет бесконечной.

Конвертировать FLV в видео (и наоборот)

Чтобы конвертировать флеш-ролик в видео, воспользуйтесь следующей командой.

ffmpeg -i video.flv video.mpg

Конвертацию можно выполнить и в обратную сторону.

ffmpeg -i video.mpg video.flv

Параметры можно указать явно.

ffmpeg -i video.mpg -ab 26k -f flv video.flv

Или более конкретно.

ffmpeg -i video.mpg -ab 56 -ar 44100 -b 200 -r 15 -s 320x240 -f flv video.flv

Преобразовать видео в GIF

Чтобы сконвертировать видео в гифку (без сжатия).

ffmpeg -i input.avi output.gif

Флеш-ролики тоже можно конвертировать.

ffmpeg -i input.flv output.gif

Оптимизация для WEB

Для потоковой передачи видео, может оказаться полезным перенести moov-атомы в начало файла. Это позволит при передачи по сети декодировать видео частями, и начать показ ролика, не заставляя пользователя ждать, пока он скачается целиком.

ffmpeg -i input.avi -c:v libx264 -c:a aac -movflags +faststart output.mp4

Пакетная обработка FFmpeg

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

Написание скриптов, тема для отдельной статьи, здесь же приведу примеры для Windows и MacOS, с помощью которых за раз можно сконвертировать всю папку с файлами.

Примеры скриптов FFmpeg для Windows

Создайте текстовый файл, с расширением .bat, поместите в него содержимое указанное ниже и скорректируйте по своему усмотрению.

Чтобы воспользоваться скриптом, потребуется указать путь до папки с файлами, которые хотите сконвертировать, расширение исходных файлов, выходной формат и расширение (контейнер) выходных файлов.

@Echo off
Pushd "C:\folder\"
for %%f in (*.avi) do (
  ffmpeg -y -i "%%~f" -c:v libx264 -b:v 17000K -pass 1 -f mp4 NULL
  ffmpeg -y -i "%%~f" -c:v libx264 -b:v 17000K -pass 2 -f mp4 -c:a aac -b:a 256K "%%~nf.mp4"
)
PopD
Pause

Скрипт из примера возьмет все файлы из папки ( C:\folder\ ) с расширением .avi и сконвертирует их (используя двухпроходное кодирование) в формат mp4, расширение выходных файлов так же будет mp4. Выходные файлы будут помещены в ту же папку, что и исходные.

Ниже приведен аналогичный пример для конвертации аудио. Cкрипт конвертирует файлы с расширением .wav в .mp3.

@Echo off
Pushd "C:\folder\"
for %%f in (*.wav) do (
	ffmpeg -y -i "%%~f" -ar 44100 -ac 2 -ab 320K -f mp3 "%%~nf.mp3"
)
PopD
Pause

Примеры скриптов FFmpeg для MacOS

Создайте текстовый файл, с расширением .sh, поместите в него содержимое указанное ниже и скорректируйте по своему усмотрению.

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

#!/bin/bash

input=avi
output=mp4
format=mp4
cd ~/Desktop/folder/

for i in *."$input";
do
   ffmpeg -y -i "$i" -c:v libx264 -b:v 17000K -pass 1 -f $format /dev/null;
   ffmpeg -y -i "$i" -c:v libx264 -b:v 17000K -pass 2 -f $format -c:a aac -b:a 256K "${i%.*}.$output";
done

Не забудьте сделать скрипт исполняемым.

chmod 755 YourScript.sh

Скрипт из примера возьмет все файлы из папки ( ~/Desktop/folder/ ) с расширением .avi и сконвертирует их (используя двухпроходное кодирование) в формат mp4, расширение выходных файлов так же будет mp4. Выходные файлы будут помещены в ту же папку, что и исходные.

Ниже приведен аналогичный пример для конвертации аудио. Cкрипт конвертирует файлы с расширением .wav в .mp3.

#!/bin/bash

input=wav
output=mp3
format=mp3
cd ~/Desktop/folder/

for i in *."$input";
do
   ffmpeg -y -i "$i" -ar 44100 -ac 2 -ab 320K -f $format "${i%.*}.$output";
done

Полезные ссылки

Официальный сайт FFmpeg
Документация FFmpeg
Документация по командам FFmpeg
Документация по фильтрам

На этом всё. Но вы можете помочь проекту. Обещаю писать больше полезных статей.

А если статья помогла или понравилась, пожалуйста поделитесь ей в соцсетях.