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

咨询FFmpeg如何为播放列表中的每个文件添加对应自定义文字水印

咨询FFmpeg如何为播放列表中的每个文件添加对应自定义文字水印

嗨,我懂你想要实现的效果——给播放列表里的每个视频文件配上对应的自定义文字水印,这个需求确实很实用!不过可惜的是,FFmpeg的drawtext滤镜本身并不支持直接读取外部列表来为不同视频片段切换水印内容。不过别担心,我给你提供两个可行的解决方案:

方案一:用脚本批量处理单个文件(最灵活)

这个方法适合视频数量较多的场景,核心思路是把playlist.txt和drawtextlist.txt里的条目一一对应,逐个对视频文件添加水印。

步骤:

  1. 确保playlist.txt和drawtextlist.txt里的条目顺序完全一致,每个视频对应一行水印参数。
  2. 编写一个简单的脚本(以Linux/macOS的Bash脚本为例):
#!/bin/bash

# 将两个文件的内容读取到数组中
mapfile -t video_entries < playlist.txt
mapfile -t watermark_params < drawtextlist.txt

# 循环处理每个视频
for ((index=0; index<${#video_entries[@]}; index++)); do
    # 从playlist的条目里提取纯文件名(比如从"file '1.mp4'"得到"1.mp4")
    video_file=$(echo "${video_entries[$index]}" | sed "s/file '\(.*\)'/\1/")
    # 定义输出文件名,避免覆盖原文件
    output_file="watermarked_${video_file}"
    # 执行FFmpeg命令添加水印,音频直接复制以节省时间
    ffmpeg -i "$video_file" -vf "${watermark_params[$index]}" -c:a copy "$output_file"
done

说明:

  • 脚本会自动为每个视频生成带前缀watermarked_的新文件,不会修改原文件。
  • 如果你的视频路径包含特殊字符或者复杂路径,可以调整sed的匹配规则,或者直接在playlist.txt里写绝对路径。
  • 确保FFmpeg能找到字体文件,建议在水印参数里写字体的绝对路径,比如fontfile=/usr/share/fonts/OpenSans.ttf。

方案二:用filter_complex串联处理后合并(适合少量视频)

如果你的视频数量不多,也可以直接用FFmpeg的filter_complex滤镜,先给每个视频单独加水印,再合并成一个文件:

ffmpeg \
-i 1.mp4 -i 2.mp4 -i 3.mp4 \
-filter_complex \
"[0:v]drawtext=fontfile=OpenSans.ttf:text='For 1.mp4'[marked_v0]; \
 [1:v]drawtext=fontfile=OpenSans.ttf:text='For 2.mp4'[marked_v1]; \
 [2:v]drawtext=fontfile=OpenSans.ttf:text='For 3.mp4'[marked_v2]; \
 [marked_v0][0:a][marked_v1][1:a][marked_v2][2:a]concat=n=3:v=1:a=1[final_v][final_a]" \
-map "[final_v]" -map "[final_a]" final_output.mp4

说明:

  • 每个输入视频先通过drawtext滤镜添加对应水印,生成带标记的视频流(比如[marked_v0])。
  • 最后用concat滤镜把带水印的视频流和原音频流合并成一个完整的视频文件。
  • 如果需要调整水印的位置、大小、颜色等,可以在drawtext参数里添加更多选项,比如:x=10:y=10:fontsize=24:fontcolor=white。

备注:内容来源于stack exchange,提问作者Nick Mechel

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.23 08:49:28