MLT,时变作物

MLT, time varying crop

我想做的是拍摄一个 16:9 纵横比的视频,然后通过裁剪生成另一个 1:1 纵横比的视频,这样裁剪区域会随时间变化。例如,假设源是 1920x1080:

最终以给定分辨率(比如 640x640)生成具有 1:1 纵横比的视频。

ffmpeg 可以静态地执行此操作(即 vf crop=x:y:w:h,scale=640x640),但我正在寻找一种方法来执行此操作,以便裁剪出的部分有所不同。本质上,我希望调整宽屏视频以便在 google 硬纸板(和类似的)上观看。

这对 mlt 来说简单吗?到目前为止,我已经尝试附加一个仿射过滤器,设置 transition.geometry,但我对我正在使用的坐标感到困惑(我想根据哪个源坐标映射到极端 left/right 来指定事物).

仿射过滤器是一个很好的方法。

这是一个例子:

echo "
description=Square
frame_rate_num=24
frame_rate_den=1
width=640
height=640
progressive=1
sample_aspect_num=1
sample_aspect_den=1
display_aspect_num=1
display_aspect_den=1
colorspace=708
" > square_profile.txt

melt -profile ./square_profile.txt clip.mp4 -filter affine transition.geometry="0=0,0:1138x640; 720=-498,0:1138x640"

示例假设:

  • clip.mp4 是 16x9 源(1920x1080 也可以)
  • 剪辑长 720 帧(例如,30 秒,24 帧/秒)

让我为您分解示例。

第一部分指定了一个 640x640 且具有正方形宽高比的自定义配置文件。您不需要每次都创建文件。您可以根据自己的规格对其进行自定义。

-profile ./square_profile.txt

这会告诉 melt 使用您的自定义配置文件。

transition.geometry= ...

这就是您告诉仿射转换(仿射过滤器在内部使用的)您想要它做什么的方式。每个几何条目的第一个数字是它适用的帧号。过滤器将在帧之间插入值。几何条目的语法是:"K=X,Y:WxH" 其中 "K" 是应用几何的关键帧。

0=0,0:1138x640

第一个几何条目告诉仿射过滤器将图像缩放到 1138x640 并将图像定位在 0,0。

640 是输出的高度 - 告诉仿射将原始图像缩放到 640 的高度以填充输出帧。 1138 是 640 像素高的 16x9 图像的宽度。 1138 比输出图像宽。由于我们指定图像位于 0,0,因此图像的右侧部分将被仿射滤镜裁剪掉。

720=-498,0:1138x640

第二个几何条目告诉仿射过滤器保持相同的缩放比例,但将图像定位在 -498 的 x 位置。 489 = 1138 - 640。也就是说,第一帧中从图像中裁剪掉的像素数。负片告诉仿射将图像定位到输出帧的左侧,以便裁剪掉图像的左侧部分。 “720=”指定这是第 720 帧的几何图形。

0 到 720 之间的所有帧的 x 位置将由仿射过滤器自动插值。所以你会看到图像在播放时从左到右滚动。

您可以向几何图形添加更多关键帧,使其在特定位置暂停或来回移动。仿射过渡(仿射过滤器使用的)还有其他有趣的操作,如镜像和循环。您可以在此处查看完整文档: http://www.mltframework.org/bin/view/MLT/TransitionAffine#scale