我想做的是以16:9的宽高比拍摄视频,并通过裁剪以1:1的宽高比生成另一个视频,以使裁剪区域随时间变化。例如,假设source是1920x1080:
最终以给定的分辨率(例如640x640)生成宽高比为1:1的视频。
ffmpeg可以静态地执行此操作(即,vf crop = x:y:w:h,scale = 640x640),但我正在尝试执行此操作以使裁剪的部分发生变化。基本上我希望适应宽屏视频在谷歌纸板(和类似的)上观看。
mlt是否直截了当?到目前为止,我已经尝试附加仿射过滤器,设置transition.geometry,但我对我正在使用的坐标感到困惑(我想根据哪个源坐标映射到极左/右)。
答案 0 :(得分: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"
该示例假定:
让我为你分解一下这个例子。
第一部分指定一个640x640的自定义配置文件,并具有方形宽高比。您不需要每次都创建该文件。您可以根据您的规格进行自定义。
-profile ./square_profile.txt
这告诉mel使用您的自定义配置文件。
transition.geometry= ...
这就是你如何告诉仿射转换(仿射过滤器在内部使用)你想要它做什么。每个几何条目的第一个数字是它适用的帧编号。过滤器将在帧之间插值。几何条目的语法是:" K = X,Y:WxH"在哪里" K"是几何体适用的关键帧。
0=0,0:1138x640
第一个几何条目告诉仿射滤镜将图像缩放到1138x640并将图像定位在0,0。
640是输出的高度 - 告诉仿射将原始图像缩放到640的高度以填充输出帧。 1138是16×9图像的宽度,其为640像素高。 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