我用FFMPEG压缩视频,方法是用FOR LOOP批量编写一行代码。压缩后,我想删除原始文件。
这段代码完美地完成了压缩工作,但原始文件没有被删除:
for %%i in (*.mp4) do ffmpeg -i "%%i" -vcodec libx265 -crf 28 "%%~ni"-small.mp4&&del "%%i"
pause
我错过了什么?
顺便说一句,对于任何类型的教育视频、教程等,这都是一个近乎完美的压缩比,它们占据了你的硬盘。
我认为这种方法会为您提供更好的服务:
@For /F "EOL=? Delims=" %%G In ('Dir /B /A:-D "*.mp4" ^| ^
"%__AppDir__%findstr.exe" /IR ".mp4$" ^| ^
"%__AppDir__%findstr.exe" /IRV "-small.mp4$"'
) Do @If Not Exist "%%~nG-small%%~xG" (
ffmpeg.exe -i "%%G" -vcodec libx265 -crf 28 "%%~nG-small%%~xG"
If Not ErrorLevel 1 If Exist "%%~nG-small%%~xG" Del /A /F "%%G")
其想法是获得一个目录列表,列出所有扩展名为.mp4
的文件。使用第一个findstr
排除与短名称(8.3(匹配的任何文件。然后,它将这些文件通过另一个findstr
搜索进行管道传输,以排除任何已经在其基本名称后附加了-small
的文件。接下来,它会进行检查,以确保该目录中没有现有文件,具有相同的基名称加上-small
基名称后缀(防止可能的覆盖(。如果所有这些都通过了,则应调用ffmpeg.exe
,(前提是ffmpeg.exe
在当前目录中,在%PATH%
中,或在注册表中注册为可执行文件(。转换完成后,脚本将检查返回的ErrorLevel
是否小于1
,(以确保成功(,如果是,则检查新文件是否存在(带有-small
基名后缀(。如果是,它将使用Del
命令继续删除。
如果你想再次尝试使用条件运算符而不是ErrorLevel,那么它看起来像这样:
@For /F "EOL=? Delims=" %%G In ('Dir /B /A:-D "*.mp4" ^| ^
"%__AppDir__%findstr.exe" /IR ".mp4$" ^| ^
"%__AppDir__%findstr.exe" /IRV "-small.mp4$"'
) Do @If Not Exist "%%~nG-small%%~xG" (
ffmpeg.exe -i "%%G" -vcodec libx265 -crf 28 "%%~nG-small%%~xG" && (
If Exist "%%~nG-small%%~xG" Del /A /F "%%G"))
我只是把'/f'放在DEL之后,它就完美地完成了任务。我不知道强制删除是否有任何缺点,但它是有效的。
最后一行:
for %%i in (*.mp4) do ffmpeg -i "%%i" -vcodec libx265 -crf 28 "%%~ni"-small.mp4&&del /f "%%i"
pause