如何直接从没有实际输入文件的FFmpeg过滤器生成视频文件?

bla*_*lah 20 video ffmpeg

FFmpeg有许多视频生成过滤器,在文档中列为" 视频源 ":

  • cellauto
  • 颜色
  • mptestsrc
  • fei0r_src
  • 生活
  • nullsrc,rgbtestsrc,testsrc

这些非常适合与叠加等其他滤镜一起使用,但有没有什么方法可以生成只包含其中一个视频源而没有任何输入视频的电影?

就像是:

ffmpeg -vf color=red" red_movie.mp4
Run Code Online (Sandbox Code Playgroud)

除了错误之外At least one input file must be specified.

jbb*_*ley 39

在最近的版本中,看起来选项略有变化.

要使用过滤器输入源,您必须:

  1. 使用以下命令将输入​​格式设置为libavfilter虚拟设备: -f lavfi
  2. 使用-i标志设置过滤器输入源(不是-vf)
  3. 提供参数作为完整的键值对,例如: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

SMPTE彩条图案

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秒的黑色.

在测试源更多信息这里.

RGB测试源

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)

  • 对于那些指定视频分辨率的内容:`ffmpeg -f lavfi -i testsrc=size=1280x720 -t 30 -pix_fmt yuv420p testsrc.mp4` 适合您。 (3认同)

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)

(指定帧数或以其他方式限制输入是至关重要的,因为过滤器通常没有固定的"结束"点,并且将很乐意继续生成视频.)

  • 实际上,当使用 `-f lavfi` 时,您可以使用完整的 filtergraph 作为 `-i` 输入。这是一个过滤器链示例:`ffmpeg -f lavfi -i life,edgedetect,negate,fade=in:0:100 -frames:v 200 life.mp4` (3认同)