将时间码转换为帧数并设置起始时间码

4
我正在使用以下脚本将时间码转换成帧数,它能够工作,但是只有在将开始时间码设置为00:00:00:00时才能转换。我希望能够设置起始时间码,以便进行相对计算。此外,如果我将帧速率设置为23.976或29.97,它会出错。
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(':')))

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 timecode_to_frames('00:00:00:10')
print frames_to_timecode(10)
1个回答

7

如果您先将值转换为数字(例如秒),则可以轻松进行算术运算:

framerate = 23.976

def _seconds(value):
    if isinstance(value, str):  # value seems to be a timestamp
        _zip_ft = zip((3600, 60, 1, 1/framerate), value.split(':'))
        return sum(f * float(t) for f,t in _zip_ft)
    elif isinstance(value, (int, float)):  # frames
        return value / framerate
    else:
        return 0

def _timecode(seconds):
    return '{h:02d}:{m:02d}:{s:02d}:{f:02d}' \
            .format(h=int(seconds/3600),
                    m=int(seconds/60%60),
                    s=int(seconds%60),
                    f=round((seconds-int(seconds))*framerate))


def _frames(seconds):
    return seconds * framerate

def timecode_to_frames(timecode, start=None):
    return _frames(_seconds(timecode) - _seconds(start))

def frames_to_timecode(frames, start=None):
    return _timecode(_seconds(frames) + _seconds(start))


print(timecode_to_frames('00:00:18:10', start='00:00:05:15'))  # ~ 307
print(frames_to_timecode(307, start='00:00:05:15'))  # '00:00:18:10'

这个很好用,谢谢。有没有什么办法来处理掉帧? - speedyrazor
由于我们将帧计数舍入为整数,因此此操作是自动完成的。 - Finwood
感谢您的确认,Finwood。 - speedyrazor
嗨,Finwood,我说得太早了。上面的解决方案只适用于23.976。如果我尝试使用24fps,它不起作用。 - speedyrazor
通过这个,我在第17行遇到了错误:未知的格式代码“d”用于类型为“float”的对象。 - speedyrazor
显示剩余8条评论

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