手里压着上千条视频,要在发布前统一加上品牌水印,一条条拖进剪辑软件改位置、调大小、导出,体力活不说,还容易漏。这次我们来看的这套方案,不是某个收费软件,也不是什么云服务,而是用 FFmpeg 加 Python 脚本组合出来的批量视频加水印流水线。它可以定点批量处理,支持自定义水印位置、大小、透明度,处理 1000 个视频只需要一条命令启动,跑完自动归档,适合短视频批量运营、教程视频品牌露出、企业内部培训素材统一打标这些场景。
这个方案最核心的 5 个特点:
- 完全免费,基于 FFmpeg 开源工具,不涉及付费授权。
- 支持批量任务,一个脚本循环处理整个目录的视频,不需要人工干预。
- 水印位置、大小、透明度、文字内容全部可自定义。
- 支持图片水印和文字水印两种模式。
- 可以接 API 或命令行调用,方便集成到已有业务系统里。
本文会带大家完成从 FFmpeg 安装、单视频加水印测试、批量脚本编写、API 接口封装到性能观察和问题排查的完整流程。对照步骤操作,最快十分钟就能把自己的批量加水印流水线跑起来。
下面开始正文。
1. 批量视频加水印核心能力速览
先明确一下这套方案的整体规格。下面的表里,凡是能确定的参数都写清楚了,不能确定的标注为需要按实际环境验证。
| 能力项 | 说明 |
|---|---|
| 方案类型 | FFmpeg + Python 脚本组合,非打包软件 |
| 主要功能 | 视频批量加水印,支持文字水印、图片水印、位置调整、大小调整、透明度调整 |
| 支持平台 | Windows、macOS、Linux |
| 输入格式 | MP4、MOV、MKV、AVI 等 FFmpeg 支持的常见视频格式 |
| 输出格式 | 默认 MP4,可自行调整编码参数 |
| 批量任务 | 支持整个目录批量处理,自动跳过已完成文件 |
| API 服务 | 支持封装为本地 HTTP 接口,由脚本调用 |
| 硬件要求 | CPU 即可运行,速度取决于视频分辨率和时长 |
| 显存要求 | 无,纯 CPU/GPU 转码,不依赖深度学习模型 |
| 启动方式 | 命令行 / Python 脚本 / HTTP 接口 |
| 水印类型 | 文字水印、PNG 图片水印 |
| 位置控制 | 九宫格定位,可微调坐标偏移 |
| 是否开源 | FFmpeg 开源,核心代码完全基于开源工具 |
从材料看,这套方案最突出的优势是免费、批量、可定制。相比在线工具,它不会把视频上传到第三方服务器,隐私风险更低,也没有单文件时长和数量限制。
2. 适用场景与使用边界
2.1 适合谁用
这个方案定位很清晰:批量视频处理场景下的标牌、打码、品牌露出。
- 短视频运营团队:几十上百条视频需要统一加片头品牌水印。
- 教育机构:录制课程批量添加机构名称。
- 企业培训部门:内部培训视频统一加公司 LOGO。
- 素材整理人员:给大量视频素材加拍摄时间、拍摄地点、项目编号等标识。
- 需要自动化流水线的开发者:把加水印逻辑嵌入视频发布系统。
2.2 能解决什么问题
- 解决手动打开剪辑软件一条条处理效率低的问题。
- 解决不同视频水印位置不统一、大小不一致的问题。
- 解决在线工具上传下载速度慢且有文件泄露风险的问题。
- 解决重复劳动容易漏处理视频的问题。
2.3 不适用于什么场景
- 动态水印、文字跑马灯效果,这个脚本方案需要额外扩展。
- 逐帧精细叠加复杂动画,比如水印随视频内容移动。
- 需要实时预览并手动调整的场景,建议先用剪辑软件。
- 对视频压缩质量有极高要求的场景,需要重新设计 FFmpeg 编码参数。
2.4 版权与合规边界
这里必须强调:批量加水印的合理使用前提,是你对视频内容拥有合法权利,或者已经取得版权方的书面授权。给他人视频擅自添加水印并进行传播,可能涉嫌侵犯著作权和信息网络传播权。涉及人脸、声音、商标等元素的视频,还需要确保肖像权、声音权和商标权使用已经获得授权。本文提供的脚本只用于测试环境下的视频标识处理,使用前请自行确认授权链条完整。
3. 批量视频加水印环境准备与前置条件
在动手之前,先把环境准备好。这个方案不挑机器,普通办公电脑都能跑,但有几个基础条件需要满足。
3.1 操作系统
Windows 10/11、macOS、主流 Linux 发行版均可。下面的命令以 Windows 和 Ubuntu 双平台给出,macOS 与 Linux 命令基本一致。
3.2 必需组件
| 组件 | 用途 | 安装优先级 |
|---|---|---|
| FFmpeg | 视频解码、水印叠加、编码输出 | 必须 |
| Python 3.8+ | 批量脚本调度、接口封装 | 建议安装 |
| Pillow 库 | 动态生成文字水印 PNG 图片 | 使用文字水印时建议安装 |
| HTTP 服务模块 | 本地 API 服务 | 需要接口调用时安装 |
3.3 检查 FFmpeg
安装完成后,先确认 FFmpeg 可执行文件已经加入系统 PATH。在命令行执行:
ffmpeg -version出现版本信息即可。如果提示找不到命令,说明没有加入 PATH,需要用完整路径调用,或者在系统环境变量里追加 FFmpeg 的 bin 目录。
3.4 磁盘空间
批量处理视频务必关注磁盘空间。FFmpeg 转码输出文件会占大量空间,建议:
- 预留至少等于所有待处理视频体积 1.5 倍的磁盘空间。
- 输入和输出目录分开,避免覆盖源文件。
- 处理完成后先抽查输出效果,再决定是否删除源文件。
3.5 端口规划
如果需要调用 API 接口,建议固定使用一个本地端口,例如 8000 或 9000。启动前用命令检查端口是否被占用。
Windows:
netstat -ano | findstr 8000Linux:
ss -lntup | grep 8000端口被占用时,换一个端口再启动。
4. 批量视频加水印安装部署与启动方式
4.1 安装 FFmpeg
Windows 用户推荐下载 FFmpeg 的 Windows 构建版本,解压后将 bin 目录加入系统 PATH。也可以通过 winget 安装:
winget install ffmpegmacOS 用户用 Homebrew:
brew install ffmpegUbuntu 用户:
sudo apt update sudo apt install ffmpeg验证安装:
ffmpeg -version安装成功后,先跑一个单视频加水印测试,确认 FFmpeg 能正常处理视频,再进行批量操作。
4.2 单视频加水印测试
这里先演示一条最基本的命令。
给视频加文字水印,位置在右下角:
ffmpeg -i input.mp4 -vf "drawtext=text='MyWatermark':x=w-tw-30:y=h-th-30:fontsize=36:fontcolor=white@0.7:fontfile='C\\:/Windows/Fonts/arial.ttf'" -codec:a copy output.mp4给视频加图片水印,位置在左上角:
ffmpeg -i input.mp4 -i logo.png -filter_complex "[1][0]scale2ref=w=iw/10:h=ow/10[logo][video];[video][logo]overlay=30:30" -codec:a copy output.mp4命令解释:
drawtext是 FFmpeg 的文字水印滤镜。x、y控制水印坐标。fontsize控制字号。fontcolor控制颜色和透明度。fontfile指定字体文件,Windows 需要转义路径分隔符。overlay是图片水印叠加滤镜。scale2ref将 LOGO 按视频宽度比例缩放。
先拿两三个短视频测试,确认水印效果没问题,再进入批量处理阶段。
4.3 编写批量加水印脚本
单条命令能跑通,接下来就可以脚本化。下面的 Python 脚本可以遍历指定目录,对每个 MP4 文件执行加水印命令,同时跳过已处理的文件。
import os import subprocess import sys INPUT_DIR = "./input" OUTPUT_DIR = "./output" WATERMARK_TEXT = "MyStudio" FONT_PATH = "C:/Windows/Fonts/arial.ttf" FONT_SIZE = 36 POSITION = "bottom_right" # top_left, top_right, bottom_left, bottom_right, center def get_position(align: str, margin: int = 30): if align == "top_left": return f"x={margin}:y={margin}" if align == "top_right": return f"x=w-tw-{margin}:y={margin}" if align == "bottom_left": return f"x={margin}:y=h-th-{margin}" if align == "bottom_right": return f"x=w-tw-{margin}:y=h-th-{margin}" if align == "center": return "x=(w-tw)/2:y=(h-th)/2" return f"x=w-tw-{margin}:y=h-th-{margin}" def build_command(input_path, output_path, text, font_path, font_size, position): pos = get_position(position) return [ "ffmpeg", "-y", "-i", input_path, "-vf", f"drawtext=text='{text}':{pos}:fontsize={font_size}:fontcolor=white@0.7:fontfile='{font_path}'", "-codec:a", "copy", output_path ] def main(): os.makedirs(OUTPUT_DIR, exist_ok=True) files = [f for f in os.listdir(INPUT_DIR) if f.lower().endswith((".mp4", ".mov", ".mkv", ".avi"))] print(f"共发现 {len(files)} 个视频") for index, filename in enumerate(files, start=1): input_path = os.path.join(INPUT_DIR, filename) output_path = os.path.join(OUTPUT_DIR, filename) if os.path.exists(output_path): print(f"[跳过] {filename} 已存在") continue cmd = build_command(input_path, output_path, WATERMARK_TEXT, FONT_PATH, FONT_SIZE, POSITION) print(f"[{index}/{len(files)}] 正在处理 {filename}") result = subprocess.run(cmd, stdout=subprocess.PIPE, stderr=subprocess.PIPE) if result.returncode != 0: print(f"[失败] {filename}") print(result.stderr.decode("utf-8", errors="ignore")[-500:]) else: print(f"[完成] {filename}") print("全部处理结束") if __name__ == "__main__": main()4.4 运行批量脚本
在脚本所在目录创建 input 和 output 两个文件夹,把所有待处理视频放入 input,然后执行:
python batch_watermark.py观察输出结果。每个视频处理完成会打印一行[完成],失败会打印[失败]并列出错误信息。批量处理期间可以随时 Ctrl+C 中断脚本,下次运行时它会自动跳过 output 目录里已经存在的文件,不用手动分辨哪些处理过。
4.5 支持图片水印的批量脚本改造
如果是给视频加 LOGO 图片,脚本需要做两处调整:一是将 drawtext 滤镜替换为 overlay 叠加滤镜,二是增加 LOGO 尺寸自适应逻辑。核心命令如下:
ffmpeg -i input.mp4 -i logo.png -filter_complex "[1][0]scale2ref=w=iw/10:h=ow/10[logo][video];[video][logo]overlay=30:30" -codec:a copy output.mp4配合 Python 脚本调用时,把build_command中的 drawtext 参数整体替换为 filter_complex 即可。
5. 批量视频加水印功能测试与效果验证
脚本写完以后,先用小批量测试,不要直接跑 1000 个视频。下面是一套标准的验证流程。
5.1 测试环境建议
- 准备 5 到 10 个短视频,分别使用不同分辨率(1280x720、1920x1080、720x1280)。
- 准备一个带透明通道的 PNG LOGO 文件。
- 记录测试开始前的磁盘剩余空间。
5.2 功能测试用例表
| 测试项 | 测试方式 | 预期结果 | 成功标准 |
|---|---|---|---|
| 文字水印 | 用默认参数处理一个 MP4 | 输出视频右下角出现白色文字 | 文字清晰可读,位置正确 |
| 图片水印 | 用 LOGO PNG 处理一个 MP4 | 输出视频左上角出现 LOGO | LOGO 不变形,半透明区域正常 |
| 位置自定义 | 修改 POSITION 参数 | 水印出现在指定九宫格位置 | 位置与预期一致 |
| 大小自定义 | 调整 FONT_SIZE 或 scale2ref 比例 | 水印大小变化 | 大小与预期一致 |
| 批量轮询 | 放入 5 个视频同时处理 | 全部输出到 output 目录 | 无失败记录 |
| 断点续跑 | 处理中途删除部分已输出文件,再跑脚本 | 只处理缺失文件 | 已存在文件未重复处理 |
5.3 判断输出质量
测试完成后,人工抽查输出视频:
- 播放第一个视频,确认水印位置没有压到画面主要内容。
- 检查水印透明度是否合适,太透明看不清,太实又遮挡画面。
- 检查视频音频是否保留,
-codec:a copy参数下一般不会丢音轨。 - 对比原视频和输出视频文件大小,如果输出文件异常偏大或者异常偏小,检查编码参数。
5.4 常见失败原因
| 失败现象 | 可能原因 | 排查方向 |
|---|---|---|
| ffmpeg 命令报 fontconfig 错误 | 字体路径不对 | 检查 FONT_PATH 是否正确 |
| 水印文字出现乱码 | 中文字体文件未指定或字体不支持 | 改用系统自带中文字体 |
| 视频处理速度极慢 | 编码参数选择了高复杂度预设 | 增加-preset veryfast |
| 输出文件没有声音 | 音频流编码失败 | 检查-codec:a copy是否生效 |
| 批量脚本中途退出 | 某个视频文件损坏 | 单独处理失败文件,查看具体报错 |
6. 批量视频加水印接口 API 调用示例
批量脚本跑通以后,如果还需要接入自己的业务系统,可以把加水印能力封装成 HTTP 接口。这里给出一套最小可用的 FastAPI 示例,接口接收视频路径或文件上传,返回处理结果。
6.1 安装 FastAPI 和 uvicorn
pip install fastapi uvicorn python-multipart6.2 创建 API 服务
import os import subprocess import uuid from fastapi import FastAPI, UploadFile, File, Form from fastapi.responses import JSONResponse app = FastAPI() UPLOAD_DIR = "./uploads" OUTPUT_DIR = "./outputs" FONT_PATH = "C:/Windows/Fonts/arial.ttf" os.makedirs(UPLOAD_DIR, exist_ok=True) os.makedirs(OUTPUT_DIR, exist_ok=True) @app.post("/watermark") async def add_watermark( file: UploadFile = File(...), text: str = Form("MyStudio"), position: str = Form("bottom_right"), font_size: int = Form(36) ): input_path = os.path.join(UPLOAD_DIR, f"{uuid.uuid4().hex}_{file.filename}") output_path = os.path.join(OUTPUT_DIR, f"{uuid.uuid4().hex}_{file.filename}") with open(input_path, "wb") as buffer: content = await file.read() buffer.write(content) pos_map = { "top_left": f"x=30:y=30", "top_right": f"x=w-tw-30:y=30", "bottom_left": f"x=30:y=h-th-30", "bottom_right": f"x=w-tw-30:y=h-th-30", "center": f"x=(w-tw)/2:y=(h-th)/2", } pos = pos_map.get(position, "x=w-tw-30:y=h-th-30") cmd = [ "ffmpeg", "-y", "-i", input_path, "-vf", f"drawtext=text='{text}':{pos}:fontsize={font_size}:fontcolor=white@0.7:fontfile='{FONT_PATH}'", "-codec:a", "copy", output_path ] result = subprocess.run(cmd, stdout=subprocess.PIPE, stderr=subprocess.PIPE) os.remove(input_path) if result.returncode != 0: return JSONResponse(status_code=500, content={ "success": False, "error": result.stderr.decode("utf-8", errors="ignore")[-500:] }) return JSONResponse(content={ "success": True, "output_file": os.path.basename(output_path), "output_url": f"/files/{os.path.basename(output_path)}" }) if __name__ == "__main__": import uvicorn uvicorn.run(app, host="127.0.0.1", port=8000)6.3 使用 curl 调用接口
curl -X POST http://127.0.0.1:8000/watermark \ -F "file=@test.mp4" \ -F "text=MyStudio" \ -F "position=bottom_right" \ -F "font_size=36"请求成功后返回 JSON:
{ "success": true, "output_file": "a1b2c3d4_test.mp4", "output_url": "/files/a1b2c3d4_test.mp4" }接口设计建议:
- 接口只监听
127.0.0.1,避免暴露到公网。 - 生产环境加鉴权,至少加一个简单的 Token 校验。
- 文件上传大小要限制,防止恶意消耗磁盘。
- 输出文件定期清理,避免积压占用空间。
6.4 批量任务队列设计
如果一次提交 1000 个视频,不要同步等待接口响应。推荐做法:
- 客户端把所有视频路径写入一个任务清单文件。
- 服务端逐个读取清单,调用 FFmpeg 处理。
- 每个视频处理完成后写日志和状态。
- 失败的任务记录错误信息,最后统一重试。
下面是一个简单的批量任务清单文件格式:
{ "tasks": [ {"input": "videos/001.mp4", "text": "MyStudio", "position": "bottom_right"}, {"input": "videos/002.mp4", "text": "MyStudio", "position": "bottom_right"}, {"input": "videos/003.mp4", "text": "MyStudio", "position": "top_left"} ] }Python 脚本读取该 JSON 后循环处理,并输出任务进度。
import json import subprocess with open("tasks.json", "r", encoding="utf-8") as f: data = json.load(f) for task in data["tasks"]: input_path = task["input"] output_path = input_path.replace(".mp4", "_watermark.mp4") position = task["position"] text = task["text"] cmd = [ "ffmpeg", "-y", "-i", input_path, "-vf", f"drawtext=text='{text}':x=w-tw-30:y=h-th-30:fontsize=36:fontcolor=white@0.7", "-codec:a", "copy", output_path ] print(f"正在处理 {input_path}") result = subprocess.run(cmd, stdout=subprocess.PIPE, stderr=subprocess.PIPE) if result.returncode != 0: print(f"失败: {input_path}") else: print(f"完成: {output_path}")7. 批量视频加水印资源占用与性能观察
批量处理大量视频时,资源占用直接决定任务耗时。这一节讲清楚怎么观察性能,以及如何控制资源占用。
7.1 观察指标
- CPU 使用率:FFmpeg 转码是 CPU 密集型任务,多核 CPU 能显著提高速度。
- 内存占用:一般视频转码内存占用不高,2 到 4 GB 足够。
- 磁盘 IO:输入输出同时读写,机械硬盘可能成为瓶颈。
- GPU 占用:如果 CPU 支持 Intel Quick Sync Video 或 NVIDIA NVENC,可以启用硬件编码加速。
7.2 如何增加硬件加速选项
FFmpeg 支持多种硬件编码器,启用后可以明显提升处理速度。示例命令:
ffmpeg -i input.mp4 -vf "drawtext=text='MyStudio':x=w-tw-30:y=h-th-30:fontsize=36:fontcolor=white@0.7" -c:v h264_nvenc -codec:a copy output.mp4重要提醒:h264_nvenc需要 NVIDIA 显卡驱动和 FFmpeg 编译版本支持。不是所有 FFmpeg 版本都包含该编码器,先执行ffmpeg -encoders | findstr nvenc检查。Intel 核显可以用h264_qsv,macOS 可以用h264_videotoolbox。
不同硬件的编码质量存在差异,在正式批量前先测试编码器是否可用、画质是否满足要求。
7.3 如何降低资源占用
- 使用
-preset veryfast降低编码复杂度,速度提升明显,文件体积略增。 - 分批次处理,每次 100 个视频,不要一次性提交全部任务。
- 控制并发数,不建议同时启动多个 FFmpeg 进程,除非 CPU 核数很多。
- 设置
-threads 4之类参数,限制单任务占用核数。
7.4 处理时间预估
视频处理时间和分辨率、时长、编码参数强相关。经验值参考:
- 1080P、10 分钟视频、CPU 软编码,大约需要 2 到 5 分钟。
- 720P、5 分钟视频,大约需要 1 到 3 分钟。
- 启用 NVENC 硬件编码,时间通常可以缩短一半以上。
注意:以上是估算范围,不是精确数据,实际速度以本机测试为准。
7.5 进程残留排查
批量跑完后,检查是否有 FFmpeg 进程残留:
Windows:
tasklist | findstr ffmpegLinux:
ps aux | grep ffmpeg如果存在残留进程,确认任务已经结束后手动结束,避免占用后续任务的 CPU 资源。
8. 批量视频加水印常见问题与排查方法
批量任务跑得多了,总会遇到各种问题。这里整理一份排查清单,建议收藏。
| 问题现象 | 可能原因 | 排查方式 | 解决方案 |
|---|---|---|---|
| ffmpeg 命令找不到 | 未加入 PATH | 执行ffmpeg -version | 配置环境变量或使用完整路径 |
| 水印文字乱码 | 字体不支持中文 | 查看控制台日志字体加载情况 | 指定中文字体路径,如C:/Windows/Fonts/msyh.ttc |
| 输出文件体积异常大 | 未设置比特率控制 | 查看输出文件参数 | 增加-crf 23 -preset veryfast |
| 输出视频没有声音 | 音频流编码失败 | 查看 ffmpeg stderr 输出 | 将-codec:a copy改为-codec:a aac |
| 处理到某个视频卡住 | 视频文件损坏或编码参数异常 | 单独对该文件执行 ffmpeg | 修复文件或跳过该任务 |
| 批量脚本报 PermissionError | 输出目录无写权限 | 检查目录权限 | 修改目录权限或更换输出位置 |
| 接口服务启动失败 | 端口被占用 | 检查端口占用 | 更换端口 |
| 水印位置不在预期位置 | 分辨率比例导致坐标偏移 | 实际输出对比 | 调整 margin 值 |
| 处理速度越来越慢 | 磁盘剩余空间不足 | 检查磁盘空间 | 清理磁盘或扩容 |
| 图片水印拉伸变形 | overlay 未做比例缩放 | 检查 filter_complex 参数 | 使用scale2ref按比例缩放 |
9. 批量视频加水印最佳实践与使用建议
批量处理 1000 个视频这种工作量,必须从一开始就建立工程意识。
9.1 目录结构规范
建议目录结构如下:
video-watermark/ ├── input/ # 待处理视频 ├── output/ # 处理完成视频 ├── logo/ # 水印图片素材 ├── logs/ # 处理日志 ├── tasks/ # 批量任务清单 ├── batch_watermark.py └── api_server.py这样好处是文件归档清晰,排查问题时能快速定位是输入源问题、脚本问题还是输出质量问题。
9.2 先小规模验证再全量跑
第一次批量处理,先放 10 个视频测试,确认水印效果、处理速度、输出质量都达标,再放全部视频。全量跑之前清空 output 目录,避免旧文件干扰。
9.3 日志管理
批量任务一定要加日志。Python 脚本可以用 logging 模块输出到文件:
import logging logging.basicConfig( filename="logs/batch.log", level=logging.INFO, format="%(asctime)s %(levelname)s %(message)s" ) logging.info("开始处理视频...") logging.info(f"正在处理 {filename}") logging.error(f"失败: {filename}")这样即使任务中断,也能从日志里看进度和失败原因。
9.4 失败重试机制
批量脚本中加入失败重试队列,处理失败的视频单独记录,全量跑完后统一重试:
failed_list = [] # 处理失败时 failed_list.append(input_path) # 全部结束后重试 for retry_path in failed_list: # 重新执行 ffmpeg 命令 pass9.5 安全边界
- 接口服务不要监听
0.0.0.0,只绑定127.0.0.1。 - 上传目录设置最大文件大小限制。
- 输出目录定期归档,防止磁盘写满。
- 涉及人脸、声音、商标、版权的视频素材,必须在获得授权后处理。
9.6 效果复核要求
批量处理完成后,按至少 5% 的比例抽查输出视频。重点检查:
- 水印是否出现在所有抽查视频中。
- 水印位置是否统一。
- 视频声音是否正常。
- 视频分辨率、帧率是否与原片一致。
如果抽检发现水印缺失,说明脚本中可能有部分视频使用了不同编码路径,需要检查 FFmpeg 日志。
10. 总结与下一步
回到开头的问题:1000 个视频怎么快速加水印?答案不是某个神秘工具,而是 FFmpeg 加 Python 脚本的批量流水线。它能自定义位置、大小、透明度,支持文字和图片两种水印模式,CPU 就能跑,还能封装成 HTTP 接口供业务系统调用,属于实用性很强的技术方案。
最先应该验证的功能很简单:拿一条视频跑通文字水印命令,再跑通图片水印命令,确认滤镜参数没有问题后,直接放 50 个视频测试批量脚本。最容易踩的坑是字体路径写错导致乱码,以及-codec:a copy在个别视频上音频失效,排查时先看 FFmpeg 的 stderr 输出,错误信息都会指向具体原因。
下一步可以在这个基础上扩展的方向不少:一是把脚本改造成带 Web 管理页面的服务,上传视频选择水印配置后直接提交任务;二是接入消息队列处理大规模任务,每个任务独立调度;三是结合文件名规则自动注入日期、项目编号、作者信息等动态水印内容;四是增加预览功能,处理前先生成一帧水印效果图,确认后再提交全量任务。
建议收藏这套流程,等真的需要批量处理视频时可以直接照着搭。整个方案没有商业授权限制,完全基于开源工具,适合作为个人或小团队的视频处理基础设施长期使用。