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

如何在FFmpeg中实现带视频背景采样渐变框的drawtext?

需求说明

我想替换视频左上角的硬编码文字为其他语言,打算用drawtext滤镜加框,但因为视频背景有渐变差异,希望实现两点:

  • drawtext的框为渐变样式(是否能借助geq滤镜?)
  • 框的颜色自动从视频背景(沿框的边缘区域)采样
    每个视频文件的背景渐变固定,只需一次采样。
实现建议

一、先提取背景渐变信息

因为单条视频的背景渐变不会变,先完成采样步骤:

  1. 用ffmpeg截取视频第一帧的目标文字区域,保存成图片:
ffmpeg -i input.mp4 -vframes 1 -crop 100:80:200:50 background_sample.png

(把命令里的100:80:200:50换成你视频里文字区域的实际坐标和尺寸,格式是宽:高:X坐标:Y坐标)
2. 用普通图像工具(比如GIMP、画图3D)打开采样图,直接取渐变两端的RGB色值,或者记录渐变的方向(横向/纵向)。

二、渐变覆盖+新文字叠加

方案1:用geq生成渐变遮罩(纯命令行实现)

直接用geq滤镜生成和背景匹配的渐变块,覆盖原文字后再加新文字:

ffmpeg -i input.mp4 -filter_complex "
[0:v]geq=r='(X/W)*150+(1-X/W)*200':g='(X/W)*160+(1-X/W)*210':b='(X/W)*170+(1-X/W)*220',crop=200:50:100:80[grad];
[0:v][grad]overlay=100:80[bg];
[bg]drawtext=text='你的新文字':fontfile=simhei.ttf:x=110:y=85:fontcolor=black:fontsize=24
" output.mp4
  • 把r='(X/W)*150+(1-X/W)*200'里的数字换成你采样到的RGB值,X/W是横向渐变,要纵向就改成Y/H
  • crop和overlay的坐标要和原文字区域完全对应,确保渐变块精准盖住旧文字
  • 最后调整drawtext的位置、字体、颜色参数,让新文字适配背景

方案2:提前做渐变图(更省心)

如果geq的参数调试麻烦,直接用图像工具做一张和原文字区域尺寸完全一样的渐变图(匹配背景渐变),然后用overlay覆盖:

ffmpeg -i input.mp4 -i gradient_mask.png -filter_complex "
[0:v][1:v]overlay=100:80[bg];
[bg]drawtext=text='你的新文字':fontfile=simhei.ttf:x=110:y=85:fontcolor=black:fontsize=24
" output.mp4

三、自动采样背景颜色(进阶脚本化)

如果不想手动取色,可以用ffmpeg提取边缘区域的颜色均值,再自动传入参数:

  1. 先提取文字框边缘区域的颜色均值:
ffmpeg -i input.mp4 -vframes 1 -crop 20:50:200:10 -filter_complex "extractplanes=r+g+b,avector" -f null -

(这里的crop参数是你要采样的边缘区域,比如文字框上方的一条窄带)
2. 命令会输出类似avector: r_avg=150.2 g_avg=160.5 b_avg=170.1的结果,把这些数值用Shell或Python脚本提取出来,自动替换到geq的参数里,就能实现自动匹配背景色。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.07 19:20:53