Как сделать … в ffmpeg
Чем хорош ffmpeg? С ним удобно решать однотипные задачи по обработке звука и видео, когда файлов много, а действия повторяются часто. Составляем нужную команду один раз, отлаживаем, проверяем, полируем. Потом сохраняем в какой‐нибудь bat‐файл или во что‐то более современное и вызываем по необходимости.
Даже YouTube использует ffmpeg. Разве это не аргумент?
Если у вас Windows, скачайте ffmpeg здесь, извлеките из архива ffmpeg.exe, понадобится только он. Проще всего кинуть его в c:\windows, где система его найдёт. Но можно заморочиться, разместить как положено где‐нибудь в Program Files и прописать путь к нему в переменной PATH. А теперь команды:
-
Перепаковать видео в другой контейнер (avi, mp4, mkv) без изменений и без потери качества.
ffmpeg -i "Запись.AVI" -c:a copy -c:v copy "Запись.mp4"
-
Нормализовать звук в ролике без перекодирования видео (усиление звука до нормального уровня, если он слишком тихий).
ffmpeg -i "Запись.avi" -c:a aac -b 320k -filter:a loudnorm -c:v copy "Запись.mp4"
-
Повернуть вертикально снятое видео без перекодирования (изменить метаданные).
ffmpeg -i "VID_20180512_210030.mp4" -c copy -metadata:s:v:0 rotate=0 "снимай нормально.mp4"
-
Заменить звуковую дорожку, видео остаётся без изменений. Если не указывать аудиокодек
-c:a aac -b:a 320k
, ffmpeg сам выберет подходящий контейнеру. Для mp4 это будет aac с битрейтом около 130 кб/с.ffmpeg -i video.mp4 -i new_audio.wav -c:v copy -c:a aac -b:a 320k -map 0:v:0 -map 1:a:0 результат.mp4
-
Сжать видео, варианты:
-
Обычный h264/aac с упором на качество. Фильмы с рутрекера идут в этом формате. Замените fast на veryslow, чтобы сжать эффективнее. Увеличьте ‑crf до 23–28, если хотите снизить вес файла за счёт понижения качества. Faststart и movflags позволяют начать смотреть видео до того, как оно загрузилось полностью.
ffmpeg -i "video-101733.webm" -c:a aac -b 320k -c:v libx264 -preset fast -profile:v high -crf 18 -pix_fmt yuv420p -movflags +faststart 1.mp4
-
Задействуя Intel QSV, аппаратное ускорение. Даёт колоссальный прирост в скорости, но качество ощутимо хуже. Доступен на процессорах Intel начиная с Core i3 Ivy Bridge (2012 год). Более новые поддерживают также h265, но он пока мало распространён и не везде откроется. Кстати говоря, ffmpeg – не лучшее решение для кодирования с QSV, из‐за своей универсальности он в несколько раз проигрывает по скорости более узконаправленной QSVEnc, которая настоятельно рекомендуется. Чтобы аппаратное ускорение Intel работало, монитор должен быть подключен ко встроенной видеокарте Intel. Для управления качеством варьируйте битрейт ‑b:v.
ffmpeg -hwaccel qsv -i "videoplayback.mp4" -c:a aac -b 320k -c:v h264_qsv -preset:v veryslow -b:v 1700K -level 41 -profile:v high -look_ahead 1 "videoplayback+.mp4"
У этого кодека много неочевидных настроек, некоторые нужно выставлять с оглядкой на возможности процессора. Например, look_ahead для Haswell и Broadwell. Полный список:
ffmpeg -? encoder=h264_qsv
-
Сжать для whatsapp в 320p, максимально, чтобы пролезло в жёсткие ограничения по размеру и воспроизвелось на самом захудалом картошка‐фоне
ffmpeg -i 1.mp4 -c:v libx264 -profile:v baseline -level 3.0 -pix_fmt yuv420p -b:v 500K -filter:v scale=-1:320 2.mp4
то же, с аппаратным ускорением:
ffmpeg -hwaccel qsv -i 1.mp4 -c:v h264_qsv -preset:v veryslow -b:v 400K -level 41 -profile:v high -look_ahead 1 -filter:v scale=-1:320 2.mp4
-
Опции для записей рабочего стола, демонстрации экрана, speedpaint, слайдшоу. Опция ‑g – максимальное расстояние между опорными кадрами (GOP), ‑coder 1 включает CABAC (хорошо работает на анимации),
-tune stillimage -refs 1 -g 1000 -coder 1
-
-
Склеить несколько роликов в один. Если есть список файлов, которые надо объединить, делайте так:
ffmpeg -hwaccel qsv -y -f concat -safe 0 -i files.txt -c:a copy -c:v h264_qsv -preset:v veryslow -b:v 3500K -level 41 -profile:v high -g 125 -look_ahead 1 out.mp4
Сам список files.txt должен выглядеть так (кавычки обязательно одинарные):
file '.\video1.mov' file '.\video2.mov' file '.\video3.mov' ...
-
Склеить несколько аудио. Можем сделать это без перекодирования и потери качества, поскольку формат mp3 допускает вольное обращение с собой: файлы можно резать и клеить как настоящую плёнку при условии совпадения числа каналов и битрейта.
ffmpeg -f concat -safe 0 -i files.txt -c:a copy -vn Объединённое.mp3
-
Склеить все файлы Mp3 в папке, не используя никаких списков. Для этого создайте bat‐файл следующего содержания:
cd /D "%~dp0" for %%f in (*.mp3) do ( echo file '%%f' >> list.txt ) ffmpeg -f concat -safe 0 -i list.txt -c copy -vn Gotovo.mp3 del list.txt pause
Поместите его в папку с mp3 и запустите. Для склеивания видео адаптировать код будет несложно.
-
Разделить запись на несколько или вырезать фрагмент без перекодирования. Попробуем разрезать наш любимый mp3:
ffmpeg -i Кассета.mp3 -c copy -ss 00:00 -to 00:55:18 Сторона_А.mp3 ffmpeg -i Кассета.mp3 -c copy -ss 00:55:18 -to 01:45:00 Сторона_Б.mp3
Учитывайте, что разрез пройдёт не в точно указанном месте, а на ближайшем стыке двух фреймов, поскольку мы работаем без пересжатия, и минимальная переносимая единица – это один фрейм. С mp3 всё будет хорошо, там фреймы крохотные, сотые доли секунды. А вот видео можно разбить обычно только по ключевым кадрам, это секунд десять, не меньше.
Случается, некоторые вредные плееры врут относительно времени воспроизведения. Я столкнулся с тем, что LightAlloy в середине двухчасовой записи «уплыл» почти на восемь секунд, а вот MPC‐HC был точен, хотя оба играли через ffdshow. -
Создать анимацию из картинок. Файлы должны иметь порядковые номера без пропусков: img_001.jpg, img_002.jpg и т.д. Здесь framerate – кадры в секунду, stream_loop – сколько кадров держится каждая картинка,
%03d
– три цифры (digits). Если в именах отсутствуют ведущие нули (img_0.jpg, img_1.jpg … img_999.jpg), следует писать просто%3d
. Работает только с картинками, склеить так видеофайлы нельзя.ffmpeg -f image2 -framerate 15 -stream_loop 3 -i "img_%03d.jpg" -c:v libx264 -b:v 3000k out.mp4
-
Пакетное перекодирование всех файлов, найденных по маске. Запускать в командной строке, не забыв сначала командой «cd» сменить рабочую директорию на ту, в которой лежат файлы. Запускать в bat‐файле тоже можно, если заэкранировать символ процента ещё одним: %% вместо %.
FOR %G IN (*.MTS) DO ffmpeg -i "%G" -an -c:v copy "%~nG.mp4"
-
Вытащить звук из ролика без пересжатия:
ffmpeg -i "The Phantom of the Opera (piano cover).mp4" -acodec copy -vn "The Phantom of the Opera (piano cover).aac"
или в пакетном режиме:
FOR %G IN (*.MP4) DO ffmpeg -i "%G" -vn -c:a copy "%~nG.aac"
-
Микс Dolby 5.1 в стерео с сохраненеим правильного баланса каналов. Внимание! Мобильные телефоны не воспроизводят дорожки Dolby Digital AC3 из‐за лицензионных ограничений. Используйте aac, ogg или mp3.
ffmpeg -i "file.mp4" -vn -c:a ac3 -b:a 360K -af "pan=stereo|FL < 1.0*FL + 0.707*FC + 0.707*BL|FR < 1.0*FR + 0.707*FC + 0.707*BR" "out.ac3"
с преобразованием в сырой wav:
ffmpeg -i "file.mp4" -vn -c:a pcm_s16le -ar 48000 -af "pan=stereo|FL < 1.0*FL + 0.707*FC + 0.707*BL|FR < 1.0*FR + 0.707*FC + 0.707*BR" "out.wav"
-
Вытащить только центральный канал из 5.1:
ffmpeg -i "file.mp4" -vn -c:a ac3 -b:a 360K -af "pan=1c|c0 = FC" "out.ac3"
-
Стерео в моно:
ffmpeg -i "file.mp4" -vn -c:a ac3 -b:a 360K -af "pan=1c|c0=.5*c0+.5*c1" "out.ac3"
-
Преобразовать в несжатый WAV (частота дискретизации 44100, 48000 и т.д.)
ffmpeg -i "The Phantom of the Opera Theme Song.mp4" -vn -acodec pcm_s16le -ar 44100 Song.wav
-
Преобразовать во FLAC, формат без потери качества:
ffmpeg -i Голос.wav -vn -acodec flac -ar 44100 Голос.flac
-
Добавить таймкод. Это не настоящий TCR/SMPTE, но близко. Полезно для всяких закадрово‐дубляжных работ:
ffmpeg -i Фильм.mp4 -c:a copy -vf "drawtext=fontfile=/Windows/Fonts/cour.ttf: text='%{pts \:hms}': x=(w-text_w)/2: y=h-text_h*2: fontsize=(h/10): fontcolor=white: box=1: boxcolor=black@0.7: boxborderw=5" Фильм__.mp4
Таймкод выводится моноширным шрифтом Courier (
cour.ttf
), размер которого адаптируется под размер видео (fontsize=(h/10)
), по центру экрана внизу (y=h-text_h*2
). Если место внизу уже занято субтитрами, можно заменить наy=text_h
, и текст уедет вверх.
Можно не впечатывать таймкод в видео, а выводить его динамически, непосредственно в плеере во время воспроизведения с помощью AviSynth. Про это есть отдельная статья. -
Запись экрана. С аппаратным ускорением:
ffmpeg -hwaccel qsv -y -rtbufsize 100M -f gdigrab -framerate 5 -probesize 10M -i desktop -f dshow -i audio="Стерео микшер (Realtek High Def" -c:a aac -b 140k -c:v h264_qsv -preset:v veryfast -b:v 3500K -level 41 -profile:v high -g 125 -look_ahead 1 -crf 25 -pix_fmt yuv420p Запись_встречи.mp4
и без него:
ffmpeg -y -rtbufsize 100M -f gdigrab -framerate 5 -probesize 10M -i desktop -f dshow -i audio="Стерео микшер (Realtek High Def" -c:a aac -b 140k -c:v libx264 -preset ultrafast -crf 25 -pix_fmt yuv420p Запись_встречи.mp4
Название источника аудио (стереомикшера) получим, запросив у ffmpeg список direct show устройств:
ffmpeg -list_devices true -f dshow -i dummy
-
Спидпэйнт из записи экрана. Удаляем повторяющиеся похожие кадры фильтром mpdecimate и ускоряем в 2 раза (0.5 значит, что половина кадров выбрасывается).
ffmpeg -i ice_video_20200601-101733.webm -vf mpdecimate,setpts=0.5*N/FRAME_RATE/TB -c:v libx264 -preset faster -profile:v high -tune stillimage -crf 18 -refs 1 -g 1000 -coder 1 -pix_fmt yuv420p -movflags +faststart -an 1.mp4
-
Хромакей в реальном времени. В этом примере видео с вебки накладывается на онлайн‐трансляцию с побережья Италии и выводится на экран. Ничего сложного. Правда, ссылка на Италию недолгоживущая, ищите свежую. И понадобится зелёная стена. Фильтр scale масштабирует кадр с вебки до размера кадра трансляции. В фильтре colorkey первый параметр – это подавляемый цвет (0x00FF00 – зелёный, 0x000000 – чёрный), затем допустимые отклонения (чем больше, тем агрессивнее), затем степень прозрачности перехода от прозрачного к непрозрачному.
ffmpeg -i "https://hd-auth.skylinewebcams.com/live.m3u8?a=beci4ao7v6g0qt5icj6998suk6" -f dshow -video_size 640x480 -rtbufsize 702000k -i video="VF0520 Live! Cam Sync" -filter_complex "[1:v]scale=1440:1080[scl];[scl]colorkey=0x00FF00:0.8:0.2[ckout];[0:v][ckout]overlay[out]" -map "[out]" -pix_fmt yuv420p -f sdl "SDL OUT"
Вариант с заранее скачанным фоном, без масштабирования и с менее агрессивным хромакеем:
ffmpeg -i "C:\Temp\background.mp4" -f dshow -video_size 640x480 -rtbufsize 702000k -i video="VF0520 Live! Cam Sync" -filter_complex "[1:v]colorkey=0x00FF00:0.4:0.6[ckout];[0:v][ckout]overlay[out]" -map "[out]" -pix_fmt yuv420p -f sdl "SDL OUT"
Название веб‐камеры получаем тем же способом, что и со стереомикшером выше.
-
Склеить потоковое видео HLS – то самое, которое обычно скачивается только фрагментами, кусочками (chunks)
ffmpeg -protocol_whitelist "file,http,https,tcp,tls" -i "27-05-14-00.m3u8" -map 0 -c copy result.mp4
Сам плейлист m3u8 может размещаться на сервере, если это живая трансляция, а может быть и скачан заранее браузером. Выглядит он примерно так:
#EXTM3U #EXT-X-PLAYLIST-TYPE:VOD #EXT-X-TARGETDURATION:6 #EXT-X-VERSION:3 #EXT-X-MEDIA-SEQUENCE:0 #EXT-X-PROGRAM-DATE-TIME:2019-02-23T08:19:56Z #EXTINF:6.000, https://hlsarchive.limehd.tv/f7940e06b7b662bb577dee5694bcec4c017226/tracks-v1a1/dvr-2019/02/23/08/19/56-06000.ts #EXTINF:6.000, https://hlsarchive.limehd.tv/f7940e06b7b662bb577dee5694bcec4c017226/tracks-v1a1/dvr-2019/02/23/08/20/02-06000.ts #EXTINF:6.000, https://hlsarchive.limehd.tv/f7940e06b7b662bb577dee5694bcec4c017226/tracks-v1a1/dvr-2019/02/23/08/20/08-06000.ts #EXTINF:6.000, https://hlsarchive.limehd.tv/f7940e06b7b662bb577dee5694bcec4c017226/tracks-v1a1/dvr-2019/02/23/08/20/14-06000.ts #EXTINF:6.000, https://hlsarchive.limehd.tv/f7940e06b7b662bb577dee5694bcec4c017226/tracks-v1a1/dvr-2019/02/23/08/20/20-06000.ts #EXTINF:6.000, https://hlsarchive.limehd.tv/f7940e06b7b662bb577dee5694bcec4c017226/tracks-v1a1/dvr-2019/02/23/08/20/26-06000.ts ...