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

时间:2012-07-24 22:53:27

标签: video ffmpeg

FFmpeg有许多视频生成过滤器,在文档中列为“video sources”:

  • cellauto
  • 颜色
  • mptestsrc
  • fei0r_src
  • 寿命
  • nullsrc,rgbtestsrc,testsrc

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

类似的东西:

ffmpeg -vf color=red" red_movie.mp4

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

2 个答案:

答案 0 :(得分:34)

在最近的版本中看起来选项略有改变。

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

  1. 使用以下命令将输入​​格式设置为libavfilter虚拟设备:-f lavfi
  2. 使用-i标志(不是-vf
  3. 设置过滤器输入源
  4. 将参数提供为完整的键值对,例如:color=color=red
  5. 这也适用于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),some players aren't yet able to decode

    例如,它创建的视频正在崩溃VLC 2.0.7,在QuickTime Player 10.2(Mac OS X 10.8.4)中只有30秒的黑色。

    有关测试来源here的更多信息。

    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
    

答案 1 :(得分:17)

虽然在文档中暗示过,但未明确说明。我很高兴弄明白,所以我想我会分享。

关键是使用特殊格式lavfi

  

Libavfilter输入虚拟设备。

     

此输入设备从libavfilter滤波器图的打开输出焊盘读取数据。

     

对于每个filtergraph打开输出,输入设备将创建一个映射到生成的输出的相应流。目前仅支持视频数据。 filtergraph通过选项'graph'指定。

基本上,lavfi格式会将输入视为视频过滤器而不是文件名。

因此,要制作一部只包含红色的电影,命令为:

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

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