Как я могу создать видеофайл непосредственно из фильтра FFmpeg без фактического входного файла?

FFmpeg имеет несколько видеогенерирующих фильтров, перечисленных в документации как "источники видео:

  • cellauto
  • Цвет
  • mptestsrc
  • fei0r_src
  • жизнь
  • nullsrc, rgbtestsrc, testsrc

Те отлично подходят для использования с другими фильтрами, такими как наложение, но есть ли способ создать фильм, состоящий только из одного из этих источников видео без какого-либо входного видео?

Что-то вроде:

ffmpeg -vf color=red" red_movie.mp4

За исключением того, что эти ошибки с At least one input file must be specified.

Ответ 1

Похоже, что в последних версиях параметры немного изменились.

Чтобы использовать источники входного сигнала фильтра, вы должны:

  • Задайте формат ввода для виртуального устройства libavfilter, используя: -f lavfi
  • Установите источник входного сигнала фильтра, используя флаг -i (не -vf)
  • Предоставить аргументы как полные пары ключ-значение, например: color=color=red

Это работает и для ffplay, чтобы проверить ваш filtergraph: ffplay -f lavfi -i color

Примеры

В этих примерах я добавил -t 30, чтобы указать, что я хочу только 30 секунд вывода.

Цвет (красный)

ffmpeg -f lavfi -i color=color=red -t 30 red.mp4
                     ^     ^    ^
                     |     |    |
                   filter key value

Ключ может быть сокращен до его сокращенной формы: -i color=c=red

Шаблон цветовых полос SMPTE

ffmpeg -f lavfi -i smptebars -t 30 smpte.mp4

Шаблон тестового источника

ffmpeg -f lavfi -i testsrc -t 30 -pix_fmt yuv420p testsrc.mp4

0laHY.jpg

Для того, чтобы это можно было надежно воспроизвести, вам может потребоваться установить формат пикселей: -pix_fmt yuv420p

По умолчанию ffmpeg будет использовать yuv444p (x264, High 4: 4: 4 Predictive), который некоторые игроки еще не могут декодировать.

Например, созданное видео вызывает сбой VLC 2.0.7 и всего лишь 30 секунд черного цвета в QuickTime Player 10.2 (Mac OS X 10.8.4).

Дополнительная информация о источнике тестирования здесь.

Источник тестирования RGB

ffmpeg -f lavfi -i rgbtestsrc -pix_fmt yuv420p -t 30 rgbtestsrc.mp4

Как и в последнем примере, это может не сработать для вас, если вы не установили формат пикселей на yuv420p, как показано.

Для потомков, здесь версия, которую я использую:

ffmpeg version 1.2.1
libavutil      52. 18.100 / 52. 18.100
libavcodec     54. 92.100 / 54. 92.100
libavformat    54. 63.104 / 54. 63.104
libavdevice    54.  3.103 / 54.  3.103
libavfilter     3. 42.103 /  3. 42.103
libswscale      2.  2.100 /  2.  2.100
libswresample   0. 17.102 /  0. 17.102
libpostproc    52.  2.100 / 52.  2.100

Ответ 2

Хотя это намечено в документации, это явно не указано. Мне было приятно разобраться в этом, поэтому я подумал, что поделюсь.

Ключ должен использовать специальный формат lavfi:

Виртуальное устройство ввода Libavfilter.

Это устройство ввода считывает данные с открытых выходных площадок фильтра фильтра libavfilter.

Для каждого выходного файла filtergraph устройство ввода создаст соответствующий поток, который отображается на сгенерированный вывод. В настоящее время поддерживаются только видеоданные. Filtergraph задается с помощью опции "graph".

По существу, формат lavfi заставляет вход обрабатывать как видеофильтр вместо имени файла.

Таким образом, чтобы сделать фильм, состоящий только из красного, команда:

ffmpeg -f lavfi -i color=red -frames:v 200 red_movie.mp4

(Указание количества кадров или ограничение на вход данных имеет решающее значение, поскольку фильтры, как правило, не имеют фиксированной "конечной точки" и будут счастливо продолжать генерировать видео навсегда.)