1

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

  • 第 0 帧裁剪 x 从 0 到 1080
  • 第 200 帧裁剪 x 从 240 到 1080+240
  • 框架350-380平滑滑动

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

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

这对mlt来说很简单吗?到目前为止,我已经尝试附加仿射过滤器,设置transition.geometry,但我对我正在使用的坐标感到困惑(我想指定哪些源坐标映射到极左/极右)。

4

1 回答 1

3

仿射滤波器是一种很好的方法。

这是一个例子:

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 帧(例如 24 fps 时为 30 秒)

让我为你分解这个例子。

第一部分指定一个 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

于 2016-02-17T23:04:30.283 回答