使用 ffmpeg 给视频批量加图片水印

server/2024/12/18 13:18:48/

背景

事情是这样的……前两天突然接到 leader 给的一个任务:给视频加上图片 logo 水印。我这种剪映老司机当然迷之一笑了哈哈哈哈哈,沉浸在简单的任务中还没反应过来巴掌就如洪水般涌来,因为 leader 给了几十个视频……作为一个计算机人,当然要搞脚本了!!!于是便有了今天的这篇博客。

ffmpeg_2">ffmpeg

ffmpeg_3">什么是 ffmpeg

FFmpeg is a free and open-source software project consisting of a suite of libraries and programs for handling video, audio, and other multimedia files and streams. Its core is the command-line ffmpeg tool itself, designed for processing video and audio files. @https://en.wikipedia.org/wiki/FFmpeg

说白了 ffmpeg 就是一套用于处理视频、音频的工具。

ffmpeg_7">为什么要使用 ffmpeg

ffmpeg 是许多多媒体库和工具(例如 Pythonmoviepyopencv)的核心组件,用于处理底层音视频操作。对于程序员来说,它可以通过代码实现复杂的多媒体处理功能,非常高效。

ffmpeg__9">ffmpeg 官网

既然是很大的开源软件,那一定有自己的官网:https://www.ffmpeg.org/

ffmpeg_11">MacOS 安装 ffmpeg

直接在macTerminal 中按照如下步骤安装:

  • Step1:使用 Homebrew 安装 ffmpeg
brew install ffmpeg
  • Step 2: 验证安装
ffmpeg -version

ffmpeg__21">使用 ffmpeg 给视频加图片水印

在要加水印的视频所在文件夹打开 Terminal,输入以下指令即可:

ffmpeg -i input.mp4 -i watermark.png -filter_complex "[1:v]scale=iw*0.5:-1[wm];[wm]format=rgba,colorchannelmixer=aa=1[wm_alpha];[0:v][wm_alpha]overlay=15:-50" -c:v libx264 -preset slow -crf 18  -c:a copy output.mp4

各项参数含义如下:

  • -i 指定输入文件。两个-i 一个输入要加水印的视频,一个指定水印图片
  • -filter_complex 用于定义复杂的过滤器链,包含多个处理步骤
  • [1:v]scale=iw*0.5:-1[vm]
    [1:v] 表示使用第二个输入 watermark.png 的视频流
    scale=iw*0.5:-1 表示将水印图片的宽度(iwinput width)缩小到原始宽度的50%,高度自动按比例调整(-1 表示自动保持宽高比)
    [wm] 定义了一个临时名称,表示缩放后的水印输出。
  • [wm]format=rgba,colorchannelmixer=aa=1[wm_alpha]
    [wm] 接收上一步生成的水印
    format = rgba 确保水印的格式是 RGBA 支持透明通道 (不支持透明通道的图片格式为RGB)
    colorchannelmixer=aa=1 调整水印的透明度,aa=1表示设置水印完全不透明
    [wm_alpha] 定义一个临时名称,表示处理后的水印输出
  • [0:v][wm_alpha]overlay=15:-50
    [0:v] 使用第一个输入input.mp4 的视频流
    [wm_alpha] 使用刚刚处理后的水印
    overlay = 15:-50 将水印图片叠加到视频上时,overlay 用于确定位置,15 表示水印距离视频左侧15像素。-50 表示水印距离视频上方50像素(负值表示超出视频范围)。
    如果想让水印放在视频的右下角,可以使用 overlay = W-w-10:H-h-10,其中 W 是视频的宽度, H 是视频的高度, w 是水印图片的宽度, h 是水印图片的高度, 10 是距离右下角的边距,可以根据需求调整。
  • -c:v libx264 指定使用 libx264 编码器对输出视频进行压缩,libx264 是一种高效的视频编码格式,支持多种质量和压缩比配置。
  • -preset slow 设置编码速度与压缩效率的平衡。slow 设置编码速度较慢,但能提供更高的压缩率和更好的视频质量。
  • -crf 18 指定编码的恒定质量参数(CRF,Constant Rate Factor)。18 是一个较低的 CRF 值,表示更高的视频质量(范围是 0-51,值越低质量越高,文件越大)。
  • -c:a copy 保留输入视频的音频流,直接拷贝到输出文件中,避免重新编码。
  • output.mp4 输出文件,不过这里不用 -o

这些参数可以按需调整。

批量加水印

创建一个名为add_watermark.sh 的脚本文件,内容如下:

#!/bin/bash# 设置文件夹路径和水印图片路径
INPUT_DIR="path/to/your/input/folder"
WATERMARK="path/to/your/watermark.png"
OUTPUT_DIR="path/to/your/output/folder"# 创建输出文件夹(如果不存在)
mkdir -p "$OUTPUT_DIR"# 遍历文件夹中的所有视频文件
for video_file in "$INPUT_DIR"/*.mp4; do# 获取视频文件名filename=$(basename -- "$video_file")filename_no_ext="${filename%.*}"# 输出文件路径output_file="$OUTPUT_DIR/$filename_no_ext-watermarked.mp4"# 使用 ffmpeg 添加水印ffmpeg -i "$video_file" -i "$WATERMARK" -filter_complex "overlay=10:15" "$output_file"
done
  1. 替换 "path/to/your/input/folder" 为视频文件的实际路径。
  2. 替换 "path/to/your/watermark.png" 为水印的图片路径。
  3. 设置 "path/to/your/output/folder" 为保存处理过的视频文件的路径。

在命令行中进入到脚本所在的目录,并运行:

chmod +x add_watermark.sh
./add_watermark.sh

这段脚本会遍历文件夹下的所有 .mp4 视频文件,将每个视频文件加上水印并保存到指定的输出文件夹中。

补充小知识

为什么 [1:v] 是使用第二个输入流

ffmpeg 中,输入流的索引是从 0 开始计数的,按照输入文件的顺序进行编号。第一个输入文件 -i input.mp4 的索引为 0,第二个输入文件 -i watermark.png 的索引为 1。所以 [0:v] 表示第一个文件的视频流,[1:v] 表示第二个文件的视频流。如果mp4文件还有音频,则 [0:a] 表示它的音频流。
例如,如果我们有如下命令:

ffmpeg -i video.mp4 -i audio.mp3 -i logo.png ...

流的索引会是:

  1. video.mp4
  • [0:v]:视频流。
  • [0:a]:音频流(如果有)。
  1. audio.mp3
  • [1:a]:音频流(mp3 文件只有音频,没有视频)。
  1. logo.png
  • [2:v]:图片流(图片被视为单帧视频流)。

http://www.ppmy.cn/server/151180.html

相关文章

20241217使用M6000显卡在WIN10下跑whisper来识别中英文字幕

20241217使用M6000显卡在WIN10下跑whisper来识别中英文字幕 2024/12/17 17:21 缘起,最近需要识别法国电影《地下铁》的法语字幕,使用 字幕小工具V1.2【whisper套壳/GUI封装了】 无效。 那就是直接使用最原始的whisper来干了。 当你重装WIN10的时候&#…

前后端分离的项目使用nginx 解决 Invalid CORS request

我是这样打算的,前端用nginx代理,使用80 转443 端口走https 前端的地址就是http://yumbo.top 或https://yumbo.top 后端服务地址是:http://yumbo.top:8081 下面是我的完整配置,功能是正常的,加了注释 user nginx; …

蓝桥杯数列求值(2019试题C)

【问题描述】 给定数列1,1,1,3,5,7,17……从第4项开始,每项都是前3项的和。求第20190324项的最后4位数字。 【答案提交】 这是一道结果填空题,考生只需要计算出结果并提交即可。本题的结果为一个4位整数(提示:答案的千位不为0)&a…

华为ensp--BGP路径选择-Preferred Value

学习新思想,争做新青年。今天学习的是BGP路径选择-Preferred Value 实验目的 理解BGP路由信息首选值(Preferred Value)的作用 掌握修改Preferred Value属性的方法 掌握通过修改Preferred Value属性来实现流量分担的方法 实验拓扑 实验要求…

高效数据集成:钉钉与企业系统无缝对接

钉钉数据集成案例分享:鸿巢基础资料-供应商账号(删除操作) 在企业信息化管理中,数据的准确性和及时性至关重要。本文将聚焦于一个具体的系统对接集成案例——钉钉数据集成到钉钉,详细探讨如何通过轻易云数据集成平台实现“鸿巢基础资料-供应…

Linux应用开发————mysql数据库

数据库概述 什么是数据库(database)? 数据库是一种数据管理的管理软件,它的作用是为了有效管理数据,形成一个尽可能无几余的数据集合,并能提供接口,方便用户使用。 数据库能用来干什么? 顾名思义,仓库就是用来保存东…

JS设计模式之访问者模式

前言 访问者模式(Visitor Pattern)是一种 行为设计模式,它允许在不改变对象结构的情况下,定义新的操作。 这种模式通过将操作封装在访问者对象中,使得可以在不修改被访问对象的情况下,增加新的功能。 本…

AI、大数据、机器学习、深度学习、神经网络之间的关系

AI、大数据、机器学习、深度学习、神经网络之间的关系 一、人工智能(AI)的概念 人工智能是指通过计算机程序或机器来模拟、实现人类智能的技术和方法。它旨在使计算机具备感知、理解、判断、推理、学习、识别、生成、交互等类人智能的能力,…