FFmpeg有许多视频生成过滤器,在文档中列为“video sources”:
这些非常适合与叠加等其他滤镜一起使用,但有没有办法可以生成只包含其中一个视频源但没有任何输入视频的电影?
类似的东西:
ffmpeg -vf color=red" red_movie.mp4
除了 At least one input file must be specified
错误之外。
答案 0 :(得分:34)
在最近的版本中看起来选项略有改变。
要使用过滤器输入源,您必须:
-f lavfi
-i
标志(不是-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
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),some players aren't yet able to decode。
例如,它创建的视频正在崩溃VLC 2.0.7,在QuickTime Player 10.2(Mac OS X 10.8.4)中只有30秒的黑色。
有关测试来源here的更多信息。
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
答案 1 :(得分:17)
虽然在文档中暗示过,但未明确说明。我很高兴弄明白,所以我想我会分享。
关键是使用特殊格式lavfi
:
Libavfilter输入虚拟设备。
此输入设备从libavfilter滤波器图的打开输出焊盘读取数据。
对于每个filtergraph打开输出,输入设备将创建一个映射到生成的输出的相应流。目前仅支持视频数据。 filtergraph通过选项'graph'指定。
基本上,lavfi
格式会将输入视为视频过滤器而不是文件名。
因此,要制作一部只包含红色的电影,命令为:
ffmpeg -f lavfi -i color=red -frames:v 200 red_movie.mp4
(指定帧数或以其他方式限制输入至关重要,因为过滤器通常没有固定的“结束”点,并且很乐意继续生成视频。)