Batch脚本如何计算两个时间变量差值自动获取ffmpeg处理时长
解决方案
原生Windows批处理不支持浮点数运算,可以通过将HH:MM:SS.sss格式时间统一转换为毫秒做整数运算,再拼接为带小数的秒数传入ffmpeg,全程不需要依赖第三方工具,可直接替换原有脚本。
修改后可直接运行的完整脚本
@echo off :: #################### 仅需修改此处配置即可 #################### set "start=00:01:52.000" set "finish=00:02:16.000" set /A resolution=1080 set /A framerate=60 set /A filesizeinMB=8 :: ########################################################### :: 自动计算剪辑时长 call :time_to_ms %start% start_ms call :time_to_ms %finish% finish_ms set /A duration_ms=finish_ms - start_ms set /A duration_sec_int=duration_ms / 1000 set /A duration_ms_part=duration_ms %% 1000 :: 毫秒部分补前导零,保证3位长度 if %duration_ms_part% lss 100 set "duration_ms_part=0%duration_ms_part%" if %duration_ms_part% lss 10 set "duration_ms_part=0%duration_ms_part%" set "duration=%duration_sec_int%.%duration_ms_part%" :: 按原逻辑计算码率 set /A bitrate=(%filesizeinMB%*8192)/%duration_sec_int% :: VP9两遍编码 "%~dp0ffmpeg.exe" -ss %start% -i "%~1" -c:v libvpx-vp9 -an -pass 1 ^ -t %duration% -b:v %bitrate%k -crf 12 -vf fps=%framerate%,scale=-1:%resolution% ^ -auto-alt-ref 1 -lag-in-frames 25 -row-mt 1 -map_metadata -1 ^ -f null NUL "%~dp0ffmpeg.exe" -ss %start% -i "%~1" -c:v libvpx-vp9 -an -pass 2 ^ -t %duration% -b:v %bitrate%k -crf 12 -vf fps=%framerate%,scale=-1:%resolution% ^ -auto-alt-ref 1 -lag-in-frames 25 -row-mt 1 -map_metadata -1 ^ -f webm "%~dp0%~n1.webm" pause exit /b :: 子函数:将HH:MM:SS.sss格式时间转换为毫秒值 :time_to_ms for /f "tokens=1-4 delims=:." %%h in ("%~1") do ( set /a h=%%h, m=%%i, s=%%j, ms=%%k ) :: 毫秒不足3位时补前导零,避免计算错误 if %ms% lss 100 set "ms=0%ms%" if %ms% lss 10 set "ms=0%ms%" set /a %~2=h*3600000 + m*60000 + s*1000 + ms exit /b
核心逻辑说明
- 利用
for /f的分隔符解析能力,以:和.作为分割标记,把输入的时间字符串拆分为小时、分钟、秒、毫秒4个独立整数值 - 所有时间统一转换为毫秒做减法,完全规避批处理不支持浮点数运算的缺陷,计算精度和输入时间的毫秒级精度对齐
- 最终把毫秒差值拆分为整数秒和小数毫秒两部分,拼接为ffmpeg支持的小数格式时长参数,和原有脚本的参数逻辑完全兼容
使用注意事项
- 输入的
start和finish必须严格遵循HH:MM:SS.sss格式,不足位数的部分补前导零,例如5分3秒25毫秒需写为00:05:03.025 - 修正了原脚本中变量赋值把引号写入变量值的写法问题,避免ffmpeg识别参数时报错
- 码率计算沿用原脚本的整数运算逻辑,使用时长整数部分计算,不会出现码率偏差
内容的提问来源于stack exchange,提问作者Youcef
相关产品推荐
相关产品推荐

