高效的命令行来裁剪视频,从中覆盖另一个裁剪并使用 ffmpeg 缩放结果

Efficient command line to crop a video, overlay another crop from it and scale the result with ffmpeg

我需要以这样的方式转换许多视频,即我从单个视频的每一帧中截取 2 个不同的裁剪,将它们一个叠加另一个并缩小结果,创建一个新的更小的视频。 我想转换 this fullHD frame (two crop areas are marked red) to this small stacked frame.

现在我使用以下代码:

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 天。你能帮我优化脚本吗?

使用裁剪、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

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