我们正在研究一个颜色系统,该系统在红色 (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
创建您的剪辑。