共计 2247 个字符,预计需要花费 6 分钟才能阅读完成。
下载了一些视频,感觉默认有点大,于是准备使用 ffmpeg 进行压缩,用了如下命令感觉效果还不错。
ffmpeg -i input.mp4 -c:v libx264 -crf 23 -preset medium -c:a aac -b:a 128k output.mp4
但是需要压缩的视频有点多,并且我的视频是分类好的,不想压缩的时候整到一个文件夹去到时候又要分文件夹,所以借助 gpt 写出了此脚本,不得不说虽然有 gpt 还是踩坑不少的。
这个脚本能保证原来的目录结构,只需要指定输出目录即可。
@echo off
chcp 65001 > nul
setlocal enabledelayedexpansion
rem 设置 ffmpeg 路径、需要压缩的文件目录,输出文件目录
set "ffmpeg_path=D:\soft\ffmpeg\bin\ffmpeg.exe"
set "input_dir=E:\test3"
set "output_root_dir=E:\Compress"
for /r "%input_dir%" %%F in (*.mp4) do (
set "input_file=%%F"
echo 待压缩文件: !input_file!
call set "output_file=!input_file:%input_dir%=%output_root_dir%!"
rem echo 压缩后文件: !output_file!
for %%I in ("!output_file!") do set "output_dir=%%~dpI"
rem echo 输出目录: !output_dir!
mkdir "!output_dir!" 2>nul
rem 检查输入文件是否存在
if exist "!output_file!" (
rem 调用函数比较输入文件和输出文件的时长
echo 输出文件已存在: !output_file!
call :compare_durations "!input_file!" "!output_file!"
)else (
call :compress_file "!input_file!" "!output_file!"
)
echo "================================分隔符================================"
)
echo 脚本执行完成!!!!!按任意键退出.
pause
rem 方法===比较视频时长
:compare_durations
set "input_file=%~1"
set "output_file=%~2"
rem 获取输入文件、输出文件的时长
for /F "delims=" %%A in ('%ffmpeg_path% -i "!input_file!" 2^>^&1 ^| findstr /C:"Duration"') do (
set "input_duration=%%A"
)
for /F "delims=" %%B in ('%ffmpeg_path% -i "!output_file!" 2^>^&1 ^| findstr /C:"Duration"') do (
set "output_duration=%%B"
)
for /F "tokens=2 delims= " %%C in ("!input_duration!") do (
set "input_duration=%%C"
)
for /F "tokens=2 delims= " %%D in ("!output_duration!") do (
set "output_duration=%%D"
)
rem 忽略毫秒级别比较
for /F "tokens=1 delims=." %%F in ("!input_duration!") do (
set "input_duration=%%F"
)
for /F "tokens=1 delims=." %%G in ("!output_duration!") do (
set "output_duration=%%G"
)
rem 比较输入文件和输出文件的时长
rem echo "%input_file%" 时长 ==== "!input_duration!"
rem echo "%output_file%" 时长 ==== "!output_duration!"
if "!input_duration!" neq "!output_duration!" (
echo 时长不一致,重新压缩文件...
call :compress_file "!input_file!" "!output_file!"
) else (
echo 时长一致,无需重新压缩文件.
)
goto :eof
rem 方法===压缩文件
:compress_file
set "input_file=%~1"
set "output_file=%~2"
echo 正在压缩文件: !input_file! 请稍等...
"%ffmpeg_path%" -loglevel quiet -i "!input_file!" -c:v libx264 -crf 23 -preset medium -c:a aac -b:a 128k "!output_file!" -y -progress progress.txt 2>&1 | findstr "time=" > con
echo 压缩完成,输出文件为: !output_file! 请稍等...
call :compare_durations "!input_file!" "!output_file!"
goto :eof
执行效果:
如图,已经压缩过的文件如果时长一致,则不进行再次压缩浪费时间;如果时长不一致,那么要进行压缩然后覆盖;如果没有压缩过的文件,直接进行压缩,压缩完再对比时长。
提醒:本文发布于443天前,文中所关联的信息可能已发生改变,请知悉!
AD:【腾讯云服务器大降价】2核4G 222元/3年 1核2G 38元/年
正文完