Практическое руководство по FFmpeg: Часть 4

4-я часть описания пакета FFmpeg и практических примеров его использования.
Это четвертая часть статьи, первая находится здесь.

Параметры файлов

Параметры файлов соответствуют элементам параметры_файла командной строки FFmpeg.

Параметры могут применяться или к структуре контейнера, или одновременно к всем потокам файла, или к потокам определенного типа (например, только к потокам видео, аудио или субтитров), или только к потокам определенного формата (кодека). Общие параметры, не зависящие от кодека, описаны в подразделах 5.4-5.11 документации FFmpeg. Параметры, специфические для кодеков, описываются в разделах документации, посвященных конкретному кодеку.

Далее мы приведем описание некоторых самых часто используемых параметров.

Начало, конец и продолжительность видео фрагмента

-ss время
-to время
-t время
-frames:v число_кадров
Соответственно начало (-ss), конец (-to), продолжительность по времени (-t) и число видео кадров (-frames:v). Параметры могут быть в любой комбинации и в любом порядке.
  • время — продолжительность в секундах в целом формате или, при необходимости, формате с фиксированной точкой. Дополнительно через двоеточия могут задаваться минуты и часы. Обратите внимание, что результат применения параметра может не быть абсолютно точным (например, вы задаете ровно 5 секунд, а в реальности будет 4.96).
  • секунды
    минуты:секунды
    часы:минуты:секунды
    Пример 1. 3 — 3 секунды.
    Пример 2. 1:02:03.04 — 1 час 2 минуты 3 и 4 сотых секунды.

Вы также можете использовать видео и аудио фильтры trim и atrim с близкой функциональностью. Однако они работают несравнимо медленней.

Тип кодека

-c:v тип_кодека
-c:a тип_кодека
Соответственно видео и аудио кодек. Типичной комбинацией выходных кодеков является -c:v libx264 -c:a aac. Специальный тип copy дает указание не только не менять тип кодека (он не будет меняться, если вы просто не зададите опцию с его типом), но и не производить перекодировку. Понятно, что это далеко не всегда возможно реализовать, в этом случае программа выдаст ошибку.

Частота кадров

-r частота
-r числитель_частоты/знаменатель_частоты
-r аббревиатура_частоты
Наиболее часто используются:
  • ntsc-film или 24000/1001 — частота видеодисков NTSC =23.98 кадров в секунду. Используется практически везде.
  • ntsc или 30000/1001 — частота телевизионной трансляции NTSC =29.97 кадров в секунду. Изредка попадается.
  • pal или 25 — частота PAL и YouTube =25 кадров в секунду. Частота по умолчанию в FFmpeg.

Пиксельный формат

-pix_fmt пиксельный_формат
В подавляющем числе случаев используются:
  • yuv420p — 8 бит формат.
  • yuv420p10le — 10 бит формат.

Фильтры

В этом разделе аргументы_фильтра — это аргументы фильтра в формате, как изложено в описании командной строки FFmpeg.

Вырезать по времени фрагменты потоков

В отличии от параметров файла -ss, -to и -t, вы не можете с помощью фильтра вырезать фрагмент всех потоков одновременно. Вы должны использовать отдельные фильтры для видео (trim) и аудио (atrim) и у вас принципиально отсутствует возможность то же самое проделать с субтитрами.
trim=аргументы_фильтра,setpts=N/FRAME_RATE/TB
atrim=аргументы_фильтра,asetpts=N/SR/TB
Сразу возникает вопрос: «А что это за звери setpts=N/FRAME_RATE/TB и asetpts=N/SR/TB и зачем они нужны?» Можете считать их магическими заклинаниями, без них у вас появятся странные, сложно распознаваемые ошибки как во время работы программы FFmpeg, так и во время проигрывания медиафайлов.
Основные аргументы:
  • start=время — время начала фрагмента, по умолчанию с начала потока.
  • end=время — время окончания фрагмента, по умолчанию до конца потока.
  • duration=время — продолжительность фрагмента, по умолчанию до конца потока.

Объединить по времени фрагменты потоков

concat=аргументы_фильтра
Основные аргументы:
  • n=число — количество входных сегментов.
  • v=число — количество видео потоков в каждом сегменте.
  • a=число — количество аудио потоков в каждом сегменте.

Фильтр принимает на вход n * (v + a) потоков и передает на выход (v + a) потоков, объединяя их по времени в каждом из (v + a) потоков по отдельности и синхронизируя по максимальному времени потока в каждом из входных сегментов кроме последнего. Входные потоки должны следовать в порядке: вначале все потоки 1-го сегмента, начиная с видео, затем 2-го и так далее. Это проще всего понять из примера:

[v1][a1][a2][v2][a3][a4]concat=n=2:v=1:a=2[vv][aa1][aa2]

1-й входной сегмент состоит из потоков [v1][a1][a2], 2-й из [v2][a3][a4].

Выходной поток [vv] будет включать [v1][v2], [aa1] включает [a1][a3], [aa2] включает [a2][a4].

Как потоки будут синхронизироваться по времени? Предположим, что все входные потоки имеют длительность в 1 секунду, кроме [v1] и [a4] по половине секунды. Тогда результат будет следующим.

Выходной поток [vv] будет включать [v1], затем паузу в половину секунду, затем [v2]. Всего — 2 секунды. Пауза появится потому, что максимальная длительность потоков 1-го сегмента [v1][a1][a2] составляет 1 секунду, поэтому после потока [v1] добавляется пауза в половину секунды, чтобы все потоки 1-го сегмента закончились в одно и то же время.

Длительность выходного потока [aa1] будет 2 секунды без пауз.

Длительность выходного потока [aa2] будет 1.5 секунды без пауз, поскольку более короткий поток [a4] находится в последнем сегменте. Поэтому, вместо добавления паузы, продолжительность выходного потока просто укорачивается.

Появление и затухание потоков

fade=аргументы_фильтра
afade=аргументы_фильтра
Оба фильтра принимают на вход и передают на выход ровно по одному потоку, fade — видео изображения и afade — аудио соответственно.
Основные аргументы:
  • type=in или type=out — тип переходного процесса, появление или затухание соответственно.
  • st=время — начало переходного процесса относительно начала потока, 0 по умолчанию.
  • duration=время — продолжительность переходного процесса.

Переход одного потока в другой

xfade=аргументы_фильтра
acrossfade=аргументы_фильтра
Оба фильтра принимают на вход по два потока и передают на выход по одному, xfade — видео изображения и acrossfade — аудио соответственно. На выходе вначале появится 1-й входной поток, который затем плавно перейдет во 2-й.
Основные аргументы:
  • duration=время — продолжительность переходного процесса.
  • offset=время (только для xfade) — начало переходного процесса относительно начала 1-го потока, 0 по умолчанию. 2-й поток задерживается на этот промежуток времени относительно 1-го.
  • transition=тип_xfade (только для xfade) — визуальный тип переходного процесса. На настоящий момент реализовано 44 разных типа, я сам использовал fade, radial и dissolve.
Внимание! Страница находится в разработке. Возвращайтесь попозже, чтобы увидеть ее полную версию.

Marple-268

Опубликовано 10 ноября 2020 г.
Последние изменения 16 марта 2021 г.
См. Соглашение пользователя.