当前位置: 首页 > news >正文

一个基于 Node.js 和 FFmpeg 的视频合并 CLI 工具,支持为视频添加片头、片尾,以及批量处理多个视频文件。

Video Merger CLI (vvm)

一个基于 Node.js 和 FFmpeg 的视频合并 CLI 工具,支持为视频添加片头、片尾,以及批量处理多个视频文件。

功能特性

  • 视频合并:将两个视频合并为一个(支持开头或结尾位置)
  • 批量处理:批量处理目录下的所有视频文件
  • 灵活配置:支持命令行参数和配置文件两种方式
  • 素材管理:独立管理片头、片尾等素材
  • 规则匹配:支持按文件名模式应用不同的处理规则
  • 全局安装:可作为全局命令行工具使用

前置要求

  • Node.js >= 16.0.0
  • FFmpeg(必须已安装并添加到系统环境变量)

安装 FFmpeg

Windows:

# 使用 Chocolateychocoinstallffmpeg# 或从官网下载: https://ffmpeg.org/download.html

macOS:

brewinstallffmpeg

Linux:

sudoapt-getinstallffmpeg

安装

全局安装(推荐)

npminstall-g @yeah126139163/video-merger-cli

本地开发

# 克隆项目gitclone<repository-url>cdvvm# 安装依赖npminstall# 构建项目npmrun build# 链接到全局npmlink

快速开始

1. 合并两个视频

vvm merge video1.mp4 video2.mp4 output.mp4

video2.mp4合并到video1.mp4的结尾,输出为output.mp4

参数说明

  • <video1>: 第一个视频文件路径
  • <video2>: 第二个视频文件路径
  • [output]: 输出文件路径(默认:output.mp4)
  • -p, --position <position>: 合并位置,start 或 end(默认:end)

示例

# 合并到开头vvm merge video1.mp4 video2.mp4 output.mp4 -p start# 合并到结尾(默认)vvm merge video1.mp4 video2.mp4 output.mp4 -p end

2. 批量处理视频

vvm batch ./videos -i intro.mp4 -o outro.mp4 -d output

批量处理./videos目录下的所有视频,为每个视频添加片头intro.mp4和片尾outro.mp4,输出到output目录。

参数说明

  • [inputDir]: 输入目录路径
  • -i, --intro <path>: 片头视频路径
  • -o, --outro <path>: 片尾视频路径
  • -d, --dir <path>: 输出目录路径(默认:输入目录/output)
  • -c, --config <path>: 配置文件路径(使用配置文件时优先)

示例

# 只添加片头vvm batch ./videos -i intro.mp4 -d output# 只添加片尾vvm batch ./videos -o outro.mp4 -d output# 同时添加片头和片尾vvm batch ./videos -i intro.mp4 -o outro.mp4 -d output

3. 使用配置文件批量处理

# 创建配置文件模板vvm init -f my-config.json# 使用配置文件批量处理vvm batch -c my-config.json

配置文件说明

配置文件使用 JSON 格式,提供更灵活的批量处理规则。

目录结构建议

建议按照以下结构组织项目文件:

your-project/ ├── assets/ # 素材目录 │ ├── intro.mp4 # 片头视频 │ ├── outro.mp4 # 片尾视频 │ └── watermark.png # 水印图片(可选) ├── videos/ # 待处理的视频目录 │ ├── video1.mp4 │ └── video2.mp4 ├── output/ # 输出目录(自动创建) ├── vvm.config.json # 配置文件 └── README.md

配置文件结构

{"materials":{"intro":{"path":"./assets/intro.mp4","enabled":true},"outro":{"path":"./assets/outro.mp4","enabled":true},"watermark":{"path":"./assets/watermark.png","enabled":false}},"batchRules":[{"pattern":"*.mp4","applyIntro":true,"applyOutro":true,"outputDir":"./output"},{"pattern":"special_*.mp4","applyIntro":false,"applyOutro":true,"outputDir":"./output/special"}],"output":{"format":"mp4","codec":"libx264","quality":"high"}}

配置项说明

materials(素材配置)

  • intro: 片头视频

    • path: 片头文件路径
    • enabled: 是否启用(true/false)
  • outro: 片尾视频

    • path: 片尾文件路径
    • enabled: 是否启用(true/false)
  • watermark: 水印图片(预留功能,暂未实现)

    • path: 水印文件路径
    • enabled: 是否启用(true/false)
batchRules(批量规则)

数组形式,支持多个规则。每个规则包含:

  • pattern: 文件匹配模式(支持 glob 语法)

    • *.mp4: 匹配所有 mp4 文件
    • special_*.mp4: 匹配以 special_ 开头的 mp4 文件
    • **/*.mp4: 递归匹配所有子目录的 mp4 文件
  • applyIntro: 是否应用片头(true/false)

  • applyOutro: 是否应用片尾(true/false)

  • outputDir: 输出目录路径

output(输出配置)

  • format: 输出格式(如:mp4)
  • codec: 编码器(如:libx264)
  • quality: 质量设置(如:high, medium, low)

配置文件示例

示例 1:简单批量处理

{"materials":{"intro":{"path":"./assets/intro.mp4","enabled":true},"outro":{"path":"./assets/outro.mp4","enabled":true}},"batchRules":[{"pattern":"*.mp4","applyIntro":true,"applyOutro":true,"outputDir":"./output"}],"output":{"format":"mp4","codec":"libx264","quality":"high"}}

示例 2:多规则处理

{"materials":{"intro":{"path":"./assets/intro.mp4","enabled":true},"outro":{"path":"./assets/outro.mp4","enabled":true}},"batchRules":[{"pattern":"*.mp4","applyIntro":true,"applyOutro":true,"outputDir":"./output"},{"pattern":"preview_*.mp4","applyIntro":false,"applyOutro":false,"outputDir":"./output/preview"},{"pattern":"final_*.mp4","applyIntro":true,"applyOutro":true,"outputDir":"./output/final"}],"output":{"format":"mp4","codec":"libx264","quality":"high"}}

命令参考

vvm merge

合并两个视频文件。

vvm merge<video1><video2>[output][options]

选项

  • -p, --position <position>: 合并位置(start/end),默认:end

示例

vvm merge video1.mp4 video2.mp4 merged.mp4 vvm merge video1.mp4 video2.mp4 merged.mp4 -p start

vvm batch

批量处理目录下的视频文件。

vvm batch[inputDir][options]

选项

  • -i, --intro <path>: 片头视频路径
  • -o, --outro <path>: 片尾视频路径
  • -d, --dir <path>: 输出目录路径
  • -c, --config <path>: 配置文件路径

示例

vvm batch ./videos -i intro.mp4 -d output vvm batch ./videos -o outro.mp4 -d output vvm batch ./videos -i intro.mp4 -o outro.mp4 -d output vvm batch -c config.json

vvm init

创建配置文件模板。

vvm init[options]

选项

  • -f, --file <path>: 配置文件路径,默认:vvm.config.json

示例

vvm init vvm init -f my-config.json

vvm --help

显示帮助信息。

vvm --help vvm merge --help vvm batch --help

vvm --version

显示版本信息。

vvm --version

使用场景

场景 1:为视频添加统一片头

vvm batch ./my_videos -i ./assets/intro.mp4 -d ./output

场景 2:为视频添加片尾

vvm batch ./my_videos -o ./assets/outro.mp4 -d ./output

场景 3:为不同类型的视频应用不同规则

使用配置文件config.json

{"materials":{"intro":{"path":"./assets/intro.mp4","enabled":true},"outro":{"path":"./assets/outro.mp4","enabled":true}},"batchRules":[{"pattern":"tutorial_*.mp4","applyIntro":true,"applyOutro":true,"outputDir":"./output/tutorials"},{"pattern":"demo_*.mp4","applyIntro":true,"applyOutro":false,"outputDir":"./output/demos"}],"output":{"format":"mp4","codec":"libx264","quality":"high"}}

执行:

vvm batch -c config.json

场景 4:合并两个视频

vvm merge part1.mp4 part2.mp4 full_video.mp4

工作原理

  1. 视频合并:使用 FFmpeg 的concat功能将两个视频合并为一个
  2. 批量处理:使用 glob 模式匹配文件,逐个处理
  3. 片头/片尾:通过控制合并顺序实现(添加到开头或结尾)
  4. 临时文件:同时添加片头和片尾时,会创建临时文件进行中间处理
  5. 统一编码参数:在合并前,系统会自动将所有视频重新编码为统一的参数(分辨率、帧率、编码格式等),确保视频兼容性和播放质量
  6. 时间戳修复:使用-fflags +genpts-avoid_negative_ts参数修复视频时间戳问题,支持拖动进度条
  7. 输出文件命名:批量处理时,输出文件名与原文件名保持一致,仅扩展名统一为.mp4。例如:video1.mov处理后输出为video1.mp4

注意事项

  1. FFmpeg 要求:必须安装 FFmpeg 并添加到系统环境变量
  2. 文件路径:建议使用绝对路径,或确保相对路径正确
  3. 输出目录:输出目录不存在时会自动创建
  4. 文件格式:建议使用相同的视频格式和编码器
  5. 临时文件:处理完成后会自动删除临时文件
  6. 磁盘空间:确保有足够的磁盘空间存储输出文件
  7. 视频编码:系统会自动统一视频编码参数,处理时间可能较长
  8. 播放器兼容性:生成的视频支持所有主流播放器(VLC、Windows Media Player、PopPlayer 等)
  9. 进度条支持:生成的视频支持拖动进度条和时间跳转

故障排除

问题 1:提示 “FFmpeg not found”

解决方案

  • 检查 FFmpeg 是否已安装:ffmpeg -version
  • 确保 FFmpeg 已添加到系统环境变量

问题 2:合并后的视频质量下降

解决方案

  • 系统会自动统一编码参数,确保质量
  • 如果仍然不满意,可以调整源视频的质量设置

问题 3:批量处理速度慢

解决方案

  • 由于需要重新编码视频,处理时间较长是正常的
  • 减少同时处理的视频数量
  • 确保系统有足够的 CPU 和内存资源

问题 4:某些视频无法合并

解决方案

  • 系统会自动统一编码参数,大多数视频都能正常合并
  • 如果仍然失败,使用 FFprobe 检查视频信息:ffprobe -i video.mp4
  • 确保视频文件没有损坏

问题 5:合并后的视频无法拖动进度条

解决方案

  • 系统已自动修复时间戳问题,支持拖动进度条
  • 如果仍然有问题,请尝试使用 VLC 播放器
  • 确保视频文件已完全生成(检查文件大小是否正常)

问题 6:合并后的视频画面不显示

解决方案

  • 系统已统一编码参数,确保画面正常显示
  • 如果仍然看不到画面,请尝试使用 VLC 或 Windows Media Player
  • 检查视频文件是否完整(文件大小应该大于几 MB)

开发

项目结构

vvm/ ├── bin/ │ └── vvm # CLI 入口文件 ├── src/ │ ├── index.ts # 主入口 │ ├── merger.ts # 视频合并核心逻辑 │ └── batch.ts # 批量处理逻辑 ├── dist/ # 编译输出目录 ├── package.json ├── tsconfig.json └── README.md

开发命令

# 安装依赖npminstall# 开发模式npmrun dev# 构建项目npmrun build# 链接到全局npmlink

许可证

MIT

贡献

欢迎提交 Issue 和 Pull Request!

更新日志

1.1.0 (2026-01-07)

  • 📝 优化文档,修复包名不一致问题
  • 📝 添加作者信息到 package.json
  • 📝 补充项目目录结构说明
  • 📝 补充输出文件命名规则说明
  • 🎨 改进文档结构,提高可读性

1.0.0 (2026-01-07)

  • ✨ 初始版本发布
  • ✅ 支持视频合并功能
  • ✅ 支持批量处理
  • ✅ 支持配置文件
  • ✅ 支持片头/片尾独立配置
  • ✅ 支持规则匹配
  • 🔧 统一视频编码参数,确保合并兼容性
  • 🔧 修复视频时间戳问题,支持拖动进度条
  • 🔧 优化输出文件名,与原文件名保持一致
  • 🔧 使用 concat demuxer 提高合并效率
http://www.jsqmd.com/news/212396/

相关文章:

  • [特殊字符]_网络IO性能优化:从TCP到HTTP的层层优化[20260107164433]
  • AI改图工具实操,冬装白底图快速生成高点击场景图
  • 电影解说从0到1,要准备哪些工具?一套能跑通的实战清单
  • ⚡_延迟优化实战:从毫秒到微秒的性能突破[20260107164942]
  • SQLi-Labs搭建及通关
  • [特殊字符]_可扩展性架构设计:从单体到微服务的性能演进[20260107163924]
  • [特殊字符]_压力测试与性能调优的完整指南[20260107165451]
  • 一文讲清:主流大模型推理部署框架:vLLM、SGLang、TensorRT-LLM、ollama、XInference
  • 豆包本地文件问答下线后的打开方法
  • NestJS 中动态 Swagger 参数文档的实现
  • 【光子AI 2026 企业级 Agent 架构指南】别再把 Skill 当 Tool:Agent Skills × MCP 企业级落地全指南(最新定义澄清 + 场景大全 + 选型决策树+安全工程清单)
  • 格雷希尔:G15F-KFYK-FD39 定制款快速密封连接器,适配自动化产线,赋能电驱动通讯接口的自动化密封测试
  • 如何判断光耦 PC817 的好坏
  • Go 语言的“舒适区”:为何在这张“鄙视链”金字塔中,Go 仅次于 C?
  • 大模型AI学习路线:从提示词工程到模型部署的全栈教程,90天变身高薪工程师
  • 什么是企业机器人流程自动化RPA
  • 【分布式系统】02 现实世界的法则 —— 分布式系统的定义、模型与核心挑战
  • 分区操作系统、容器化、虚拟机的概念
  • 2025年广州市“人工智能+”典型案例集|附118页PDF文件下载
  • FastAPI + LangGraph + Multi-Agent 完整工程源代码实现:含真实目录结构, Gateway / Agent / Tool / Memory 分层,完整源代码实现
  • 自定义封装tabs,超出显示上下翻页按钮
  • ArkUI-X 6.0 跨平台框架能否取代 Flutter?
  • 2026年人工智能全景报告|附34页PDF文件下载
  • 还在只会 add/commit/push?醒醒吧:这 15 条 Git 命令,能把你从“记录员”直接抬成“仓库法师”
  • 自定义tabs(支持横向/竖向排列)
  • 什么是MD-CLI
  • 小文件自动化处理流程
  • 2026大模型风口已至!产品经理学习路线+免费资料,助你月薪30K+,建议收藏!
  • 金属导电涂层双极板垂直比电阻仪
  • C++中的指针与内存管理