咨询FFmpeg如何为播放列表中的每个文件添加对应自定义文字水印
咨询FFmpeg如何为播放列表中的每个文件添加对应自定义文字水印
嗨,我懂你想要实现的效果——给播放列表里的每个视频文件配上对应的自定义文字水印,这个需求确实很实用!不过可惜的是,FFmpeg的drawtext滤镜本身并不支持直接读取外部列表来为不同视频片段切换水印内容。不过别担心,我给你提供两个可行的解决方案:
方案一:用脚本批量处理单个文件(最灵活)
这个方法适合视频数量较多的场景,核心思路是把playlist.txt和drawtextlist.txt里的条目一一对应,逐个对视频文件添加水印。
步骤:
- 确保
playlist.txt和drawtextlist.txt里的条目顺序完全一致,每个视频对应一行水印参数。 - 编写一个简单的脚本(以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
相关产品推荐
相关产品推荐

