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

时间:2018-05-26 00:10:45

标签: ffmpeg overlay crop

我需要以这样一种方式转换许多视频:我从一个视频的每个帧中获取2个不同的作物,将它们叠加在另一个上并缩小结果,创建一个新的较小的视频。 我想将this fullHD frame(两个裁剪区域标记为红色)转换为此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天。你能帮我优化脚本吗?

1 个答案:

答案 0 :(得分:0)

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

你必须进行试验,看看哪种方法最快。