如何对文件夹中所有MP4视频文件的时长求和?
如何对提取出的MP4视频时长求和
嘿,我来帮你搞定这个时长求和的问题!你现有的命令已经能成功提取每个MP4文件的时长了,接下来只需要把这些HH:MM:SS.xx格式的字符串转换成可计算的数值,累加后再转回友好的时间格式就行。下面给你两种实用的方案:
方案一:基于你现有命令的awk求和
直接把你当前的输出管道到awk脚本里,就能自动计算总时长:
ls | grep "[.=]mp4"| xargs -n1 ffmpeg -i 2>&1 | grep Duration | cut -d ' ' -f 4 | sed s/,// | awk '{ # 把每个时长按冒号分割成小时、分钟、秒 split($0, time_parts, /:/); # 转换成总秒数累加 total_seconds += time_parts[1]*3600 + time_parts[2]*60 + time_parts[3]; } END { # 把总秒数转回HH:MM:SS.xx格式 hours = int(total_seconds / 3600); remaining = total_seconds % 3600; minutes = int(remaining / 60); seconds = remaining % 60; printf "总时长:%02d:%02d:%06.2f\n", hours, minutes, seconds; }'
脚本说明:
split($0, time_parts, /:/):把每个时长字符串分割成数组,比如00:01:03.96会变成time_parts[1]=00、time_parts[2]=01、time_parts[3]=03.96- 累加时把小时转成3600秒、分钟转成60秒,加上秒数得到总秒数
- 最后通过取整和取余,把总秒数转回时分秒格式,保留两位小数
方案二:更安全的文件遍历(处理含空格的文件名)
你原来用ls + xargs的方式,遇到文件名带空格或特殊字符时会出错。换成find命令更可靠,改进后的完整命令:
find . -maxdepth 1 -type f -name "*.mp4" -exec ffmpeg -i {} 2>&1 \; | grep Duration | cut -d ' ' -f 4 | sed s/,// | awk '{ split($0, t, /:/); total += t[1]*3600 + t[2]*60 + t[3]; } END { h = int(total/3600); m = int((total%3600)/60); s = total%60; printf "总时长:%02d:%02d:%06.2f\n", h, m, s; }'
为什么用find?
-maxdepth 1:只遍历当前目录(如果要递归子目录就去掉这个参数)-exec ffmpeg -i {} 2>&1 \;:对每个找到的MP4文件执行ffmpeg命令,{}会替换成文件名,完美处理含空格的情况
如果只需要总秒数的话,直接在END块里打印total就行,比如print "总秒数:" total;。
内容的提问来源于stack exchange,提问作者Rajat Seeddharth
相关产品推荐
相关产品推荐

