/ / Как мога да генерирам видео файл директно от FFmpeg филтър без действителен входен файл? - видео, ffmpeg

Как мога да генерирам видео файл директно от FFmpeg филтър без действителен входен файл? - видео, ffmpeg

FFmpeg има редица филтри за генериране на видео, изброени в документацията като "видео източници":

  • cellauto
  • цвят
  • mptestsrc
  • fei0r_src
  • живот
  • nullsrc, rgbtestsrc, testsrc

Това са чудесни за използване с други филтри като наслояване, но има ли някакъв начин, че мога да генерира филм, състоящ се от само един от тези източници на видео без никакви входни видео?

Нещо като:

ffmpeg -vf color=red" red_movie.mp4

С изключение на това, че с грешките At least one input file must be specified.

Отговори:

29 за отговор № 1

Изглежда, че опциите са се променили леко в последните версии.

За да използвате входните източници на филтъра, трябва да:

  1. Задайте входния формат на виртуалното устройство libavfilter, като използвате: -f lavfi
  2. Задайте входния източник на филтъра, като използвате -i flag (не -vf)
  3. Дайте аргументи като попълнете двойките ключ-стойност, като: color=color=red

Това работи за ffplayсъщо, за да тествате графиката на филтъра си: 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

За да може това да се възпроизведе надеждно, може да се наложи да зададете пикселния формат с: -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

16 за отговор № 2

Макар да е намекнал в документацията, това не е изрично изписано. Бях доволен да го разбера, така че си помислих, че ще споделя.

Ключът е да се използва специалният формат lavfi:

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

Това входно устройство чете данни от отворените изходни подложки на libavfilter filtergraph.

За всеки отворен изход на филтъра, входътУстройството ще създаде съответстващ поток, който се свързва с генерирания изход. В момента се поддържат само видео данни. Графиката на филтъра е зададена чрез опцията "графика".

По същество, lavfi формат води до това, че входът се третира като видеофилтър, а не като име на файл.

Така, за да направим филм, състоящ се от нищо друго освен червено, командата е:

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

(Определянето на броя на кадрите или по друг начин ограничаване на входа е решаващ тъй като филтрите обикновено нямат фиксирана точка "край" и с радост ще продължат да генерират видео завинаги.)