FFmpeg有许多视频生成过滤器,在文档中列为" 视频源 ":
这些非常适合与叠加等其他滤镜一起使用,但有没有什么方法可以生成只包含其中一个视频源而没有任何输入视频的电影?
就像是:
ffmpeg -vf color=red" red_movie.mp4
Run Code Online (Sandbox Code Playgroud)
除了错误之外At least one input file must be specified.
jbb*_*ley 39
在最近的版本中,看起来选项略有变化.
要使用过滤器输入源,您必须:
-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
Run Code Online (Sandbox Code Playgroud)
密钥可缩短为缩写形式: -i color=c=red
ffmpeg -f lavfi -i smptebars -t 30 smpte.mp4
Run Code Online (Sandbox Code Playgroud)
ffmpeg -f lavfi -i testsrc -t 30 -pix_fmt yuv420p testsrc.mp4
Run Code Online (Sandbox Code Playgroud)

为了可靠地播放,您可能需要设置像素格式: -pix_fmt yuv420p
默认情况下,ffmpeg将使用yuv444p(x264,High 4:4:4 Predictive),有些玩家尚无法解码.
例如,它创建的视频崩溃了VLC 2.0.7,在QuickTime Player 10.2(Mac OS X 10.8.4)中只有30秒的黑色.
在测试源更多信息这里.
ffmpeg -f lavfi -i rgbtestsrc -pix_fmt yuv420p -t 30 rgbtestsrc.mp4
Run Code Online (Sandbox Code Playgroud)
与上一个示例一样,除非您将像素格式设置为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
Run Code Online (Sandbox Code Playgroud)
bla*_*lah 18
虽然在文档中暗示,但没有明确说明.我很高兴弄明白,所以我想我会分享.
关键是要使用特殊格式lavfi:
Libavfilter输入虚拟设备.
该输入设备从libavfilter滤波器图的开放输出焊盘读取数据.
对于每个filtergraph打开输出,输入设备将创建一个映射到生成的输出的相应流.目前仅支持视频数据.filtergraph通过选项'graph'指定.
实质上,lavfi格式会将输入视为视频过滤器而不是文件名.
因此,为了使电影只由红色组成,命令是:
ffmpeg -f lavfi -i color=red -frames:v 200 red_movie.mp4
Run Code Online (Sandbox Code Playgroud)
(指定帧数或以其他方式限制输入是至关重要的,因为过滤器通常没有固定的"结束"点,并且将很乐意继续生成视频.)