You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

如何计算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进制拆分回时、分、秒:

  1. 小时数 = 中点秒数 ÷ 3600(取整数部分)
  2. 剩余秒数 = 中点秒数 % 3600(取余)
  3. 分钟数 = 剩余秒数 ÷ 60(取整数部分)
  4. 秒数 = 剩余秒数 % 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

火山引擎 最新活动