You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何对文件夹中所有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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.26 10:45:08