Lua调用FFmpeg为上传的视频添加水印

在多媒体处理的领域中,视频水印是一种常用的技术,用于在视频内容中添加标识、版权信息或广告等。通过Lua脚本与 FFmpeg 的结合,可以自动化地实现这一过程,为即将上传的视频文件添加水印。

FFmpeg简介

FFmpeg是一个开源的多媒体框架,它提供了丰富的命令行工具,用于录制、转换以及流式传输音视频。FFmpeg让转换视频和音频变得非常简单。

Lua脚本与FFmpeg的结合

Lua是一种轻量级的脚本语言,因其简单易学且性能卓越而被广泛应用于各种自动化脚本编写中。通过将Lua脚本与FFmpeg结合使用,可以编写出灵活且强大的视频处理脚本,实现包括添加水印在内的多种视频处理功能。

实现步骤

  1. 安装FFmpeg

首先,确保系统中已经安装了FFmpeg。FFmpeg的官方网站提供了各种平台的安装包和编译指导。也可以参考之前的文章《 FFmpeg实战指南:快速上手常用操作 》。

  1. 编写Lua脚本 在Lua脚本中,可以使用os.execute函数来调用FFmpeg命令行工具。通过构造FFmpeg的命令行参数,可以指定要处理的视频文件、水印图片或文字、水印位置等参数。

添加图片水印示例:

local input_video = "input.mp4"  -- 输入视频文件路径
local watermark_image = "watermark.png"  -- 水印图片路径
local output_video = "output.mp4"  -- 输出视频文件路径
local cmd = string.format("ffmpeg -i %s -i %s "
    .. "-filter_complex \"overlay=50:50\" %s",
    input_video, watermark_image, output_video)
os.execute(cmd)

上述脚本通过-filter_complex定义一个复合过滤器(用于多个输入和/或输出),使用overlay=x:y将水印图片覆盖到视频上x:y所示坐标位置,本例为左上角且距离视频边缘50像素的位置。

可以根据视频和水印的大小,使用表达式计算水印的位置。表达式中,使用main_w表示视频(主体)宽度,overlay_w表示水印图片(覆盖层)宽度,main_h和overlay_h则分别表示高度。例如,水印居中的表达式如下:

overlay=(main_w-overlay_w)/2:(main_h-overlay_h)/2

水印在右上角且距离边缘10像素的表达式如下:

overlay=main_w-overlay_w-10:10

添加文字水印示例:

local input_video = "input.mp4"
local output_video = "output.mp4"
local watermark_text = "XX专用"
local fontfile = "/path/to/font.ttf"
local fontsize = 24
local fontcolor = "white"
local x = 10
local y = 10
local cmd = string.format("ffmpeg -i %s -vf "
    .. "\"drawtext=fontfile=%s:text='%s':"
    .. "fontsize=%s:fontcolor=%s:x=%s:y=%s\" %s",
    input_video, fontfile, watermark_text,
    fontsize, fontcolor, x, y, output_video)
os.execute(cmd)

-vf选项是-filter:v选项的别名,用于定义一个视频流过滤器(v表示视频流)。该过滤器使用drawtext在视频流中添加文字水印,后面是使用冒号分隔的水印属性键值对,依次是字体、文本内容、字号、颜色、x和y坐标,可以根据需要调整参数。

  1. 执行Lua脚本

将Lua脚本保存为文件,并在命令行中通过Lua解释器运行它。例如:

lua v_add_watermark.lua

将脚本配置到Nginx配置文件中,并且修改脚本,从http请求参数中获取输入视频文件名称,结合配置参数,就可以实现为上传的视频文件添加水印。使用方法可以参考文末相关阅读。

注意事项

确保FFmpeg的可执行文件路径在系统的PATH环境变量中,或者在Lua脚本中明确指定FFmpeg的路径。

对于文字水印,确保指定的字体文件在系统中是可用的。

图片水印和文字水印不能同时使用,否则会收到错误“Simple and complex filtering cannot be used together for the same stream.”。可以使用convert先在水印图片中添加文字,再为视频添加图片水印。