【问题标题】:How can I generate a video file directly from an FFmpeg filter with no actual input file?如何在没有实际输入文件的情况下直接从 FFmpeg 过滤器生成视频文件?
【发布时间】:2012-07-23 08:05:44
【问题描述】:

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

  • 细胞自动
  • 颜色
  • mptestsrc
  • fei0r_src
  • 生活
  • nullsrc、rgbtestsrc、testsrc

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

类似:

ffmpeg -vf color=red" red_movie.mp4

除了 At least one input file must be specified 出错。

【问题讨论】:

    标签: video ffmpeg


    【解决方案1】:

    虽然在文档中有所暗示,但并未明确说明。我很高兴能弄清楚,所以我想我会分享。

    关键是使用特殊格式lavfi

    Libavfilter 输入虚拟设备。

    此输入设备从 libavfilter 过滤器图的开放输出板读取数据。

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

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

    因此,要制作只有红色的电影,命令是:

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

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

    【讨论】:

    • 实际上,当使用-f lavfi 时,您可以使用完整的过滤器图作为-i 输入。这是一个过滤器链示例:ffmpeg -f lavfi -i life,edgedetect,negate,fade=in:0:100 -frames:v 200 life.mp4
    【解决方案2】:

    在最近的版本中,选项似乎略有变化。

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

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

    【讨论】:

    • 对于那些指定视频分辨率的人:ffmpeg -f lavfi -i testsrc=size=1280x720 -t 30 -pix_fmt yuv420p testsrc.mp4 适合您。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-04-13
    • 1970-01-01
    • 1970-01-01
    • 2016-04-20
    • 2015-01-04
    • 2020-10-12
    • 1970-01-01
    相关资源
    最近更新 更多