ffmpeg - pituz/webm-thread GitHub Wiki
Краткий гайд по использованию ffmpeg.
Синтаксис параметров
ffmpeg [глобальные_параметры] \
[[параметры_входа_0] -i вход_0.mkv] \
[[параметры_входа_1] -i вход_1.flv] \
[...] \
[параметры_выхода_0] выход_0.webm \
[[параметры_выхода_1] выход_1.ogg] \
[...]
Разбиение на строки здесь использовано исключительно для наглядности; символ «\» в юниксовых шеллах отменяет использование перевода строки как окончания команды, в windows вместо него следует использовать «^». Напоминаю, квадратными скобками обозначаются необязательные параметры. То есть, вовсе не обязательно писать всё, простейший пример выглядит так:
ffmpeg -i animu.mkv animu.webm
# ^ команда ^ вход 0 ^ выход 0
# ^ п-ры входа ^ п-ры выхода
(взять animu.mkv и сконвертировать в animu.webm).
При этом будут использованы параметры по умолчанию (для формата webm это кодеки vp9/opus, битрейт видео 200 и звука 96 kbps, см. ниже). Если разрешение видео будет больше спичечного коробка, то его с такими параметрами скорее всего распидорасит на квадраты.
Сложный пример:
ffmpeg -hide_banner \
-loop 1 -r 1 -i picture.png \
-ss 3.5 -i audio.flac \
-shortest -b:v 0 -crf 16 musicwebm.webm \
-vn -q:a 2 /mnt/flash/audio.mp3
(взять видеоряд из повторяющейся со скоростью 1 fps картинкой picture.png и звук начиная с 3.5 секунд audio.flac, сделать из этого musicwebm.webm с кодеками vp9/opus и заодно закинуть mp3 на флешку).
Выбор потоков (дорожек)
Это делается в параметрах выхода. По умолчанию ffmpeg берёт по одному потоку каждого типа, который поддерживает выходной формат, выбирая лучшие (видео большего разрешения, аудио с большим числом каналов, первые сабы). Это можно немного изменить, отключив параметрами -vn
, -an
и -sn
видео, звук и субтитры соответственно, либо вообще отключить автоматический выбор, использовав параметр -map идентификатор_потока
. Последний можно посмотреть, запустив ffmpeg -i файл
, будут выведены такие строки:
Stream #0:0(jpn): Video: h264 (High 10), yuv420p10le, 1280x720, SAR 1:1 DAR 16:9, 23.98 fps, 23.98 tbr, 1k tbn, 47.95 tbc (default)
Stream #0:1(jpn): Audio: aac, 48000 Hz, stereo, fltp (default)
0:0
и 0:1
— это и есть идентификаторы потоков. Помимо использования этих идентификаторов, удобно использовать и другие формы, примеры:
-map 0
(всё из первого входа);-map 0:v -map 1:a
(всё видео из первого входа и всё аудио из второго);-map 0:v:0 -map 0:a:0
(первые видео- и аудиодорожки первого входа).
Обрезка фрагмента по времени
Время указывается либо числом секунд, либо в формате [[чч:]мм:]cc[.cc]
Параметры:
-ss время
— начало фрагмента; может указываться как на входе, так и на выходе. При указании на входе сбрасывается начало потока (выход считает, что файл начинается с указанного времени), что приводит к невозможности использования параметра -to, наложения субтитров и прочих требующих отсчёта от начала файла операций; при указании на выходе вызывает декодирование и выкидывание всех кадров от начала файла до указанного времени, что может быть долго, особенно если кадры большие.-t время
— длительность фрагмента; может указываться как на входе, так и на выходе.-to время
— конец фрагмента от начала потока; может указываться только на выходе, см. пояснения выше в описании -ss.
Также можно использовать фильтры trim
и atrim
.
Примеры:
ffmpeg -ss 1:10 -i animu.mkv -t 15 out.webm
(вырезать 15 секунд начиная с минуты десяти секунд);ffmpeg -i animu.mkv -ss 1:10 -to 1:25 out.webm
(то же самое, но дольше);ffmpeg -ss 1:10 -i animu.mkv -to 1:25 out.webm
(неправильно: вместо 15 секунд вырежет 1:25).
Фильтры
Способы применения фильтров
-
Простой: используются цепочки фильтров -af и -vf для звука и видео соответственно, у каждой из которых есть один вход и один выход. Примеры:
-af volume=-2,bass=2 out.webm
(уменьшить громкость и поднять низкие частоты на 2дБ);-vf scale=-1:720,drawtext=text=хуй:x=200:y=100
(отмасштабировать видео до 720p с сохранением пропорций и написать «хуй» по координатам 200,100 от левого верхнего угла).
-
Комплексный: цепочек фильтров и их входов с выходами может быть сколько угодно, их можно разруливать самому.
TODO
Экранирование параметров фильтров
Некоторые символы в цепочках фильтров имеют специальное значение и не могут быть переданы напрямую:
- , используется для разделения фильтров в цепочке,
- : — для разделения параметров фильтра,
- [ и ] — для указания потоков,
- ** — для экранирования спецсимволов.
Чтобы их всё-таки передать, используется две техники:
- квотирование — заключение параметра в одинарные кавычки;
- экранирование — установка перед спецсимволом бэкслэша.
На бэкслэш квотирование не распространяется чтобы оставалась возможность передавать и кавычки, его можно только экранировать.
Примеры:
C:\video\[hurr] durr.mkv
→'C:\\video\\[hurr] durr.mkv'
C:\video\[hurr] durr.mkv
→C\:\\video\\\[hurr\] durr.mkv
Субтитры (наложение хардсаба)
Для этого у ffmpeg есть два фильтра: subtitles
и ass
. Разница между ними в том, что фильтр subtitles умеет доставать сабы из контейнеров, но может падать с ошибкой при работе с отдельными файлами субтитров, а ass предназначен для работы исключительно с последними.
Чтобы сабы не съехали при обрезке, начало фрагмента нужно указывать на выходе, см. выше.
Примеры:
ffmpeg -i animu.mkv -sn -ss 10:00 -t 20 -vf subtitles=animu.mkv out.webm
- экранирование символов пути в windows:
ffmpeg -i "z:\anime\[Victorique] Gosick [BD][h264-720p_FLAC]\[Victorique ]_Gosick_-_01_[BD][h264-720p][FLAC][A31D882E].mkv" ^
-t 10 -vf "scale=640:-1,subtitles='z\:\\anime\\[Victorique] Gosick [BD][h264-720p_FLAC]\\[Victorique]_Gosick_-_01_[BD][h264-720p][FLAC][A31D882E].mkv'" ^
-b:v 5m -crf 20 out.webm
Для рендеринга шрифтов в щиндовс нужно настроить fontconfig.