VideoConcat/docs/项目文档.md
2026-01-01 15:39:54 +08:00

403 lines
12 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# VideoConcat 项目文档
## 项目概述
VideoConcat 是一个基于 WPF 开发的视频处理应用程序,主要用于视频拼接、视频抽帧和视频元数据修改等功能。项目采用 MVVM 架构模式,使用 FFMpegCore 库进行视频处理操作。
## 技术栈
- **框架**: .NET 8.0
- **UI框架**: WPF (Windows Presentation Foundation)
- **视频处理**: FFMpegCore 5.2.0
- **日志**: log4net 3.1.0
- **UI组件库**:
- MaterialDesignThemes.Wpf
- MahApps.Metro.IconPacks
- LiveCharts.Wpf (图表库)
- **依赖注入**: Microsoft.Extensions.DependencyInjection
- **JSON处理**: Newtonsoft.Json 13.0.3
## 项目结构
```
VideoConcat/
├── Common/ # 公共模块
│ ├── Api/ # API接口
│ │ ├── Base/ # 基础API
│ │ │ ├── SystemApi.cs # 系统API登录等
│ │ │ └── LoginResponse.cs
│ │ └── Common/ # 通用API
│ └── Tools/ # 工具类
│ ├── Config.cs # 配置管理
│ ├── HttpUtils.cs # HTTP请求封装
│ ├── LogUtils.cs # 日志工具
│ └── VideoCombine.cs # 视频组合工具
├── Conversions/ # 转换器
│ └── EnumToBooleanConverter.cs
├── Helpers/ # 辅助类
│ └── PasswordBoxHelper.cs
├── Models/ # 数据模型
│ ├── ExtractWindowModel.cs # 抽帧窗口模型
│ ├── MainWindowModel.cs # 主窗口模型
│ └── VideoModel.cs # 视频模型
├── Services/ # 服务层
│ ├── BaseService.cs # 基础服务
│ └── Video/ # 视频服务
│ ├── VideoProcess.cs # 视频处理服务
│ └── VideoService.cs # 视频服务
├── ViewModels/ # 视图模型
│ ├── ExtractWindowViewModel.cs
│ ├── MainWindowViewModel.cs
│ └── VideoViewModel.cs
├── Views/ # 视图
│ ├── ExtractWindow.xaml # 抽帧窗口
│ ├── LoginWindow.xaml # 登录窗口
│ ├── MainWindow.xaml # 主窗口
│ └── VideoWindow.xaml # 视频窗口
├── App.xaml # 应用程序入口
├── VideoConcat.csproj # 项目文件
└── README.md # 项目说明
```
## 主要功能
### 1. 视频拼接功能
支持两种拼接模式:
#### 模式一组合拼接IsJoinType1Selected
- 从多个文件夹中选择视频文件
- 生成所有可能的视频组合
- 随机选择指定数量的组合进行拼接
- 支持添加审核图片水印
#### 模式二顺序拼接IsJoinType2Selected
- 按照文件夹顺序,从每个文件夹中选择对应位置的视频
- 要求所有文件夹中的视频数量相同
- 按索引顺序拼接视频
**拼接流程**
1. 选择包含视频文件夹的目录
2. 系统自动扫描各文件夹中的 MP4 文件
3. 根据选择的模式生成视频组合
4. 将视频转换为 TS 格式(临时文件,基于 MD5 缓存)
5. 使用 FFmpeg 进行视频拼接
6. 可选:添加审核图片水印
7. 输出到 `output` 文件夹
### 2. 视频抽帧功能
- 随机删除视频中的某一帧
- 支持 HEVC 编码格式(自动转换为 H.264
- 保持视频和音频同步
- 批量处理视频文件
**处理流程**
1. 分析视频信息(时长、帧率等)
2. 随机选择要删除的帧(避开开头和结尾)
3. 将视频分割为两部分(删除帧前后)
4. 重新合并视频
5. 输出到 `out` 文件夹
### 3. 视频元数据修改
- 通过修改视频元数据中的注释信息改变文件 MD5
- 使用流复制模式,不重新编码视频
- 批量处理视频文件
### 4. 用户登录
- 支持用户登录验证
- 记录登录设备信息机器名、用户名、IP地址
- 与后端 API 交互进行身份验证
## 核心模块说明
### VideoService视频服务
**主要方法**
- `ConvertVideos(string videoPath)`: 将视频文件转换为 TS 格式
- 使用 MD5 作为临时文件名,实现缓存机制
- 支持多种编码格式转换
- 失败时自动尝试备用转换方案
- `GetLargeFileMD5(string filePath)`: 计算大文件的 MD5 值
- 使用流式读取,支持大文件处理
- 8KB 缓冲区优化内存使用
- `JoinVideos(List<string> combination)`: 拼接视频列表
- 使用 FFmpeg concat 功能
- 支持音频重新编码AAC44.1kHz
- 可选添加图片水印
- `Cleanup(List<string> pathList)`: 清理临时文件
### VideoProcess视频处理
**主要方法**
- `RemoveFrameRandomeAsync(string inputPath, string outputPath)`: 异步删除随机帧
- 自动处理 HEVC 编码
- 保持音视频同步
- `ModifyByMetadata(string inputPath, string outputPath, string comment)`: 修改视频元数据
- 添加唯一注释信息
- 使用流复制,不重新编码
- `SubVideo(string inputPath, string outputPath, double startSec, double endSec)`: 视频裁剪
- `SubAudio(string inputPath, string outputPath, double startSec, double endSec)`: 音频裁剪
- `JoinVideo(string outPutPath, string[] videoParts)`: 视频合并
### VideoCombine视频组合工具
**主要方法**
- `GenerateCombinations(List<List<string>> videoLists, int index, List<string> currentCombination, List<List<string>> result)`: 生成所有视频组合
- 递归算法生成笛卡尔积
- 支持多文件夹视频组合
- `ConvertVideos(string videoPath)`: 视频格式转换(与 VideoService 类似)
### LogUtils日志工具
基于 log4net 的日志封装,支持:
- Info: 信息日志
- Debug: 调试日志
- Error: 错误日志
- Warn: 警告日志
- Fatal: 致命错误日志
日志文件保存在 `bin/Debug/net8.0-windows/Log/` 目录下。
### HttpUtilsHTTP工具
封装了 HTTP 请求功能:
- `GetAsync<T>(string url)`: GET 请求
- `PostAsync<T>(string url, object data)`: POST 请求
- 默认 BaseAddress: `https://admin.xiangbing.vip`
- 自动 JSON 序列化/反序列化
## 数据模型
### VideoModel视频模型
**主要属性**
- `FolderPath`: 视频文件夹路径
- `FolderInfos`: 文件夹信息集合(包含视频文件列表)
- `ConcatVideos`: 拼接完成的视频列表
- `Num`: 需要拼接的视频数量
- `MaxNum`: 最大可拼接数量
- `AuditImagePath`: 审核图片路径
- `IsJoinType1Selected`: 组合拼接模式
- `IsJoinType2Selected`: 顺序拼接模式
- `CanStart`: 是否可以开始拼接
- `IsStart`: 是否正在处理
**FolderInfo 结构**
```csharp
public struct FolderInfo
{
public DirectoryInfo DirectoryInfo;
public int Num; // 视频文件数量
public List<string> VideoPaths; // 视频文件路径列表
}
```
**ConcatVideo 类**
```csharp
public class ConcatVideo
{
public int Index; // 索引
public string FileName; // 文件名
public string Size; // 文件大小
public int Seconds; // 时长(秒)
public string Status; // 状态
public string Progress; // 进度
}
```
### ExtractWindowModel抽帧窗口模型
**主要属性**
- `FolderPath`: 视频文件夹路径
- `videos`: 视频文件数组
- `CanExtractFrame`: 是否可以抽帧
- `CanModify`: 是否可以修改元数据
- `IsStart`: 是否正在处理
## 配置说明
### App.config
应用程序配置文件,用于存储应用设置。
### log4net.config
日志配置文件,定义日志输出格式和存储位置。
### app.manifest
应用程序清单文件,定义应用程序的权限和特性。
## 依赖项说明
| 包名 | 版本 | 说明 |
|------|------|------|
| FFMpegCore | 5.2.0 | FFmpeg 的 .NET 封装,用于视频处理 |
| LiveCharts | 0.9.7 | 图表库,用于数据可视化 |
| LiveCharts.Wpf | 0.9.7 | WPF 图表组件 |
| log4net | 3.1.0 | 日志框架 |
| MahApps.Metro.IconPacks | 6.0.0 | Metro 风格图标包 |
| MaterialDesignThemes.Wpf | - | Material Design 主题 |
| Microsoft.Extensions.Logging | 9.0.8 | 日志扩展 |
| Newtonsoft.Json | 13.0.3 | JSON 序列化库 |
| WPFDevelopers | 0.0.0.1 | WPF 开发工具库 |
## 使用说明
### 环境要求
- Windows 操作系统
- .NET 8.0 Runtime
- FFmpeg 可执行文件(已包含在 bin 目录中)
### 运行步骤
1. **编译项目**
```bash
dotnet build
```
2. **运行程序**
```bash
dotnet run
```
或直接运行 `bin/Debug/net8.0-windows/VideoConcat.exe`
3. **使用视频拼接功能**
- 打开程序,选择"视频"标签
- 点击"选择文件夹",选择包含视频文件夹的目录
- 选择拼接模式(组合拼接或顺序拼接)
- 输入需要拼接的视频数量
- (可选)选择审核图片
- 点击"开始拼接"按钮
4. **使用视频抽帧功能**
- 选择"抽帧"标签
- 点击"选择文件夹",选择包含视频文件的目录
- 点击"开始抽帧"按钮
5. **使用元数据修改功能**
- 在"抽帧"标签中
- 选择视频文件夹
- 点击"开始修改"按钮
### 输出位置
- **拼接视频**: `{选择的文件夹}/output/`
- **抽帧视频**: `{选择的文件夹}/out/`
- **修改元数据视频**: `{选择的文件夹}/out/modify{原文件名}`
### 临时文件
- 视频转换后的 TS 文件存储在系统临时目录
- 文件名基于源文件的 MD5 值,实现缓存机制
- 处理完成后会自动清理临时文件
## 性能优化
1. **并发处理**: 使用 `SemaphoreSlim` 限制并发数量默认10个线程
2. **文件缓存**: 基于 MD5 的临时文件缓存,避免重复转换
3. **流式处理**: 大文件 MD5 计算使用流式读取
4. **异步处理**: 视频处理操作使用异步方法,避免 UI 阻塞
## 注意事项
1. **视频格式**: 目前主要支持 MP4 格式
2. **文件路径**: 确保视频文件路径不包含特殊字符
3. **磁盘空间**: 视频处理需要足够的临时存储空间
4. **处理时间**: 视频处理时间取决于视频大小和数量
5. **HEVC 编码**: 抽帧功能会自动将 HEVC 编码转换为 H.264
## 日志说明
日志文件保存在 `bin/Debug/net8.0-windows/Log/` 目录下,按日期命名(如 `log20251019.log`)。
日志内容包括:
- 视频处理进度
- 错误信息
- 操作记录
- 性能统计
## API 接口
### 登录接口
**端点**: `/api/base/login`
**请求参数**:
```json
{
"Username": "用户名",
"Password": "密码",
"Platform": "pc",
"PcName": "机器名",
"PcUserName": "用户名",
"Ips": "IP地址"
}
```
**响应格式**:
```json
{
"Code": 200,
"Msg": "消息",
"Data": {
// 用户信息
}
}
```
## 开发说明
### MVVM 架构
项目采用 MVVMModel-View-ViewModel架构模式
- **Model**: 数据模型和业务逻辑Models 目录)
- **View**: 用户界面Views 目录XAML 文件)
- **ViewModel**: 视图模型,连接 View 和 ModelViewModels 目录)
### 命令模式
使用自定义 `Command` 类实现命令模式,绑定到 UI 控件的命令属性。
### 数据绑定
使用 WPF 数据绑定机制,实现 UI 与数据的双向绑定。
## 已知问题
1. 抽帧功能在某些情况下可能返回 false代码中 `RemoveFrameRandomeAsync` 方法最后返回 false
2. 顺序拼接模式要求所有文件夹视频数量相同,但错误提示信息不够明确
## 未来改进方向
1. 支持更多视频格式
2. 添加视频预览功能
3. 优化错误处理和用户提示
4. 添加进度条显示
5. 支持视频质量设置
6. 添加批量重命名功能
7. 支持视频裁剪功能(时间范围选择)
## 许可证
(待补充)
## 联系方式
(待补充)