如何在ffmpeg中使用单个图像输入来使用时间轴编辑?

时间:2017-09-29 07:20:56

标签: animation ffmpeg

小图像应以简单的方式在背景视频上进行动画处理:

  1. 改变位置 - 沿着直线移动,没有缓和。从第A帧开始,直到第B帧(即第11至31帧);
  2. 放大 - 在帧C和D之间(即45和55)。
  3. 我打算使用的过滤器:

    • overlay过滤器具有图像位置的x和y参数;
    • zoompan过滤器允许缩放(在静态缩放之前,以避免抖动)。

    我的过滤器图:

    video.avi >----------------------------------->|-------|
                                                   |overlay|-> out.mp4
    image.png >-> scale >-> zoompan >-> zoompan >->|-------|
    

    问题timeline editing。这两个过滤器都支持enable选项。我想我可以添加像enable='between(n, 11, 31)'这样的说明,以便在适当的时间“放置”动画。

    显示图像输入只有两个值n:0和1.通过在n过滤器中将print(n)包裹zoompan并在渲染过程中输出来检查。

    overlay内部过滤器中,相反,n按预期输出数字序列。

    问题:如何将单张图像输入“看起来”像普通视频流到ffmpeg过滤器 - 这样每个生成的帧都有其唯一的数字?

    最新测试之一。视频为hd720,图像为1000x200透明png,徽标占据中心约150x50区域,放大时不会被裁剪掉。

    ffmpeg -i $FOOTAGE -loop 1 -i $IMAGE -filter_complex \
    "
    [1:v]
      scale=10*iw:-2
      ,zoompan=
        z='1'
        :x='iw/2-(iw/zoom/2)+80'
        :y='ih/2-(ih/zoom/2)'
        :d=26
        :s=500x100
        :enable='lt(print(n),24)'
      ,zoompan=
        z='min(zoom+1.3/18,2.3)'
        :x='iw/2-(iw/zoom/2)'
        :y='ih/2-(ih/zoom/2)'
        :d=20
        :s=500x100
        :enable='between(n,24,42)'
    [name];
    [0:v][name]
      overlay=
        x=1005-250
        :y=406-50
        :enable='lte(n,173)'
    " -t 7 -y  -hide_banner  out.mp4
    

1 个答案:

答案 0 :(得分:2)

Appearszoompan过滤器支持时间轴编辑。在2017年8月27日的提交aa26258f中,这已在ffmpeg中更新,并且不再将zoompan列为启用时间轴的过滤器。

解决方法是编写依赖于in"输入帧数"的表达式。变量和输出所需的缩放系数。