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Изглежда, че опциите са се променили леко в последните версии.
За да използвате входните източници на филтъра, трябва да:
- Задайте входния формат на виртуалното устройство libavfilter, като използвате:
-f lavfi
- Задайте входния източник на филтъра, като използвате
-i
flag (не-vf
) - Дайте аргументи като попълнете двойките ключ-стойност, като:
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
(Определянето на броя на кадрите или по друг начин ограничаване на входа е решаващ тъй като филтрите обикновено нямат фиксирана точка "край" и с радост ще продължат да генерират видео завинаги.)