Skip to content
pituz edited this page Feb 14, 2015 · 21 revisions

Краткий гайд по использованию 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 это кодеки vp8/vorbis, битрейт видео 200кбпс, crf 4 и качество звука 3, см. ниже). Если разрешение видео будет больше спичечного коробка, то его с такими параметрами скорее всего распидорасит на квадраты.

Сложный пример:

ffmpeg -hide_banner \
    -loop 1 -r 1 -i picture.png \
    -ss 3.5 -i audio.flac \
    -shortest -c:v vp9 -b:v 5M -crf 16 -c:a libopus -b:a 96k 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 время - конец фрагмента от начала потока.

Также можно использовать фильтры 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).

Фильтры

Способы применения фильтров

Экранирование параметров

TODO

Субтитры (наложение хардсаба)

Для этого у 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.

Clone this wiki locally