You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

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

火山引擎 最新活动