我正在尝试根据视频的纵横方向将一组视频的大小调整为最小宽度或高度,因此,如果视频是 1920x1080,我希望将其缩小到 960x540,但如果是 1080x1920,则输出应该是 540x960。
我的文件夹结构如下:
根目录: 子文件夹1: 文件4 文件5 子文件夹2: 文件6 文件1 文件2 文件3
我已经尝试使用命令行进行递归,但在检查基本思想是否有效之前,我遇到了文件错误:
FOR /R %i in (*.mp4) DO ffmpeg -i "%~f" -vf "scale='min(300,iw)':'min(300,ih)'" -preset veryfast "%~nf~tf" del /q "%~f"
我希望缩放后的文件与它们的输入放在同一个目录中,并且完成后必须删除输入,但我不知道如何在文件名中添加简单的词缀,所以我按照我在谷歌上找到的方法,即添加一个时间戳~tf
当我跑线时我得到了
%~f: No such file or directory
更大的问题是,我不确定转换是否会保持我所述的纵横比(我不希望将 1000x600 的视频缩小到 300x300,我希望将其缩小到 500x300 --- 并且 600x1000 的视频应该缩小到 300x500,基本上就是 -resize“300x300^>”选项在 imagemagick 中可以实现的功能)
我现在正在使用 cmd,但也欢迎使用 git bash 或 powershell 的解决方案
编辑:我忘了说了,调整大小完成后,我还需要删除输入的视频
答案1
这个 PowerShell 命令应该对你有用:
Get-ChildItem -Filter *.mp4 -Recurse | % { ffmpeg -i $_.FullName -vf "scale='if(gt(ih,iw),300,-2)':'if(gt(iw,ih),300,-2)'" "$($_.FullName)_scaled.mp4" }
第一部分获取.mp4
当前目录和子目录中的所有文件(-Recurse
)。然后它将所有结果导入ForEach-Object
(%
)并使用所选命令进行处理。
ffmpeg 命令将文件名作为输入 ( $_.FullName
),然后应用视频过滤器检查哪个尺寸更大。如果高度 ( ih
) 大于宽度 ( iw
),则我们将宽度缩小到300
,否则我们保留纵横比和可被 2 整除的尺寸 ( -2
)。第二个条件基本上是相反的。最后我们将输出保存为[initial_name]_scaled.mp4
。