ffmpeg 中可以进行复杂下拉菜单吗?

ffmpeg 中可以进行复杂下拉菜单吗?

我们正在研究一个颜色系统,该系统在红色 (R) 和绿色 (G) 图片之间交替显示。我们想尝试不同的模式,将该材料带入数字领域。为此,我们想尝试各种下拉序列。

我们希望以 48fps 或 60 fps 进行投影。

  • 每帧三倍:R1 R1 R1 G1 G1 G1
  • 每帧三倍2:R1 G1 R1 G1 R1 G1
  • 插入黑框:R1 R1 R1 G1 G1 G1 BL
  • 插入黑色框2:R1 R1 R1 G1 G1 BL R2 R2 G2 G2 G2 BL
  • 插入黑色框3:R1 G1 BL R2 G2 BL
  • 插入黑色框4:R1 R1 BL G1 G1 BL

...等等

这在 ffmpeg 中可以实现吗?

另一种方法是编写一个简单的脚本来复制和重新编号图像序列。显然,在 ffmpeg 中完成这一切会更快、更简单。

感谢您的帮助。

答案1

这可以在 ffmpeg 中使用一系列过滤器来实现。

有两个考虑因素:

a) 帧数的变化,以及
b) 帧的排序

我们将使用 fps 过滤器来增加帧数。该过滤器将执行常规复制来执行此操作。然后使用 shuffleframes 过滤器来实现所需的序列重排。如果需要,我们还需要 drawbox 过滤器来生成黑帧。这些序列可以以任何帧速率输出。

我们将以 1 fps 的速度摄取每个图像序列,因为这可以使计算更简单。

为了

每帧三倍:R1 R1 R1 G1 G1 G1

ffmpeg -framerate 1 -i frames%04d.jpg -vf "fps=3,settb=AVTB,setpts=N/48/TB" -r 48 -y out.mp4

fps 过滤器用于将每帧的数量增加三倍。由于 fps 过滤器的工作方式,我们需要重置流时间基以获得足够的分辨率以进行下一步。它设置为 AVTB,即1/1000000秒。然后以 1/48 秒的间隔重新编号帧。最后,将输出帧速率设置为 48。

每帧三倍2:R1 G1 R1 G1 R1 G1

ffmpeg -framerate 1 -i frames%04d.jpg -vf "fps=3,shuffleframes=0 3 0 3 0 3,settb=AVTB,setpts=N/48/TB" -r 48 -y out.mp4

每帧的 fps 增加三倍,因此0 3 0 3 0 3使用 R1 和 G1 的第一个副本输出六帧。

插入黑框:R1 R1 R1 G1 G1 G1 BL

ffmpeg -framerate 1 -i frames%04d.jpg -vf "fps=4,shuffleframes=0 0 0 4 4 4 4 -1,drawbox=t=fill:enable=not(mod(n+1\,7)),settb=AVTB,setpts=N/48/TB" -r 48 -y out.mp4

这里我们将每帧放大四倍,然后使用 shuffle 保留每 8 帧中的 7 帧,删除最后一帧。然后使用 drawbox 将enable每 7 帧变为黑色(t=fill绘制一个实心框。默认颜色为黑色)。

插入黑色框2:R1 R1 R1 G1 G1 BL R2 R2 G2 G2 G2 BL

ffmpeg -framerate 1 -i frames%04d.jpg -vf "fps=3,shuffleframes=0 0 3 3 3 3:enable='mod(floor(n/6),2)',drawbox=t=fill:enable=not(mod(n+1\,6)),settb=AVTB,setpts=N/48/TB" -r 48 -y out.mp4

稍微有点棘手。shguffleframes 只需要应用于每组 6 帧。我们使用时间线编辑 ieenable选项来实现这一点。

插入黑色框3:R1 G1 BL R2 G2 BL

ffmpeg -framerate 1 -i frames%04d.jpg -vf "fps=2,shuffleframes=0 2 2 -1,drawbox=t=fill:enable=not(mod(n+1\,3)),settb=AVTB,setpts=N/48/TB" -r 48 -y out.mp4

双倍帧数并保留 3 帧,在第 3 帧上画黑帧并丢弃第 4 帧。

插入黑色框4:R1 R1 BL G1 G1 BL

ffmpeg -framerate 1 -i frames%04d.jpg -vf "fps=3,drawbox=t=fill:enable=not(mod(n+1\,3)),settb=AVTB,setpts=N/48/TB" -r 48 -y out.mp4

很简单。只需将每 3 帧设为黑色即可。

答案2

这不仅是可能的,而且也很简单、高效:使用concat文件

假设你的帧在r1.png, ... g2.png等和 48 Hz(因此 20.8333.. ms 时间基准)连接文件片段

file 'r1.png'
duration 0.0625
file 'g1.png'
duration 0.0625

将产生 3 个红色 1 帧,然后产生 3 个绿色 1 帧(20.8333..*3=62.5)

使用这些片段,你可以构建所需的任何序列,然后运行

ffmpeg -i /path/to/concatfile -c.... /path/to/outfile

创建您的剪辑。

相关内容