人类的时间码库。支持smpte非丢弃帧和丢弃帧以及许多其他时间码格式。
dayu-timecode的Python项目详细描述
dayu_timecode
Timecode 的计算库。针对影视行业常见的各种timecode、frame 进行计算。有下面的特点:
- 支持SMPTE NDF、SMPTE DF、DLP、SRT、FFMPEG、FCPX 多种格式的timecode
- 目前支持到 fps=60 的高帧速率
- 支持hour loop 和 负数时间
- timecode、frame 之间自由转换
- 支持和其他常用的数字类型进行运算,无需转换(int、float、Fraction)
如何安装
直接使用pip 即可安装
pip install -U dayu_timecode
DayuTimeCode 使用简介
fromdayu_timecodeimportDayuTimeCode# 针对各种输入,进行初始化smpte_ndf_tc=DayuTimeCode('01:02:03:12',fps=24.0)smpte_df_tc=DayuTimeCode('01:09:00;02',fps=29.97)srt_tc=DayuTimeCode('00:00:03,245',fps=25.0)dlp_tc=DayuTimeCode('01:12:22:136',fps=24.0)ffmpeg_tc=DayuTimeCode('00:02:12.24',fps=24.0)fcpx_tc=DayuTimeCode('1/24s',fps=24.0)frame_int_tc=DayuTimeCode(100,fps=25.0)frame_long_tc=DayuTimeCode(86400.2,fps=24.0)time_tc=DayuTimeCode([24,3],fps=24.0)# 时码、帧数转换assertsmpte_ndf_tc.timecode()=='01:02:03:12'assertsmpte_ndf_tc.frame()==89364.00# 得到时码中 小时、分钟、秒、帧数的分量assertsmpte_ndf_tc.hour==1assertsmpte_ndf_tc.minute==2assertsmpte_ndf_tc.second==3assertsmpte_ndf_tc.sub_frame==12a=DayuTimeCode('01:02:03:12',fps=24.0)b=DayuTimeCode(86400.2,fps=24.0)# 加法、减法、乘法、除法printa+b# <DayuTimeCode>(02:02:03:12, 175764.20, 24.00)printa-b# <DayuTimeCode>(00:02:03:12, 2963.80, 24.00)printa*3# <DayuTimeCode>(03:06:10:12, 268092.00, 24.00)printa/2# <DayuTimeCode>(00:31:01:18, 44682.00, 24.00)# 各种比较方式printa==bprinta>bprinta>=bprinta<bprinta<=bprinta!=b# 类型转换printfloat(a)printint(a)# 变速(指定一个起点,以及变速的速度)start_tc=DayuTimeCode(0)printa.retime(start_tc,2.0)# 表示从0 开始,两倍速播放后的timecode
DayuTimeRange 使用简介
DayuTimeRange 由两个DayuTimeCode 组成的一个时间区域。
# 初始化start=DayuTimeCode(0)end=DayuTimeCode(100)time_range=DayuTimeRange(start,end)# zero_length_range = DayuTimeRange(DayuTimeCode(10), DayuTimeCode(10)) # 会出错,因为start 和end 都是同一个时间# 访问属性printtime_range.start# 起点printtime_range.end# 终点printtime_range.duration.frame()# 获得 frame 长度printlen(time_range)# 获得 frame 长度的另一种方法# 加法、减法、乘法、除法printtime_range+10# 表示整个time_range 向右移动 10 frameprinttime_range-20# 表示整个time_range 向左移动 20 frameprinttime_range*2# 表示整个time_range 起点不动,长度变成原来的 2 倍printtime_range/3# 表示整个time_range 起点不动,长度变成原来的 三分之一# 处理handletime_range.handle(10,10)# 表示time_range 的start 向左增加 10 frame,end 向右增加 10 frame# 切镜头处理cut_point=DayuTimeCode(20)printtime_range.cut(cut_point)# 得到两个区域 (0 - 20), (20 - 100)# 判断timecode 或者一个time range 是否在当前timerange 的内部sample_tc=DayuTimeCode(20)sample_time_range=DayuTimeRange(DayuTimeCode(30),DayuTimeCode(70))assertsample_tcintime_rangeassertsample_time_rangeintime_range# 两个DayuTimeRange 之间的交集、并集、差异 运算a=DayuTimeRange(DayuTimeCode(0),DayuTimeCode(100))b=DayuTimeRange(DayuTimeCode(50),DayuTimeCode(150))printa&b# 二者之间交叠的部分 (50 - 100)printa|b# 二者的并集运算 (0 - 150)printa^b# 二者的差异运算 (0 - 50), (100 - 150)# 遍历time range 内的所有时码fortcintime_range:printtc# 会逐一打印 从 DayuTimeCode(0) ~ DayuTimeCode(99)