引言

在当今的数字时代,视频已成为信息传播和品牌推广的重要载体。然而,随着视频内容的广泛传播,如何保护版权、提升品牌辨识度成为许多创作者和企业面临的难题。手动为视频添加水印费时费力,而批量处理则能大幅提升效率。本文将带你了解如何利用 FFmpeg 这一强大工具,结合 Python 编程,实现视频的批量水印添加,让你的视频处理更加高效、智能!

为什么需要批量为视频添加水印?

视频批量添加水印的需求源于以下几个常见场景:

  • 版权保护:通过在视频中嵌入专属标识(如名字或 Logo),可以有效防止未经授权的盗用或篡改。
  • 品牌宣传:水印可以作为品牌符号或口号,在视频传播中不断强化观众对品牌的认知。
  • 内容管理:为视频添加文字说明、时间戳或版本信息,有助于快速识别内容或用途。

当视频数量较少时,手动添加水印或许还能应付。但面对数十甚至数百个视频时,手动操作不仅耗时,还容易出错。这时,自动化批量处理就显得尤为重要。借助工具,我们可以一次性为所有视频添加水印,省时省力。

FFmpeg:多媒体处理的“万能工具”

FFmpeg 的由来

FFmpeg 是一个开源的多媒体处理工具,诞生于 2000 年,由 Fabrice Bellard 发起。其名称“FFmpeg”意为“Fast Forward MPEG”,最初专注于快速处理 MPEG 视频。经过二十多年的发展,它已成为多媒体领域的“瑞士军刀”,广泛应用于视频编辑、格式转换等领域。

FFmpeg 的功能

FFmpeg 功能强大,几乎能满足所有音视频处理需求,包括:

  • 格式转换:将视频从 MP4 转为 AVI,或音频从 MP3 转为 WAV。
  • 视频编辑:剪辑、合并、调整分辨率等。
  • 滤镜应用:添加水印、字幕,或调整亮度、对比度。
  • 流媒体支持:录制和播放实时流媒体。

在本文中,我们将重点利用 FFmpeg 的 drawtext 滤镜功能,为视频添加文字水印。

使用 FFmpeg 为视频添加水印

FFmpeg 通过命令行操作,简单几行命令就能为视频添加水印。以下是基本用法:

FFmpeg 的安装

以 mac 为例,使用 Homebrew 安装 FFmpeg:

1
brew install ffmpeg

而 win 用户则需要下载安装包进行安装。

添加简单文字水印

假设我们有一个视频 input.mp4,想在左上角添加“Watermark”文字,可以使用以下命令:

1
ffmpeg -i input.mp4 -vf "drawtext=text='Watermark':fontcolor=white:fontsize=24:x=10:y=10" output.mp4
  • -i input.mp4:输入视频文件。
  • -vf "drawtext=...":应用 drawtext 滤镜。
  • text='Watermark':水印文字。
  • fontcolor=white:文字颜色。
  • fontsize=24:文字大小。
  • x=10:y=10:通常用于指定在视频中添加元素(如文本或图像)时的水平和垂直位置,当x=10:y=10时,表示水印在视频的左上角,距离左边缘 10 像素,距离上边缘 10 像素。

运行后,生成的新视频 output.mp4 将带有水印。

使用文本文件和自定义字体

如果水印内容较复杂(如多行文字或特殊字符),我们可以将文字写入文本文件,并指定字体。例如:

1
ffmpeg -i input.mp4 -vf "drawtext=fontfile='/path/to/font.ttf':textfile='/path/to/text.txt':fontcolor=white:fontsize=24:x=10:y=h-th-10" output.mp4
  • fontfile:指定字体文件路径。
  • textfile:指定存储水印文字的文本文件。
  • y=h-th-10:其中,h 表示视频帧的高度,th 表示待添加元素的高度。因此,h-th-10 的计算结果为:视频高度减去元素高度再减去 10 像素,即将元素放置在距离视频底部 10 像素的位置。

用 Python 实现 FFmpeg 的批量处理

单个视频加水印很简单,但批量处理需要自动化。这时,Python 派上用场。我们可以用 Python 调用 FFmpeg 命令,自动遍历目录中的视频文件并添加水印。

基本思路

  • 遍历目录:用 os.walk 找到所有视频文件。
  • 构造命令:为每个视频生成 FFmpeg 命令。
  • 执行处理:通过 subprocess 模块运行命令。
  • 保存结果:将处理后的视频存到指定目录。

Python 脚本的优势

手动输入命令适合单次操作,但批量处理时容易出错。Python 脚本可以一次性处理数百个视频,还能灵活调整水印位置、样式等。

完整 Python 示例代码

以下是一个安全的示例代码,去除了敏感路径信息,保留了核心逻辑,供你参考和修改:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
import os
import subprocess

# 定义水印文本文件路径(需替换为实际路径)
textfile1 = "/path/to/textfile1.txt" # 第一行水印文本
textfile2 = "/path/to/textfile2.txt" # 第二行水印文本

# 定义字体文件路径(需替换为实际路径)
font_path1 = "/path/to/font1.ttf" # 支持特殊字符的字体
font_path2 = "/path/to/font2.ttf" # 支持中文的字体

WATERMARK_POSITION = (10, 10)
FONT_SIZE = 24
FONT_COLOR = "white"


def add_adaptive_watermark_ffmpeg(input_path, output_path, textfile1, textfile2, font_path1, font_path2):
# 构造 FFmpeg 命令
command = [
"ffmpeg",
"-i", input_path,
"-vf",
f"drawtext=fontfile='{font_path2}':textfile='{textfile2}':fontcolor={FONT_COLOR}:fontsize={FONT_SIZE}:x={WATERMARK_POSITION[0]}:y=h-th-10, "
f"drawtext=fontfile='{font_path1}':textfile='{textfile1}':fontcolor={FONT_COLOR}:fontsize={FONT_SIZE}:x={WATERMARK_POSITION[0]}:y=h-th-40",
"-codec:a", "copy", # 音频流直接复制,不重新编码
output_path
]
# 执行命令
try:
subprocess.run(command, check=True)
except subprocess.CalledProcessError as e:
print(f"Error processing {input_path}: {e}")


def process_videos_in_directory(directory, textfile1, textfile2, font_path1, font_path2):
for root, _, files in os.walk(directory):
for filename in files:
if filename.endswith((".mp4", ".avi", ".mov", ".mkv")):
input_path = os.path.join(root, filename)
# 构造输出路径(需替换为实际输出目录)
output_path = os.path.join("/path/to/output/directory", os.path.relpath(input_path, directory))
output_dir = os.path.dirname(output_path)
if not os.path.exists(output_dir):
os.makedirs(output_dir)
if os.path.exists(output_path):
print(f"Output file {output_path} already exists. Skipping...")
continue
print(f"Processing {filename}...")
add_adaptive_watermark_ffmpeg(input_path, output_path, textfile1, textfile2, font_path1, font_path2)
print(f"Watermarked video saved as {output_path}")

# 处理指定目录中的视频(需替换为实际输入目录)
process_videos_in_directory("/path/to/video/directory", textfile1, textfile2, font_path1, font_path2)

使用说明:

  1. 将/path/to/…替换为你的实际文件路径。
  2. textfile1.txt 和 textfile2.txt 分别存储两行水印内容。
  3. 确保字体文件支持所需字符(中文或特殊符号)。
  4. 输出视频将保留原目录结构,方便管理。

常见问题及解决方法

在批量添加水印时,可能会遇到以下问题:

中文显示为“口口口”

原因:默认字体不支持中文字符,导致显示乱码。
解决方法:指定支持中文的字体文件,如“微软雅黑”或“宋体”。在命令中添加 fontfile=’/path/to/chinese_font.ttf’即可。

特殊字符(如®)无法显示

原因:字体不支持全 Unicode 字符,商标符号®等无法正常渲染。
解决方法:更换支持全 Unicode 的字体,如“Arial Unicode MS”或“Noto Sans”,确保特殊字符正确显示。
这些问题在 Python 脚本中也可以通过动态指定字体文件轻松解决。

结语

通过 FFmpeg 和 Python 的结合,你可以轻松实现视频的批量水印添加。这种方法不仅高效,还能灵活应对各种需求。无论是保护版权还是宣传品牌,这套工具都能为你节省大量时间。快动手试试吧,体验自动化带来的便利!

另外,FFmpeg 功能远不止于此,你可以探索更多滤镜和参数,定制专属的水印样式。祝你的视频创作之路更加顺畅!

参考

  1. FFmpeg
  2. 字集 - 免费字体 - 文泉驿
  3. 终于完工!ffmpeg 视频滤镜:添加文本-drawtext_ffmpeg drawtext 添加中文字-CSDN 博客
  4. FFmpeg Filters Documentation
  5. FFmpeg Community Discussions