当我尝试从16:9更改为9:16时,我在使用fluent-ffmpeg更改16:9、1:1和9:16之间的宽高比时遇到了麻烦,我有点收到压缩视频,但实际上我希望删除额外的部分。
我尝试了许多组合:FFmpeg() .input(video) .size("608x?") .aspect("9:16") .output(tempFile) .run();
我的输入16:9视频1920x1080
。
我的预期结果9:16视频608x1080
当我尝试从16:9更改为9:16时,我在使用fluent-ffmpeg更改16:9、1:1和9:16之间的宽高比时遇到了麻烦,我有点收到压缩视频,但实际上我希望删除额外的部分。
我尝试了许多组合:FFmpeg() .input(video) .size("608x?") .aspect("9:16") .output(tempFile) .run();
我的输入16:9视频1920x1080
。
我的预期结果9:16视频608x1080
3条答案
按热度按时间8hhllhi21#
我带来的最佳解决方案:
由于
fluent-ffmpeg
不提供任何内置的方法来裁剪和缩放视频,这就是为什么我们需要自己实现它。第一步:
我们需要计算一个中间裁剪分辨率,以通过裁剪多余部分(横向到纵向)或添加黑条(纵向到横向)来实现目标纵横比,以避免视频的挤压或拉伸。
注:
我们也可以添加一个很好的模糊效果的情况下,肖像景观,但这将增加一个额外的步骤(ffmpeg模糊过滤器所需)。
第二步:
我们将简单地缩放到目标分辨率。
代码看起来太长了,但是相信我,它很简单,并且被分成了方法。从底层开始理解它。
如果您想要
JavaScript
版本,请忽略types
。只需运行此代码,它将为您裁剪/缩放单个视频。
dfuffjeb2#
添加到上面的解决方案,我不是一个巨大的风扇。
下面的例程尝试模拟 object-fit:contain CSS裁剪和调整大小。这首先计算出中间调整大小步骤需要什么大小来保持纵横比并提供必要的宽度和高度来裁剪到所需的输出,然后对结果运行视频过滤器裁剪,只拉取所需的输出尺寸。
我还使用
temp
npm包在系统临时文件夹中生成空文件,这些文件将用作ffmpeg
的输出文件目的地。rkkpypqq3#
我觉得其他的答案让事情变得比需要的更复杂。
正如其他人所说,没有办法只直接输入高宽比,所以你应该在裁剪前找到想要的尺寸。
下面的代码使用
ffprobe
获取视频尺寸,并找到具有所需纵横比的选定视频的最大可能大小。在本例中,它将获得6:9纵横比的最大文件尺寸。
输出:
之后,只需将视频裁剪为您获得的尺寸。