ffmpeg - 高效的命令行来裁剪视频,覆盖另一个裁剪并使用 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 天。你能帮我优化脚本吗?
解决方案
使用裁剪、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
您必须进行试验,看看哪个对您来说最快。
推荐阅读
- docker - 能够在 docker 中使用全局模式扩展容器吗?
- python - 在heroku应用程序上找不到chromedriver错误
- python - 如果Kafka中的消费者关闭,如何在最后一条消费消息之后读取消息?
- mysql - 从 MySQL 中的查询列创建排名列
- java - java - linux串口显示但未打开
- javascript - 当 nodejs 代码中的 res.json() 时得到一个空数组
- javascript - 如何在jquery响应中迭代多个json数据
- php - 从其他数组中获取组合
- orientdb - Orientdb-gremlin 中的多重关系问题
- excel - 如何将一个excel列中的重复项添加到工作表的其余部分?