如何在 FFmpeg 中正确叠加多行文字水印(避免仅首行显示)

聖光之護

聖光之護

2026-07-27

749人浏览

原创

如何在 FFmpeg 中正确叠加多行文字水印(避免仅首行显示)

使用 FFmpeg 的 drawtext 复合滤镜添加多行水印时,若未正确连接滤镜链,第二行将因输入源冲突而失效;必须将前一个 drawtext 的输出作为下一个的输入,形成串行滤镜流。

使用 ffmpeg 的 `drawtext` 复合滤镜添加多行文字水印时,若未正确连接滤镜链,第二行将因输入源冲突而失效;必须将前一个 `drawtext` 的输出作为下一个的输入,形成串行滤镜流。

在 FFmpeg 的 complexFilter 中,多个 drawtext 滤镜不能同时以 [0:v] 为输入源——因为它们会竞争同一视频流,FFmpeg 默认只保留最后一个有效输出(或因覆盖导致前序效果被丢弃),从而造成“仅第一行可见”的现象。

正确做法是构建滤镜链(filter chain):将第一个 drawtext 的输出显式命名(如 [filter_1]),再将其作为第二个 drawtext 的输入。这样确保两行文字依次叠加在同一视频帧上,而非相互覆盖或被忽略。

以下是修复后的完整代码示例(适配 Node.js 中的 fluent-ffmpeg):

比格设计
比格设计

比格设计是135编辑器旗下一款一站式、多场景、智能化的在线图片编辑器

下载
ffmpeg()
  .input(tempLocalPath)
  .complexFilter([
    // 第一行水印 → 输出命名为 [filter_1]
    `[0:v]drawtext=text='${watermarkTextLine1}':x=(w-tw)/2:y=(h-460):fontsize=24:fontcolor=white:fontfile=/Windows/Fonts/arial.ttf[filter_1]`,
    // 第二行水印 → 输入来自 [filter_1],而非 [0:v]
    `[filter_1]drawtext=text='${watermarkTextLine2}':x=(w-tw)/2:y=(h-200):fontsize=32:fontcolor=red:fontfile=/Windows/Fonts/arial.ttf`,
  ])
  .output(
    path.join(tempLocalDir, video_cid.replace(".mp4", "-") + "watermarked.mp4")
  )
  .on("end", () => {
    res.download(
      path.join(
        tempLocalDir,
        video_cid.replace(".mp4", "-") + "watermarked.mp4"
      ),
      "video.mp4",
      (err) => {
        if (err) console.error("Download error:", err);
        fs.unlink(tempLocalPath, (unlinkErr) => {
          if (unlinkErr) console.error("Cleanup error:", unlinkErr);
        });
      }
    );
  })
  .inputFormat("mp4")
  .run();

⚠️ 注意事项:

  • 所有 drawtext 必须使用唯一且可引用的输出标签(如 [filter_1]、[filtered]),中间不可省略;
  • y 坐标需合理错开(如示例中 h-460 和 h-200),避免文字重叠;
  • fontfile 路径需确保运行环境可访问(Linux/macOS 应使用 /usr/share/fonts/truetype/dejavu/DejaVuSans.ttf 等路径,Windows 注意转义或使用双反斜杠);
  • 若启用 reload=1 动态文本,需额外配置时间戳参数(如 timecode='00:00:00:00'),否则可能报错;
  • 推荐在生产环境添加 .on('error', ...) 监听滤镜语法错误(如标签不匹配、字体缺失等),便于快速定位问题。

通过显式声明滤镜依赖关系,即可稳定实现多行水印叠加,这是 FFmpeg 复合滤镜设计的核心原则之一。

相关专题

更多
Selenium WebDriver元素定位与页面操作教程
Selenium WebDriver元素定位与页面操作教程

本专题整理Selenium WebDriver元素定位、XPath、CSS Selector、等待机制、窗口切换、Frame处理、Alert弹窗、Cookie操作和文件上传等核心用法。

2026.08.05

3

26

Selenium Grid分布式测试与并行执行教程
Selenium Grid分布式测试与并行执行教程

本专题整理Selenium Grid架构、远程WebDriver、并行测试、Docker部署、Kubernetes动态Grid、浏览器矩阵和测试环境扩展方法,适合进阶自动化测试团队使用。

2026.08.05

1

18

Selenium常见报错排查与自动化测试稳定性
Selenium常见报错排查与自动化测试稳定性

本专题整理Selenium常见报错、驱动版本问题、元素找不到、点击失败、等待超时、浏览器闪退、脚本不稳定和测试用例维护方法。

2026.08.05

0

17

墨刀AI提示词教学
墨刀AI提示词教学

本合集由PHP中文网精心整理,为您提供全面的墨刀AI提示词教学。内容涵盖高质量原型撰写公式与实操窍门,助您轻松掌握AI设计工具。无论是零基础入门还是进阶技巧,都能让您快速上手,大幅提升产品设计与协作效率。

2026.08.04

11

21

墨刀AI完整入门
墨刀AI完整入门

PHP中文网为您倾力打造墨刀AI保姆级入门指南完整版!本合集从零基础讲起,涵盖AI生成原型、提示词优化、图片转原型及多轮对话等核心功能。无论您是新手还是进阶用户,都能轻松掌握产品设计全流程。快来PHP中文网,一键解锁高效设计技巧,让想法即刻成型!

2026.08.04

8

20

墨刀AI进阶技巧
墨刀AI进阶技巧

本合集由PHP中文网精心整理,为您提供墨刀AI核心进阶策略指南。内容涵盖高效提示词写作、原型智能生成与微调、结构化导图制作及行业分析报告输出等实战技巧。助您轻松掌握AI设计工具,大幅提升产品设计与团队协作效率。

2026.08.04

10

14

火山引擎实名认证失败怎么办
火山引擎实名认证失败怎么办

火山引擎实名认证失败可能与证件信息填写错误、姓名或企业信息不一致、证件照片不清晰、营业执照状态异常、手机号验证失败或审核资料不完整有关。本专题整理个人认证、企业认证、资料上传、审核退回、重新提交和认证不通过的常见处理方法。

2026.08.04

5

10

火山引擎域名备案流程详解
火山引擎域名备案流程详解

火山引擎域名备案适合需要在火山引擎云服务器、对象存储、CDN或网站服务上绑定域名的用户参考。本专题整理备案入口、账号实名认证、备案类型选择、主体信息填写、网站信息提交、资料上传、初审核验、管局审核和备案失败排查,帮助用户完成网站上线前的备案流程。

2026.08.04

1

10

火山引擎DNS解析配置步骤
火山引擎DNS解析配置步骤

使用火山引擎DNS解析网站域名时,需要确认域名已完成管理接入,并正确配置服务器IP、CNAME地址或验证记录。本专题整理域名添加、记录类型选择、TTL设置、解析状态检查、备案和访问测试等流程,适合新手搭建网站时参考。

2026.08.04

3

10

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
热门推荐
/
最新课程
phpStudy极速入门视频教程
phpStudy极速入门视频教程

共6课时 | 54.4万人学习

独孤九贱(4)_PHP视频教程
独孤九贱(4)_PHP视频教程

共89课时 | 131.8万人学习