我正在使用 FFMPEG 转码视频,该功能会自动触发。我试图将视频缩小为多种分辨率,同时保持宽高比(缩小以适合)。如果原始视频分辨率小于命令中指定的分辨率,则跳过转码并停止为该特定分辨率创建输出文件。
例如:
我有一个分辨率为 1920x1080 的视频
输出:
- 3840x2160(跳过/停止)
- 2560x1440(跳过/停止)
- 1920x1080(继续输出-1080p.mp4)
- 1280x720(继续输出-720p.mp4)
我尝试了很多命令,但都没有用。请问有没有什么命令可以实现这个功能?
以下是我为 FFMPEG 编写的最新工作命令。抱歉,我对 FFMPEG 还很陌生,我知道当前的命令还远远达不到我想要的效果。
ffmpeg -i sample.mp4 -c:a copy -vf scale='min(2160\,iw):-2' -movflags +faststart out2160.mp4 -vf scale='min(1440\,iw):-2' -movflags +faststart out1440.mp4 -vf scale='min(1080\,iw):-2' -movflags +faststart out1080.mp4 -vf scale='min(720\,iw):-2' -movflags +faststart out720.mp4 -vf thumbnail -vf scale='min(500\,iw):-2' -vframes 1 thumb500.png -vf scale='min(270\,iw):-2' -vframes 1 thumb270.png
如果sample.mp4的分辨率是1920x1080p或者更小,此命令将输出这些文件:
- out2160.mp4
- out1440.mp4
- 出1080.mp4
- out720.mp4
- 拇指500.png
- 拇指270.png
由于我自动触发了 FFMPEG,我希望命令可以比较已设置的分辨率。如果原始视频分辨率较小,则跳过它,没有必要创建或升级大于原始分辨率的文件。仅输出相同或较小的分辨率,同时保持纵横比(缩小以适应)。如果您能指导我,那就太好了,再次感谢。
答案1
这可以通过使用裁剪过滤器来实现,如果裁剪后的输出尺寸大于输入,则该过滤器将失败。如果命令失败,将创建输出文件,但其大小将为 0。
每种变体都需要使用单独的命令进行转换。不能使用单个命令,因为如果其中一个管道发生故障,整个命令都会中止。
裁剪过滤器应按如下方式使用:
ffmpeg -i sample.mp4 -c:a copy -vf crop=iw:'max(ih,2160)',scale=-2:2160 -movflags +faststart out2160.mp4
裁剪宽度与输入宽度相同。裁剪高度设置为输入高度和目标高度的最大值。如果输入高度小于目标高度,裁剪过滤器初始化将失败,命令将中止。如果输入高度等于或大于目标高度,则将整个宽度和高度传递到缩放过滤器。