
本教程详细介绍了如何利用FFmpeg的`filter_complex`功能,为视频同时添加图片和文本水印。通过链式组合`overlay`和`drawtext`滤镜,即使是FFmpeg新手也能在PHP等编程环境中高效实现复杂的视频水印效果,确保输出视频兼具品牌标识与定制化文本信息。
FFmpeg是一个功能强大的开源多媒体框架,能够处理几乎所有类型的多媒体文件。在视频处理中,为视频添加水印是常见的需求,这包括图片水印(如Logo)和文本水印(如版权信息、日期时间)。FFmpeg通过其复杂的滤镜系统(filters)来实现这些功能。
为视频添加图片水印主要使用overlay滤镜。这个滤镜允许将一个视频流(或图片流)叠加到另一个视频流上。
基本语法:ffmpeg -i input.mp4 -i watermark.png -filter_complex "overlay=x:y" output.mp4
其中:
PHP集成示例(仅图片水印):
<?php
$dest_path = "input.mp4"; // 假设这是你的输入视频路径
$watermark_image_path = "2.jpeg"; // 假设这是你的水印图片路径
$output_dir = "video/"; // 输出目录
// 构建FFmpeg命令
$command = "ffmpeg -i " . escapeshellarg($dest_path) . " -i " . escapeshellarg($watermark_image_path);
$command .= " -filter_complex "[0:v][1:v]overlay=25:25""; // [0:v]是主视频流,[1:v]是水印图片流
$result_filename = hash("sha256", (string)rand()) . ".mp4"; // 生成随机文件名
$command .= " -c:a copy " . escapeshellarg($output_dir . $result_filename);
echo "执行命令: " . $command . "
";
system($command, $return_var);
if ($return_var === 0) {
echo "图片水印添加成功,输出文件: " . $output_dir . $result_filename . "
";
} else {
echo "图片水印添加失败,错误码: " . $return_var . "
";
}
?>注意: 在PHP中使用system()或exec()执行外部命令时,务必使用escapeshellarg()来包裹所有可能包含特殊字符的路径和文件名,以防止命令注入漏洞。
drawtext滤镜用于在视频上绘制文本。它提供了丰富的参数来控制文本的字体、大小、颜色、位置等。
基本语法:ffmpeg -i input.mp4 -vf "drawtext=fontfile=/path/to/font.ttf:text='Your Watermark Text':x=10:y=H-th-10:fontcolor=white:fontsize=24" output.mp4
其中:
当需要同时添加图片和文本水印时,不能简单地使用两个独立的-filter_complex或-vf参数。FFmpeg的滤镜系统允许通过逗号,将多个滤镜串联起来,形成一个滤镜链。前一个滤镜的输出将作为后一个滤镜的输入。
核心思路:
修正后的FFmpeg命令结构:
ffmpeg -i input.mp4 -i watermark.png -filter_complex "[0:v][1:v]overlay=25:25,drawtext=fontfile=/path/to/font.ttf:text='Your Text':x=50:y=50:fontcolor=red:fontsize=30" -c:a copy output.mp4
PHP集成示例(图片与文本水印):
<?php
$dest_path = "input.mp4"; // 输入视频路径
$watermark_image_path = "2.jpeg"; // 图片水印路径
$output_dir = "video/"; // 输出目录
$watermark_text = "My Custom Watermark"; // 要添加的文本
$font_path = "/usr/share/fonts/truetype/dejavu/DejaVuSans.ttf"; // 字体文件路径,请替换为你的系统路径
// Windows系统字体路径示例:C:/Windows/Fonts/simhei.ttf
// 构建FFmpeg命令
$command = "ffmpeg -i " . escapeshellarg($dest_path) . " -i " . escapeshellarg($watermark_image_path);
// 构建filter_complex,先overlay,再drawtext,用逗号分隔
$filter_complex = "[0:v][1:v]overlay=x=25:y=25"; // 图片水印位置
$filter_complex .= ",drawtext=fontfile=" . escapeshellarg($font_path) . ":text='" . $watermark_text . "':x=W-tw-25:y=H-th-25:fontcolor=white:fontsize=24"; // 文本水印位置 (右下角25px)
$command .= " -filter_complex " . escapeshellarg($filter_complex);
$result_filename = hash("sha256", (string)rand()) . ".mp4";
$command .= " -c:a copy " . escapeshellarg($output_dir . $result_filename);
echo "执行命令: " . $command . "
";
system($command, $return_var);
if ($return_var === 0) {
echo "图片和文本水印添加成功,输出文件: " . $output_dir . $result_filename . "
";
} else {
echo "水印添加失败,错误码: " . $return_var . "
";
}
?>关键点:
通过掌握FFmpeg的filter_complex和滤镜链的概念,我们可以轻松地将多个视频处理任务(如图片叠加和文本绘制)组合在一起。在PHP等编程语言中,通过构建和执行FFmpeg命令行,能够实现高度定制化的视频水印解决方案,满足各种业务需求。关键在于理解滤镜的输入输出关系,并利用逗号将它们有效地串联起来。
以上就是FFmpeg视频水印叠加:图片与文本并存实现指南的详细内容,更多请关注php中文网其它相关文章!
每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号