Командная строка FFmpeg
Я буду описывать только подмножество синтаксиса командной строки. Впрочем, его хватит для практически любых ситуаций. Общий вид командной строки:
ffmpeg общие_параметры входные_файлы описание_фильтров выходные_файлы
общие_параметры— общие параметры программы, разделенные пробелами. В документации им соответствует раздел «5.2 Generic options». Здесь в основном указывается, какая информация о работе программы выводится в консольное окно. Я сам, например, всегда добавляю опцию-hide_banner(не показывать информацию об авторских правах и конфигурации утилиты).входные_файлы— список описаний входных файлов, разделенных пробелами. Каждое описание входного файла имеет видвыходные_файлы— список описаний выходных файлов, построенный примерно по тем же принципам, что и входных и примерно с теми же опциями, с той разницей, что-iне включается:параметры_файла— параметры файла, разделенные пробелами. Каждый из них относится только к тому входному или выходному файлу, который непосредственно следует после группы параметров.описание_фильтров— см. подразделы «Простое описание фильтров» и «Сложное описание фильтров» ниже.
параметры_файла -i имя_файла
параметры_файла имя_файла
Пример
C:\Bin\ffmpeg -hide_banner -ss 6:52 -i "a.avi" -vf loop=start=0:size=1:loop=-1 -t 5 "b.mkv"
- Берем входной файл (опция
-i "a.avi"). - Вырезаем из него часть, которая начинается с 6-й минуты 52-й секунды (опция
-ss 6:52). - Применяем к ее видео потоку (опция
-vf) фильтрloopс аргументамиstart=0:size=1:loop=-1. То есть берем один (опцияsize=1) самый первый кадр (опцияstart=0) и повторяем его бесконечное количество раз (опцияloop=-1). Аудио поток остается неизменным. - Из видео после фильтра и исходного аудио потоков вырезаем первые 5 секунд (опция
-t 5). - Записываем результат в файл (опция
"b.mkv").
Простое описание фильтров
-vf) и/или аудио (-af) потоков, разделенных пробелами:-vf цепочка_фильтров -af цепочка_фильтров
цепочка_фильтров— описания индивидуальных фильтров, разделенные запятыми. Каждый из фильтров выполняет какое-то преобразование входного потока и передает результаты на вход следующему фильтру. Каждое описание состоит из имени фильтра и, возможно, его аргументов:аргументы_фильтра— описания индивидуальных аргументов, разделенные двоеточиями. Аргумент может быть позиционным или именованным. Если аргумент позиционный, то он включат только значение, а имя аргумента определяется его позицией в списке, которую вы можете узнать из документации по конкретному фильтру. Если аргумент именованный, то его описание включает имя аргумента и его значение. Если какому-то аргументу не задано значение, то берется значение по умолчанию.
имя_фильтра имя_фильтра=аргументы_фильтра
значение_аргумента имя_аргумента=значение_аргумента
Примеры простого описания фильтров
-vf) описание фильтров. Далее я буду демонстрировать, как может быть изменена часть -vf loop=start=0:size=1:loop=-1 командной строки.- Использование позиционных аргументов. В описании аргументов фильтра мы использовали именованные аргументы
start=0,size=1иloop=-1. Идем в документацию по фильтру «39.117 loop». В нем аргументы перечислены в следующем порядке: 1.loop, 2.sizeи 3.start. Это означает, что мы может описать те же самые аргументы в виде: - Добавление еще одного фильтра (затухание изображения продолжительностью 3 секунды) в цепочку.
- Добавление описания фильтра для другого потока (нормализация уровня громкости). Фильтр в примере используется без аргументов.
-vf loop=-1:1:0
-vf loop=-1:1:0,fade=type=out:d=3
-vf loop=-1:1:0,fade=type=out:d=3 -af loudnorm
Сложное описание фильтров
-filter_complex граф_фильтров маппинг_выходных_потоков
граф_фильтров— описания веток графа, разделенные точками с запятыми. Каждая ветка имеет вид (символом центральной точки · мы обозначаем отсутствие пробела):цепочка_фильтров— в том же формате, что и для простого описания фильтров, см. выше.список_входов— список входных потоков и/или меток (без пробелов).список_выходов— список меток (без пробелов).маппинг_выходных_потоков— описания потоков выходного файла, разделенные пробелами. В выходном файле потоки будут включены именно в том порядке, в котором идут опции-mapи только те, которые перечислены. Обратите внимание, чтоописание_входного_потокаприводится без квадратных скобок.описание_входного_потока— описание входного потока в одном из форматов:тип_потока— v, a или s для соответственно видео изображения, аудио и субтитров.имя_метки— имя может включать буквы, цифры и символ подчеркивания. Каждая метка обязана появляться ровно один раз как входная и ровно один раз как выходная, иначе будет ошибка. Если имеется необходимость, то существуют специальные фильтры для дублирования меток.
список_входов·цепочка_фильтров·список_выходов
[описание_входного_потока] [имя_метки]
[имя_метки]
-map описание_входного_потока -map [имя_метки]
индекс_входного_файла индекс_входного_файла:тип_потока индекс_входного_файла:тип_потока:индекс_потока_данного_типа_в_файле индекс_входного_файла:индекс_потока_в_файле
Примеры сложного описания фильтров
-vf loop=start=0:size=1:loop=-1 командной строки из подраздела «Пример» выше.- Пример, как можно поменять простое описание фильтров на сложное с полным сохранением функциональности. Используется описание из примера #3 подраздела «Примеры простого описания фильтров» выше.
- Немного более простое описание фильтров (пример #2 того же подраздела), где мы исключили
loudnorm. Обратите внимание, что если мы не укажем-map 0:aв сложном описании фильтров, то в выходном файле совсем не будет звука. - Более сложный пример, который невозможно реализовать с помощью простого описания фильтров.
См., что означает символ ^ …
Чтобы не вытягивать текст описания в одну длинную строчку, я буду использовать символ ^ командных файлов Windows переноса на следующую строку. То есть так, как этот текст может использоваться в командном файле. Если вы желаете использовать этот текст в командной строке, то удалите все символы ^ и переводы строк, следующих за ними.
-filter_complex ^ [0:v]trim=end=3[v0];^ [0:a]atrim=end=3[a0];^ [0:v]trim=start=3,setpts=PTS-STARTPTS,loop=-1:1:0,fade=type=out:d=2[v1];^ [0:a]atrim=start=3,asetpts=PTS-STARTPTS,afade=type=out:d=2[a1];^ [v0][a0][v1][a1]concat=n=2:v=1:a=1[vv][aa] ^ -map [vv] -map [aa]
Он помещает в выходной файл 5-секундное видео, где первые 3 секунды копируют входной поток, а оставшиеся 2 секунды заполнены затухающими звуком и изображением с остановившимся кадром. Пример почти совершенно практический, больша́я часть моих YouTube клипов создана похожим кодом. Например, вот этот:
-vf loop=-1:1:0,fade=type=out:d=3 -af loudnorm -filter_complex [0:v]loop=-1:1:0,fade=type=out:d=3[v0];[0:a]loudnorm[a0] -map [v0] -map [a0]
-vf loop=-1:1:0,fade=type=out:d=3 -filter_complex [0:v]loop=-1:1:0,fade=type=out:d=3[v0] -map [v0] -map 0:a
Применение кавычек и символа \
Их необходимость связана с различной интерпретацией отдельных символов в различных частях командной строки. Например, см. описание выше: «входные_файлы — список описаний входных файлов, разделенных пробелами». Однако пробел также может являться частью имени файла.
Символами, интерпретируемыми специальным образом, могут быть пробелы, точки с запятой, запятые, двоеточия, квадратные скобки. Также одиночные и двойные кавычки, символ \ и другие.
- Если в аргументе имеется шанс появления пробелов, как в имени файла, то лучше поместить его в двойные кавычки.
- Перед специальными символами (кроме тех, которые являются частью имени файла) помещайте символ \.
Не-ascii символы в командной строке
Время от времени вы будете сталкиваться с тем, что FFmpeg не будет понимать какой-то Unicode символ командной строки. Типичный пример — тире (то есть не короткий ascii дефис ‘-’, а длинное тире ‘‒’) в имени файла.
В обсуждениях в FFmpeg блогах утверждается, что это проблема не самого FFmpeg, а его окружения (в нашем случае Far Manager и командных файлов Windows). В тот момент, когда вы копируете строку и затем ее переносите в командную строку, отдельные символы могут преобразовываться в другой Unicode код.
В практике, если, например, ваш файл с подобным именем не распознается FFmpeg, просто переименуйте его.
