You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

C#调用FFmpeg时如何在视频指定位置正常添加水印?

C# 调用FFmpeg添加drawtext文字水印失效问题修复

你的命令无法生效主要有4个核心问题,逐一修正即可:

  • 首先是滤镜参数语法+引号嵌套双重错误:这是最核心的失败原因。一是drawtext滤镜要求字体文件路径必须显式指定fontfile=参数名,你直接把字体文件名写在drawtext后没有加参数键,FFmpeg无法识别该配置;二是你给-vf参数外层用了双引号,滤镜内部给字体文件名又直接套了双引号,导致命令行参数解析断裂,整个滤镜配置加载失败。
  • 字体文件路径未指定绝对路径:C#调用FFmpeg时默认工作目录通常是程序运行目录,不是FFmpeg可执行文件所在目录,如果只写字体文件名Roboto-Regular.ttf,FFmpeg大概率找不到对应字体文件,直接导致滤镜加载失败。
  • 点击坐标未做分辨率映射:你在媒体播放器界面记录的点击坐标是基于播放器当前显示窗口尺寸的,不是视频原始分辨率的坐标,如果播放器做了缩放、留黑边,直接把窗口坐标传给x/y参数,水印位置会和你点击的位置完全不符。
  • 输出文件名存在笔误:你写的ouput.mp4少了字符t,正确拼写为output.mp4,该问题不影响水印功能本身,但会导致输出文件名不符合预期。

修正后的可运行命令

注意不同调用场景的转义差异:

命令行直接执行版本

ffmpeg -i input.mp4 -vf "drawtext=fontfile=Roboto-Regular.ttf:text='Stack Overflow':fontcolor=white:fontsize=24:box=1:boxcolor=black@0.5:boxborderw=5:x=300:y=100" -codec:a copy output.mp4

如果字体不在当前工作目录,把Roboto-Regular.ttf替换为字体文件的完整绝对路径:Windows系统下路径中的冒号需要额外转义,例如C\\:/Windows/Fonts/Roboto-Regular.ttf;Linux/macOS直接写正常绝对路径即可。

C# 进程调用参数写法

C#启动Process传参时,不需要给vf整体加外层双引号,滤镜内部的字符串值用单引号包裹即可,参考参数拼接示例:

// 注意替换为你实际的输入输出路径、字体路径、水印坐标、文字内容
string fontPath = @"C:\Windows\Fonts\Roboto-Regular.ttf".Replace(":", "\\:");
string ffmpegArgs = $"-i input.mp4 -vf drawtext=fontfile='{fontPath}':text='Stack Overflow':fontcolor=white:fontsize=24:box=1:boxcolor=black@0.5:boxborderw=5:x={watermarkX}:y={watermarkY} -codec:a copy output.mp4";

点击坐标映射修正方法

你在播放器界面记录的点击坐标需要按比例换算到视频原始分辨率,换算前先扣除播放器黑边的偏移量,公式如下:

水印X坐标 = (播放器内点击X位置 - 视频区域左上角X坐标) / 播放器视频显示区域宽度 * 视频原始宽度
水印Y坐标 = (播放器内点击Y位置 - 视频区域左上角Y坐标) / 播放器视频显示区域高度 * 视频原始高度

如果播放器开启了自适应缩放、画面裁剪等模式,需要先匹配播放器的画面缩放规则再做换算,否则水印位置会出现偏移。


内容的提问来源于stack exchange,提问作者Anas Saradar

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.03 10:24:12