node.js中fluent-ffmpeg的drawtext timecode选项正确输入格式
解决fluent-ffmpeg添加毫秒计数器的问题
嘿,我来帮你搞定这个毫秒计数器的事儿!你提到用drawtext滤镜时遇到问题,大概率是对timecode参数的用法理解错了——它是用来显示基于帧率的帧计数的,不是直接显示毫秒的。如果要做毫秒级的计时器,得用表达式来计算,下面给你详细的解决方案:
一、正确实现毫秒计数器(两种显示样式)
1. 仅显示累计毫秒数(比如:1234)
直接用视频时间戳计算当前毫秒数,代码示例:
const ffmpeg = require('fluent-ffmpeg'); ffmpeg('./your-generated-video.mp4') .videoFilters([ { filter: 'drawtext', options: { fontfile: '/path/to/your/font.ttf', // 务必指定字体文件路径,比如Windows的C:/Windows/Fonts/arial.ttf text: '%{eif\\:t*1000\\:d}', // t是当前视频时间(秒),乘以1000转成毫秒 x: 20, // 左上角x坐标,可自行调整 y: 20, // 左上角y坐标,可自行调整 fontsize: 28, fontcolor: 'white', shadowcolor: 'black', // 加阴影让文字更清晰 shadowx: 2, shadowy: 2 } } ]) .output('./video-with-ms-counter.mp4') .on('end', () => console.log('毫秒计数器添加成功!')) .on('error', (err) => console.error('出问题啦:', err)) .run();
2. 显示时分秒+毫秒格式(比如:00:01:23.456)
用组合表达式实现标准的时间格式,代码示例:
const ffmpeg = require('fluent-ffmpeg'); ffmpeg('./your-generated-video.mp4') .videoFilters([ { filter: 'drawtext', options: { fontfile: '/path/to/your/font.ttf', // 表达式分解:小时:分钟:秒.毫秒,每个部分补前导零 text: '%{eif\\:t/3600\\:d\\:2}:%{eif\\:(t/60)%60\\:d\\:2}:%{eif\\:t%60\\:d\\:2}.%{eif\\:(t*1000)%1000\\:d\\:3}', x: 20, y: 20, fontsize: 28, fontcolor: 'white', shadowcolor: 'black', shadowx: 2, shadowy: 2 } } ]) .output('./video-with-full-time-counter.mp4') .on('end', () => console.log('完整时间计数器添加成功!')) .on('error', (err) => console.error('出错了:', err)) .run();
二、如果你确实需要用timecode参数(帧计数)
如果你原本的需求是显示基于帧率的帧编号(比如00:00:00:15,对应30fps下的第15帧),那timecode的正确格式是HH:MM:SS:FF,并且必须指定rate参数匹配视频帧率,代码示例:
const ffmpeg = require('fluent-ffmpeg'); ffmpeg('./your-generated-video.mp4') .videoFilters([ { filter: 'drawtext', options: { fontfile: '/path/to/your/font.ttf', timecode: '00:00:00:00', // 起始帧计数 rate: '30', // 必须和输入视频的帧率一致!比如30fps就写30,25fps写25 text: '%{timecode}', x: 20, y: 20, fontsize: 28, fontcolor: 'white', shadowcolor: 'black', shadowx: 2, shadowy: 2 } } ]) .output('./video-with-timecode.mp4') .on('end', () => console.log('Timecode添加成功!')) .on('error', (err) => console.error('出错了:', err)) .run();
关键注意事项
- 字体文件必须指定:ffmpeg不会自动识别系统字体,所以一定要填对
fontfile的路径,否则滤镜会直接失败。 - 帧率匹配:如果用
timecode参数,rate必须和输入视频的帧率完全一致,否则计数会和实际时间不同步。 - 测试小片段:可以先截取视频的前几秒来测试,确认计数器显示正常后再处理完整视频。
内容的提问来源于stack exchange,提问作者Gil Dekel




