FFmpeg – продвинутый конвертер видео и аудио файлов. У него нет графического интерфейса, управляется командами из консоли, зато функционал программы и качество итогового материала превосходят другие конвертеры.
Базовые возможности FFmpeg:
- конвертация файлов (со сжатием или без потерь качества);
- изменение разрешения;
- кадрирование;
- обрезка и склейка файлов;
- замена, добавление, извлечение аудиодорожек и субтитров;
- наложение водяного знака;
- кодирование или стриминг потокового видео.
FFmpeg выручит и там, где не справятся другие программы. Например, при конвертации видео из устаревшего DV в современный HD формат, FFmpeg преобразует чересстрочное (25i) видео в прогрессивное (50p), повысит частоту кадров, увеличит разрешение с 720×576 до 1920×1080 и при этом сохранит оригинальное качество картинки.
Несмотря на отсутствие графического интерфейса, FFmpeg прост в использовании и будет полезен как профессионалам работающих с видео, так и любителям решившим обработать домашний видеоархив.
Подробности о FFmpeg читайте на
Установка FFmpeg
FFmpeg распространяется в исходных кодах, но на официальном сайте есть ссылки на собранные бинарники для MaxOS и 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, значит программа работает.
Чтобы каждый раз не вводить длинный путь к программе C:\Program Files\ffmpeg\bin\ffmpeg.exe рекомендую добавить ее в системную переменную Path, для этого:
- перейдите в параметры Windows, в поиске введите Панель управления
- перейдите в Панель управления – Система и безопасность – Система;
- выберите пункт Дополнительные параметры системы;
- нажмите кнопку Переменные среды;
- в поле Системные переменные выберите значение Path и нажмите кнопку Изменить, чтобы добавить новое значение;
- укажите путь к папке с FFmpeg содержащую ffmpeg.exe;
- перезагрузите компьютер.
Теперь для того, чтобы вызвать FFmpeg используйте в консоли следующую команду.
ffmpeg
Как установить FFmpeg в MacOS
Самый простой способ установить FFmpeg на MacOS, это Homebrew.
brew install ffmpeg
Либо можно поставить FFmpeg вручную. Для этого,
Перейдите в папку с загрузками, распакуйте скачанный архив, а затем переместите исполняемый файл 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, 1920×1080), так и буквенные обозначения (например, qcif, qvga);
Обозначение размеров:
sqcif – 128 × 96
qqvga – 60 × 120
uxvga – 1600 × 1200
qcif – 176 × 144
qvga – 320 × 240
qxga – 2048 × 1536
cif – 352 × 288
vga – 640 × 480
sxga – 1280 × 1024
4cif – 704 × 576
svga – 800 × 600
qsxga – 2560 × 2048
16cif – 1408 × 1152
xvga – 1024 × 768
hsxga – 5120 × 4096
- -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.
Пример конвертации h.264 в h.265 без изменения аудиодорожки.
ffmpeg -i input.mp4 -c:v libx265 -vtag hvc1 -c:a copy output.mp4
Пример использования 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
Подробнее с настройками кодеков
Аппаратное ускорение
Владельцы видеокарт NVIDIA могут повысить скорость кодирования в H.264 за счет ресурсов GPU. Для этого попробуйте использовать кодек h264_nvenc.
ffmpeg -i input.mp4 -c:v h264_nvenc -c:a copy output.mp4
Сборка FFMpeg должна поддерживать кодек h264_nvenc и быть совместима с драйвером видеокарты.
Двухпроходное кодирование
При двухпроходном кодировании, на первом проходе кодек анализирует видео и пишет 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
Изменение разрешения и кадрирование
Чтобы изменить разрешение конечного видео можно воспользоваться опцией -s.
ffmpeg -i input.mp4 -s 1280x720 output.mp4
Однако использование фильтра scale даст более качественный результат.
ffmpeg -i input.mp4 -vf scale=1280:720 output.mp4
Преобразовать 4K в 1080:
ffmpeg -i input4kvid.mp4 -vf scale=1920:1080 -c:a copy output1080vid.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 есть фильтр
ffmpeg -i input.mp4 -vf yadif output.mp4
По умолчанию, фильтр преобразует чересстрочное видео в прогрессивное, создавая полные кадры из соседних полукадров. Дает хороший результат, однако при таком преобразовании частота кадров снижается вдвое. Это заметно при воспроизведении видео, поэтому я предпочитаю способ, описанный ниже.
Преобразование 25i в 50p
Чтобы не терять кадры при деинтерлейсинге и чересстрочное видео осталось таким же плавным как в оригинале, рекомендуется способ, при котором частота кадров удваивается, а недостающие строки в каждом поле восстанавливаются при помощи интерполяции. Видео 25i фактически будет преобразовано в 50p (30i в 60p соответственно).
Для преобразования используется уже знакомый фильтр
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 — дорожка с русскими субтитрами.
Конвертация аудиодорожек
Если аудиодорожка одна, изменить ее формат (битрейт/качество аудио по желанию), без перекодирования видео можно следующей командой:
ffmpeg -i input.mkv -c:v copy -c:a ac3 -b:a 320k output.mkv
Если аудиодорожек несколько, хочется оставить их без изменений, но сконвертировать только одну. Пример команды ниже, сконвертирует только третью аудиодорожку, первые две и видео останутся оригинальными.
ffmpeg -i input.mkv -map 0:0 -map 0:1 -map 0:2 -map 0:3 -c:v:0 copy -c:a:0 copy -c:a:1 copy -c:a:2 ac3 -b:a 320k output.mkv
Пояснение: в примере -map 0:0 это видеодорожка, к ней будет применена опция -c:v:0 copy, что означает, что видео не будет перекодироваться. -map 0:1 -map 0:2 -map 0:3 это 3 аудиодорожки. К первым двум будут применены -c:a:0 copy -c:a:1 copy, что означает, что дорожки останутся в оригинальном формате. А к 3 дорожке будет применена опция -c:a:2 ac3 -b:a 320k, что означает, что она будет сконвертирована в формат AC3 с битрейтом 320k.
Если какие-то дорожки не нужны, просто не указывайте к ним обращение. Например, чтобы убрать аужиодорожки с 4 по 6 из 7 доступных, воспользуйтесь примером ниже.
ffmpeg -i input.mkv -map 0:0 -map 0:1 -map 0:2 -map 0:3 -map 0:7 -c:v:0 copy -c:a:0 ac3 -c:a:1 ac3 -b:a 320k -c:a:2 ac3 -b:a 320k -c:a:3 ac3 -b:a 320k -c:a:7 ac3 -b:a 320k output.mkv
Добавление, извлечение и удаление и аудио
Чтобы добавить звуковую дорожку в видеофайл используйте опцию -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
Конвертация аудиофайлов
Аудио файлы можно конвертировать независимо от видео.
ffmpeg -i input.wav -ar 44100 -ac 2 -ab 192K -f mp3 output.mp3
Изменение скорости воспроизведения
Скорость воспроизведения видео и аудио изменяется раздельно.
Чтобы увеличить или уменьшить скорость видео, используется видеофильтр «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
Полезные ссылки
На этом всё. Но вы можете поддержать проект. Даже небольшая сумма поможет нам писать больше полезных статей.
Если статья помогла или понравилась, пожалуйста поделитесь ей в соцсетях.