如何计算FFmpeg时间格式下的视频时长中点?
如何计算FFmpeg时长格式的中点时刻
哈哈,这个坑我之前踩过!直接把时、分、秒分别除以2肯定会出问题,因为时间是60进制的,不是我们熟悉的10进制——比如你说的0:01:00,直接把分除以2得到0.5分,这没法直接对应成秒数对吧?正确的思路是先统一转换成总秒数计算,再转回时间格式,具体步骤如下:
核心步骤
1. 将HOURS:MM:SS格式转成总秒数
把时、分、秒按60进制规则转换成累计的秒数,公式很简单:
总秒数 = 小时数 × 3600 + 分钟数 × 60 + 秒数
举个例子:
- 对于
0:01:00:总秒数 = 0×3600 + 1×60 + 0 = 60秒 - 对于
1:23:45:总秒数 = 1×3600 + 23×60 + 45 = 5025秒
2. 计算中点秒数
直接把总秒数除以2就行,如果需要整数秒,可以根据需求取整(比如四舍五入或者向下取整):
中点秒数 = 总秒数 ÷ 2
例子:
0:01:00的中点秒数:60÷2 = 30秒1:23:45的中点秒数:5025÷2 = 2512.5秒(如果要整数可以取2512或2513)
3. 将中点秒数转回HOURS:MM:SS格式
把计算出的中点秒数再按60进制拆分回时、分、秒:
- 小时数 = 中点秒数 ÷ 3600(取整数部分)
- 剩余秒数 = 中点秒数 % 3600(取余)
- 分钟数 = 剩余秒数 ÷ 60(取整数部分)
- 秒数 = 剩余秒数 % 60(可以保留小数或取整)
例子:
- 30秒转回去:0小时,0分钟,30秒 →
0:00:30 - 2512.5秒转回去:0小时,41分钟,52.5秒 →
0:41:52.5
实用代码示例
Python实现
如果你用Python处理,可以写个小函数一键计算:
def get_video_midpoint(time_str): # 忽略微秒,只取时分秒部分 time_part = time_str.split('.')[0] h, m, s = map(float, time_part.split(':')) total_sec = h * 3600 + m * 60 + s mid_sec = total_sec / 2 # 转换回时分秒格式 mid_h = int(mid_sec // 3600) remaining = mid_sec % 3600 mid_m = int(remaining // 60) mid_s = remaining % 60 # 格式化输出,保证分钟是两位数,秒数保留一位小数 return f"{mid_h}:{mid_m:02d}:{mid_s:.1f}" # 测试 print(get_video_midpoint("0:01:00")) # 输出: 0:00:30.0 print(get_video_midpoint("1:23:45")) # 输出: 0:41:52.5
Bash脚本实现
如果在终端处理,可以用bash脚本:
# 输入FFmpeg输出的时长(忽略微秒) duration="0:01:00" # 拆分时分秒 IFS=':' read -r h m s <<< "$duration" # 计算总秒数 total_seconds=$(( h*3600 + m*60 + s )) # 计算中点秒数(整数结果) mid_seconds=$(( total_seconds / 2 )) # 转回时分秒 mid_h=$(( mid_seconds / 3600 )) remaining=$(( mid_seconds % 3600 )) mid_m=$(( remaining / 60 )) mid_s=$(( remaining % 60 )) # 输出结果 echo "中点时刻: $mid_h:$mid_m:$mid_s"
这样就再也不会出现直接拆分时分秒计算的错误啦!
内容的提问来源于stack exchange,提问作者Kelly Flet




