如何使用FFmpeg批量调整嵌套文件夹中视频的自适应尺寸(按宽高比缩放)
如何使用FFmpeg批量调整嵌套文件夹中视频的自适应尺寸(按宽高比缩放)
我明白你要的是那种自适应宽高比的缩放——不管视频是横屏还是竖屏,都把最长边缩到指定尺寸,短边按比例自动适配,同时还要批量处理嵌套文件夹里的所有视频,处理完删掉原文件对吧?我来帮你一步步解决这些问题:
一、先修正你的CMD命令问题
你原来的命令有几个小错误,我先帮你改过来,同时调整缩放逻辑到你想要的效果:
1. 错误点说明
- 变量引用错误:你用了
%~f,但循环变量是%i,正确的完整路径引用应该是%~fi - 缩放滤镜不符合需求:原来的
scale='min(300,iw)':'min(300,ih)'会把视频强制缩到300x300的正方形,完全破坏比例,这和你要的ImageMagick300x300^>效果不符 - 文件名后缀逻辑:用时间戳不如直接加个清晰的后缀(比如
_scaled),更容易识别
2. 修正后的CMD命令(直接在CMD窗口运行)
FOR /R %i in (*.mp4) DO ( ffmpeg -i "%~fi" -vf "scale='w=if(gt(iw/ih,1),300,-1):h=if(gt(iw/ih,1),-1,300)'" -preset veryfast "%~dpni_scaled%~xi" IF %errorlevel% EQU 0 del /q "%~fi" )
命令解释
FOR /R %i in (*.mp4):递归遍历当前目录及所有子文件夹里的MP4文件ffmpeg的scale滤镜:判断视频宽高比,如果是横屏(宽>高)就把宽度缩到300,高度自动按比例计算;如果是竖屏(高>宽)就把高度缩到300,宽度自动适配,完美保持原比例"%~dpni_scaled%~xi":生成带_scaled后缀的输出文件,和原文件在同一目录(%~dp是原文件的路径,%~n是原文件名,%~x是原扩展名)IF %errorlevel% EQU 0 del /q "%~fi":只有当FFmpeg转换成功(错误码为0)时,才删除原文件,避免转换失败丢失视频
如果是写成批处理文件(.bat),记得把所有%i改成%%i,比如:
@echo off FOR /R %%i in (*.mp4) DO ( ffmpeg -i "%%~fi" -vf "scale='w=if(gt(iw/ih,1),300,-1):h=if(gt(iw/ih,1),-1,300)'" -preset veryfast "%%~dpni_scaled%%~xi" IF %%errorlevel%% EQU 0 del /q "%%~fi" )
二、PowerShell版本方案
如果你更习惯用PowerShell,这个脚本同样能实现需求:
Get-ChildItem -Path . -Filter *.mp4 -Recurse | ForEach-Object { $outputPath = Join-Path $_.DirectoryName ($_.BaseName + "_scaled" + $_.Extension) ffmpeg -i $_.FullName -vf "scale='w=if(gt(iw/ih,1),300,-1):h=if(gt(iw/ih,1),-1,300)'" -preset veryfast $outputPath if ($LASTEXITCODE -eq 0) { Remove-Item $_.FullName -Force } }
三、Git Bash(WSL)版本方案
如果用Git Bash或者Linux环境,用find命令递归处理:
find . -type f -name "*.mp4" | while read -r file; do output="${file%.*}_scaled.${file##*.}" ffmpeg -i "$file" -vf "scale='w=if(gt(iw/ih,1),300,-1):h=if(gt(iw/ih,1),-1,300)'" -preset veryfast "$output" if [ $? -eq 0 ]; then rm -f "$file" fi done
重要提醒
- 先测试单个文件:先拿一个视频单独用FFmpeg命令测试,确认缩放效果符合预期后再批量处理
- 备份重要视频:虽然加了错误判断,但还是建议先备份原视频,避免意外情况
- FFmpeg路径:确保FFmpeg已经添加到系统环境变量里,或者用完整路径调用(比如
C:\ffmpeg\bin\ffmpeg.exe)
备注:内容来源于stack exchange,提问作者cudnn_account
相关产品推荐
相关产品推荐

