使用 ffmpeg 平铺一组图像并在它们之间 pan/scroll
Tile a set of images and pan/scroll across them using ffmpeg
我有一组非常大的图像,我想使用 ffmpeg 水平平铺和平移这些图像。
图像比较大,可以使用 magick 创建:
magick convert -compress lzw -size 90000x800 xc:"rgb(160,160,255)" test001.tif
... and so on
我最熟悉的命令如下:
ffmpeg -loop 1 -i test%03d.tif -vf "tile=4x1,scroll=horizontal=0.05,crop=800:600:0:0,format=yuv420p" -t 10 output.mp4
上述命令的问题:
- 它非常非常慢 (0.3 frames/sec)
- 动画循环是因为我选择了任意 10 秒的持续时间(不确定如何让它在图像结束时停止)
- 高内存使用率,我不确定 ffmpeg 是否先创建平铺图像,然后再处理视频,或者是否有办法只访问每一帧所需的 tiff 区域
任何关于如何 scroll/pan 跨越多个输入图像的指示将不胜感激!
从 90000x800 图像(数百张)开始,使用 1 fps 的输入帧率(为了便于演示),让 M = 90000
第 1 步:tile=2x1:overlap=1
将下一张图片附加到上一张图片:[Img1|Img2]、[Img2|Img3]、[Img3|Img4]...
第 2 步:fps=N
通过将每个平铺帧重复 N
次
将帧速率提高到 N
fps
第 3 步:crop=w=1280:h=800:x=mod(n,N)*M/N:y=0
将当前视频帧定位在图像上,然后裁剪掉其余部分。在第 n=N 帧上,将设置下一对图像,以便将帧位置重置为 0。
ffmpeg -r 1 -i test%03d.tif \
-vf 'tile=2x1:overlap=1, \
fps=N, \
crop=w=1280:h=800:x=mod(n,N)*M/N:y=0' \
-pix_fmt yuv420p output.mp4
选择你的 N
号码并用实际数字替换符号,你应该准备好滚动(我希望......)
可是现在,你怎么挑N
?这将取决于您的 input 帧速率(初步设置为 1)、所需的 output 帧速率以及图像过渡时间。 ..
假设您希望每个图像在屏幕上停留 2 秒并且输出帧速率为 30 fps,则每个图像应出现在 2*30=60 帧上。因此,设置 N = 60 和输入帧速率 30/60 = 0.5.
我还没有测试过这个命令,所以试一试,如果不工作,我很乐意解决问题。另外,我很好奇它是否相当快。
===============================
更新:请求将输入更改为 800x800 图像而不是 90000x800。
改变tile
和crop
如下:
ffmpeg -r 1 -i test%03d.tif \
-vf 'tile=3x1:overlap=2, \
fps=N, \
crop=w=1280:h=800:x=mod(n,N)*800/N:y=0' \
-pix_fmt yuv420p output.mp4
另外 N
需要重新调整 Nnew = 800/90000 * N
左右。
我有一组非常大的图像,我想使用 ffmpeg 水平平铺和平移这些图像。
图像比较大,可以使用 magick 创建:
magick convert -compress lzw -size 90000x800 xc:"rgb(160,160,255)" test001.tif
... and so on
我最熟悉的命令如下:
ffmpeg -loop 1 -i test%03d.tif -vf "tile=4x1,scroll=horizontal=0.05,crop=800:600:0:0,format=yuv420p" -t 10 output.mp4
上述命令的问题:
- 它非常非常慢 (0.3 frames/sec)
- 动画循环是因为我选择了任意 10 秒的持续时间(不确定如何让它在图像结束时停止)
- 高内存使用率,我不确定 ffmpeg 是否先创建平铺图像,然后再处理视频,或者是否有办法只访问每一帧所需的 tiff 区域
任何关于如何 scroll/pan 跨越多个输入图像的指示将不胜感激!
从 90000x800 图像(数百张)开始,使用 1 fps 的输入帧率(为了便于演示),让 M = 90000
第 1 步:tile=2x1:overlap=1
将下一张图片附加到上一张图片:[Img1|Img2]、[Img2|Img3]、[Img3|Img4]...
第 2 步:fps=N
通过将每个平铺帧重复 N
次
N
fps
第 3 步:crop=w=1280:h=800:x=mod(n,N)*M/N:y=0
将当前视频帧定位在图像上,然后裁剪掉其余部分。在第 n=N 帧上,将设置下一对图像,以便将帧位置重置为 0。
ffmpeg -r 1 -i test%03d.tif \
-vf 'tile=2x1:overlap=1, \
fps=N, \
crop=w=1280:h=800:x=mod(n,N)*M/N:y=0' \
-pix_fmt yuv420p output.mp4
选择你的 N
号码并用实际数字替换符号,你应该准备好滚动(我希望......)
可是现在,你怎么挑N
?这将取决于您的 input 帧速率(初步设置为 1)、所需的 output 帧速率以及图像过渡时间。 ..
假设您希望每个图像在屏幕上停留 2 秒并且输出帧速率为 30 fps,则每个图像应出现在 2*30=60 帧上。因此,设置 N = 60 和输入帧速率 30/60 = 0.5.
我还没有测试过这个命令,所以试一试,如果不工作,我很乐意解决问题。另外,我很好奇它是否相当快。
===============================
更新:请求将输入更改为 800x800 图像而不是 90000x800。
改变tile
和crop
如下:
ffmpeg -r 1 -i test%03d.tif \
-vf 'tile=3x1:overlap=2, \
fps=N, \
crop=w=1280:h=800:x=mod(n,N)*800/N:y=0' \
-pix_fmt yuv420p output.mp4
另外 N
需要重新调整 Nnew = 800/90000 * N
左右。