如何进行时间码计算?

4
我有一个关于计算时间码差的问题。
我从一个电影文件中读取元数据,其中包含格式为HH:MM:SS:FF的时间码。
(FF表示帧数,范围为00->23。例如,如果帧率为24,则FF应该是0023)
因此,我得到了一些数据,如15:41:08:02,并从另一个参考文件中获得了15:41:07:00
现在我必须计算时间偏移量(类似于时间差,但只涉及帧)。我该如何处理?
4个回答

7
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"

非常感谢大家的快速回答!惊讶于这里的人们是多么友善和迅速。 - Malu05

2

我建议在所有计算中仅使用全局帧编号,仅在显示时转换回时间码。

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)

对于负的帧数,我会在绝对值的表示前面加上一个减号。

1
如果时间码是SMPTE时间码,您可能需要考虑到丢帧。丢帧时间码会在每分钟的第一秒中省略0和1的帧号,除非分钟数可被10整除。 这个页面提供了一些历史背景知识以及用于转换时间码和帧数之间的公式。

对于丢帧时间码,01:08:59:29和01:09:00:02之间的时间偏移应该是1,不是吗? - yannick

0
使用 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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接