MLT dynamictext滤镜#timecode#参数仅显示分秒的格式化方法咨询
MLT框架dynamictext滤镜的自定义时间实现方案
dynamictext滤镜里的#timecode#宏本身不支持和#localtime#一致的自定义格式化规则——两者的解析逻辑从设计上就存在本质区别,你之前尝试的#timecode %M:%S#语法无法生效是符合设计预期的,并非配置错误。
#localtime#直接对接系统时间格式化接口,原生支持标准strftime格式占位符,只要在宏标记内写入格式即可生效,可以直接按需求定义展示内容#timecode#是内置的固定结构时间码渲染宏,默认输出时:分:秒:帧的固定格式,本身没有预留自定义格式的解析分支- 语法失效的直接原因:
#timecode#宏的识别是严格匹配成对闭合标记的,只有完整出现#timecode#才会触发替换,在两个#之间插入格式参数的写法,根本识别不到目标宏,自然无法触发替换逻辑
你之前用qtcrop滤镜隐藏小时、帧字段的实现方式属于绕路方案,完全可以利用dynamictext滤镜原生支持的嵌入式动态表达式能力,从输出源头直接生成你需要的分:秒格式文本,不需要叠加额外的裁剪滤镜,实现逻辑更简洁,也没有画面裁切的冗余计算开销。
场景1:和原生timecode计时基准完全对齐
这种方式不需要重新计算时间,直接对内置timecode的输出做字符串拆分截取即可,保证和原生时间码的计时精度完全一致:
- 利用动态表达式调用原生timecode的生成接口
- 按冒号分割时间码字符串(原生结构为
时:分:秒:帧) - 取拆分后对应分钟、秒的字段拼接成目标格式,跳过不需要展示的小时、帧字段
对应的滤镜配置写法:
dynamictext argument="\ raw_tc = timecode(); \ parts = split(raw_tc, ':'); \ # parts[0]为小时字段,parts[3]为帧字段,直接跳过 text = parts[1] + ':' + parts[2]; \ text"
场景2:自定义精度的时间展示
如果不需要保留帧信息,只需要精确到秒的分:秒展示,也可以直接基于播放位置计算,灵活性更高:
dynamictext argument="\ # 基于当前播放帧位置计算准确播放秒数 total_sec = consumer.frame() / consumer.fps(); min = int(total_sec / 60); sec = int(total_sec % 60); # 自动补零保持两位数格式 text = sprintf('%02d:%02d', min, sec); text"
和qtcrop裁切的方案相比,上述实现的优势很明显:
- 没有额外的滤镜叠加,减少渲染管线的计算量
- 输出的文本内容直接是目标长度,不会因为时间码字段长度变化出现文本位置偏移
- 格式调整灵活,后续需要增加、删减展示字段时,不需要重新调整裁切区域
内容的提问来源于stack exchange,提问作者msp
相关产品推荐
相关产品推荐

