【发布时间】:2011-12-13 11:15:57
【问题描述】:
我有一个关于计算时间码增量的问题。
我从包含格式为 HH:MM:SS:FF 的时间码的电影文件中读取元数据
(例如FF = 帧,00->23。所以就像00 到framerate-1)
所以我得到了一些像15:41:08:02 这样的数据,从另一个参考文件中我得到了15:41:07:00
现在我必须计算时间偏移量(如 timedelta,但仅使用帧)。
我该怎么做呢?
【问题讨论】:
我有一个关于计算时间码增量的问题。
我从包含格式为 HH:MM:SS:FF 的时间码的电影文件中读取元数据
(例如FF = 帧,00->23。所以就像00 到framerate-1)
所以我得到了一些像15:41:08:02 这样的数据,从另一个参考文件中我得到了15:41:07:00
现在我必须计算时间偏移量(如 timedelta,但仅使用帧)。
我该怎么做呢?
【问题讨论】:
framerate = 24
def timecode_to_frames(timecode):
return sum(f * int(t) for f,t in zip((3600*framerate, 60*framerate, framerate, 1), timecode.split(':')))
print timecode_to_frames('15:41:08:02') - timecode_to_frames('15:41:07:00')
# returns 26
def frames_to_timecode(frames):
return '{0:02d}:{1:02d}:{2:02d}:{3:02d}'.format(frames / (3600*framerate),
frames / (60*framerate) % 60,
frames / framerate % 60,
frames % framerate)
print frames_to_timecode(26)
# returns "00:00:01:02"
【讨论】:
我只使用全局帧数进行所有计算,转换回时间码仅用于显示
def tc_to_frame(hh, mm, ss, ff):
return ff + (ss + mm*60 + hh*3600) * frame_rate
def frame_to_tc(fn):
ff = fn % frame_rate
s = fn // frame_rate
return (s // 3600, s // 60 % 60, s % 60, ff)
对于负帧数,我会在绝对值的表示之前加上一个减号
【讨论】:
如果时间码是SMPTE timecode,您可能需要考虑丢帧。丢帧时间码在每分钟的第一秒丢帧编号 0 和 1,除非分钟数可以被 10 整除。
This page 提供了一些历史背景以及用于在时间码和帧数之间转换的公式。
【讨论】:
使用timecode 模块非常简单:
import timecode as tc
tc1 = tc.Timecode(24, "15:41:08:02")
tc2 = tc.Timecode(24, "15:41:07:00")
delta = tc1 - tc2
print(delta.frames)
给你26
【讨论】: