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.mkvC\:\\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.