Files
media/CLAUDE.md
2026-06-10 16:10:10 +08:00

194 lines
7.7 KiB
Markdown
Raw Permalink 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.
# CLAUDE.md
This file provides guidance to Claude Code (claude.ai/code) when working with code in this repository.
## Commands
```bash
# 下载依赖
go mod download
# 编译
go build -o media main.go
# 运行(开发)
go run main.go
# 格式化代码
go fmt ./...
# 代码检查
go vet ./...
# Docker 构建(多阶段构建,包含 FFmpeg 和 whisper 运行时)
docker build -t media .
# Docker 运行
docker run -p 3010:3010 media
```
## Architecture
这是一个多媒体处理微服务项目,基于 GoFrame 框架开发,提供视频处理、音频提取、语音识别等功能。
### 目录结构
```
main.go # 应用入口
config.yml # 配置文件
consts/ # 常量定义
- video/ # 视频相关常量(包括视频分析任务状态)
controller/ # HTTP 控制器层(路由入口)
- audio/ # 音频相关接口
- video/ # 视频相关接口(拼接、剪切、分析)
- common/ # 公共工具
- scene/ # 场景检测接口
- image/ # 图片处理接口
service/ # 业务逻辑层
- video/ # 视频服务(拼接、剪切、分析、分析队列)
- audio/ # 音频提取服务
- asr/ # 语音识别Whisper
- scene/ # 场景检测
- image/ # 图片处理
- setup/ # 初始化服务
dao/ # 数据访问层
- audio/ # ASR 任务数据访问
- video/ # 视频分析任务数据访问
- image/
model/ # 数据模型
- dto/ # 传输对象(请求/响应)
- video/ # 视频相关 DTO包括视频分析
- entity/ # 数据库实体
- video/ # 视频相关实体(包括分析任务)
resource/ # 静态资源(日志、临时文件)
sql/ # 数据库 SQL
- video_analysis_task.sql - 视频分析任务表建表SQL
```
### 核心功能
| 功能 | 说明 | 依赖 |
|------|------|------|
| 视频拼接 | 支持多个视频拼接,提供 fast无损 concat demuxer和 reencode重编码归一化两种模式可上传结果到 MinIO支持同步和异步任务 | FFmpeg |
| 视频分镜剪切 | 根据分镜时间片段列表剪切视频并重新拼接输出,支持同步和异步任务 | FFmpeg |
| 音频提取 | 从视频文件中提取音频,支持 mp3/aac/wav/ogg/flac 多种格式 | FFmpeg |
| 语音识别 | 异步语音转文字任务,基于 OpenAI Whisper支持 whisper.cpp 加速 | FFmpeg + Whisper/whisper.cpp |
| 场景检测 | 视频场景切分检测,提取关键帧,输出场景信息 | FFmpeg + ffprobe |
| 视频分析 | 基于 Marlin-2B Video VLM 大模型进行视频理解,自动生成场景描述、事件切分和向量化,存入 RAG 系统 | FFmpeg + 外部 Marlin-2B VLM 服务 |
### 启动初始化
- `setup` 包在 `init()` 阶段自动执行,启动时会检查 FFmpeg 和 Whisper 依赖是否可用
- 自动检测 whisper-cpp > whisper > python -m whisper 三个优先级
- 如果依赖缺失会输出警告提示安装
### API 端点
**视频拼接:**
- `POST /video/concat` - 视频拼接URL 输入,同步)
- `POST /video/concat/async` - 视频拼接URL 输入,异步)
- `POST /video/concat/upload` - 视频拼接(文件上传,同步)
- `POST /video/concat/upload/async` - 视频拼接(文件上传,异步)
- `GET /video/concat/task/{taskId}` - 查询异步拼接任务结果
**视频分镜剪切:**
- `POST /video/cut` - 视频分镜剪切URL 输入,同步)
- `POST /video/cut/async` - 视频分镜剪切URL 输入,异步)
- `GET /video/cut/task/{taskId}` - 查询异步剪切任务结果
**语音识别:**
- `POST /audio/transcribe` - 创建语音转文字异步任务
- `GET /audio/task/{taskId}` - 获取转写任务详情
- `GET /audio/task/{taskId}/progress` - 获取任务进度
- `GET /audio/tasks` - 获取任务列表
**视频分析(规划中):**
- `POST /video/analysis` - 创建视频分析异步任务(基于 Marlin-2B VLM
- `GET /video/analysis/task/{taskId}` - 查询分析任务结果
- `GET /video/analysis/task/{taskId}/progress` - 查询分析任务进度
- `POST /video/analysis/retry/{taskId}` - 重试失败的分析事件
> **Note**: `scene` 场景检测和 `image` 图片处理服务目录已创建,但 HTTP 端点尚未实现暴露。音频提取服务已实现但尚未暴露。
### 依赖外部服务
- PostgreSQL - 数据存储
- Redis - 缓存
- Consul - 服务发现
- Jaeger - 链路追踪
- OSS/MinIO - 文件存储(通过内部 oss 微服务上传)
- FFmpeg - 多媒体处理
- Whisper - 语音识别
- Marlin-2B VLM 服务 - 视频理解大模型(提供字幕生成、事件定位功能)
### 内部依赖
项目依赖内部私有公共包 `gitea.redpowerfuture.com/red-future/common`,包含 HTTP 路由注册、用户信息解析、Consul、Jaeger 等基础设施封装。Docker 构建过程中已配置访问凭证。
### Docker 镜像
多阶段构建镜像包含:
- 编译后的二进制
- FFmpeg 运行时
- Python 3 + openai-whisperPython 版本,用于语音识别)
- 非 root 用户 `appuser` 运行
- 暴露端口 `3010`
### 架构设计
**分层架构:**
- `controller` - HTTP 入口,参数解析,调用 Service返回响应
- `service` - 业务逻辑实现,每个功能领域一个子包
- `dao` - 数据访问层,数据库操作
- `model` - 数据模型,`dto` 存放请求/响应传输对象,`entity` 存放数据库实体
**设计模式:**
- 使用 GoFrame 框架的依赖注入模式
- 所有 Service 和 Controller 都使用**单例模式**`var Xxx = new(XxxStruct)`
- 遵循标准的 Go 命名约定
- 临时文件处理完需要**及时清理**(使用 `defer os.Remove()`
**异步任务处理:**
- 长时任务(视频拼接、视频剪切、语音识别)都支持**异步执行**
- 同步模式直接等待结果返回,异步模式创建任务后立即返回任务 ID
- 异步任务状态持久化到数据库,可通过任务 ID 查询进度和结果
- 支持回调 URL任务完成后会回调通知调用方
- 任务执行使用 goroutine 异步处理
**用户身份:**
- 所有接口优先从请求头 `Authorization` / `X-User-Info` 解析用户信息
- 解析失败使用默认 `admin` / tenantId=1 用于开发和调试
### 配置
主要配置在 `config.yml`:
**Server:**
- `server.address` - 监听地址(默认 `:3010`
- `server.clientMaxBodySize` - 上传文件大小限制(默认 `200MB`
**限流:**
- `rate.limit` - 每秒请求限制(默认 200
- `rate.burst` - 突发请求允许量(默认 300
**FFmpeg:**
- `ffmpeg.path` - FFmpeg 可执行文件路径,留空则从 PATH 自动查找
- `ffmpeg.temp_dir` - 临时文件目录(存放上传的视频和处理输出)
**Whisper 语音识别:**
- `whisper.path` - Whisper 可执行文件路径,留空自动查找
- `whisper.model` - 默认模型tiny(最快)/base/small/medium
- `whisper.language` - 默认语言zh=中文, en=英文)
- `whisper.model_dir` - 模型缓存目录,留空使用默认 (~/.cache/whisper/)
- `whisper.threads` - CPU 线程数(限制资源占用,建议 2-4
**视频分析:**
- `analysis.concurrency` - 并发处理数,控制同时处理的分析任务数量(默认 1串行处理建议不超过 CPU 核心数)
- `analysis.maxRetries` - 单事件最大重试次数,失败时自动重试(默认 3
**外部服务:**
- `database` - PostgreSQL 数据库配置
- `redis` - Redis 配置
- `consul` - Consul 服务发现配置
- `jaeger` - Jaeger 链路追踪配置
- `filePrefix` - OSS/MinIO 文件访问地址前缀