首页 > 解决方案 > 高效的命令行来裁剪视频,覆盖另一个裁剪并使用 ffmpeg 缩放结果

问题描述

我需要以这样一种方式转换许多视频,即从单个视频的每一帧中获取 2 种不同的裁剪,将它们堆叠在一起并缩小结果,创建一个新的更小的视频。我想将这个全高清帧(两个裁剪区域标记为红色)转换为这个小的堆叠帧

现在我使用以下代码:

ffmpeg  -i "video.mkv" -filter:v "crop=560:416:0:0" out1.mp4
ffmpeg  -i "video.mkv" -filter:v "crop=560:384:1060:128" out2.mp4
ffmpeg  -i out1.mp4 -vf "movie=out2.mp4[inner]; [in][inner] overlay=0:32,scale=280:208[out]"  -c:v libx264 -preset veryfast -crf 30 result.mp4

它可以工作,但效率很低,并且需要临时文件(out1 和 out2)。问题是我有超过 100.000 个这样的视频(它们很大并且存储在 NAS 上,而不是直接存储在我计算机的硬盘上)。使用 Windows 批处理脚本(for 循环)将它们全部转换需要...48 天。你能帮我优化脚本吗?

标签: ffmpegoverlaycrop

解决方案


使用裁剪、vstack、缩放和格式过滤器:

ffmpeg -i input.mkv -filter_complex "[0:v]crop=560:24:0:0[top];[0:v]crop=560:384:1076:128[bottom];[top][bottom]vstack,scale=280:-2[out]" -map "[out]" -c:v libx264 -preset veryfast -crf 30 -movflags +faststart result.mp4

如果您想使其复杂化以加快过滤速度(也许),那么您可以先尝试缩放:

ffmpeg -i input.mkv -filter_complex "[0:v]scale=iw/2:-1,split[v0][v1];[v0]crop=560/2:24/2:0:0[top];[v1]crop=560/2:384/2:1076/2:128/2[bottom];[top][bottom]vstack[out]" -map "[out]" -c:v libx264 -preset veryfast -crf 30 -movflags +faststart result.mp4

您必须进行试验,看看哪个对您来说最快。


推荐阅读