mirror of
https://github.com/langhuihui/monibuca.git
synced 2025-10-05 13:36:51 +08:00

- Refactor frame converter implementation - Update mp4 track to use ICodex - General refactoring and code improvements 🤖 Generated with [Claude Code](https://claude.ai/code) Co-Authored-By: Claude <noreply@anthropic.com>
M7S Crontab 插件说明文档
1. 插件概述
Crontab 插件是 M7S 流媒体服务器的一个扩展组件,主要用于实现基于时间计划的自动录制功能。该插件允许用户创建定时录制计划,根据预设的时间表自动开始和停止流媒体的录制,支持灵活的周期性录制设置。
2. 核心功能
- 定时录制计划管理:创建、更新、删除和查询录制计划
- 流路径关联:将录制计划与特定的流路径关联
- 时间表设置:通过 168 位的二进制字符串(7天×24小时)定义每周的录制时间段
- 自动录制控制:根据时间计划自动开始和停止录制
- 状态监控:查询当前正在执行和计划中的录制任务状态
3. 文件结构与功能
3.1 主要文件
3.1.1 index.go
插件的入口文件,定义了 CrontabPlugin
结构体和初始化方法。
- 主要结构:
CrontabPlugin
:插件的主结构体,包含插件基础功能、API服务器实现和数据集合
- 主要功能:
OnInit()
:插件初始化函数,负责数据库迁移、加载已有录制计划并创建相应的定时任务
3.1.2 crontab.go
定义了定时任务的核心逻辑和执行流程。
- 主要结构:
TimeSlot
:表示一个时间段,包含开始和结束时间Crontab
:定时任务调度器,负责根据计划执行录制操作
- 主要功能:
Start()
:初始化定时任务Run()
:阻塞运行定时任务,循环检查并执行录制操作Dispose()
:停止定时任务getNextTimeSlot()
:计算下一个需要执行的时间段startRecording()
:开始录制流stopRecording()
:停止录制流
3.1.3 api.go
实现了插件的 API 接口,提供了与前端交互的功能。
- 主要功能:
- 录制计划管理:
List()
,Add()
,Update()
,Remove()
- 录制计划流关联管理:
ListRecordPlanStreams()
,AddRecordPlanStream()
,UpdateRecordPlanStream()
,RemoveRecordPlanStream()
- 计划解析:
ParsePlanTime()
- 状态查询:
GetCrontabStatus()
- 录制计划管理:
- 辅助功能:
- 时间计算:
getWeekdayName()
,getWeekdayIndex()
,getNextDateForWeekday()
- 时间段计算:
calculateTimeSlots()
,getNextTimeSlotFromNow()
- 时间计算:
3.2 子目录文件
3.2.1 pkg
目录
包含数据模型定义和数据库操作相关功能。
-
recordplan.go
:- 定义
RecordPlan
结构体,表示录制计划的数据模型 - 包含计划ID、名称、时间表和启用状态等字段
- 定义
-
recordplanstream.go
:- 定义
RecordPlanStream
结构体,表示录制计划与流路径的关联 - 提供数据库查询的辅助函数,如按流路径模糊查询、按创建时间排序等
- 定义
3.2.2 pb
目录
包含 Protocol Buffers 定义和生成的代码,用于 API 接口和数据传输。
-
crontab.proto
:- 定义了插件的 API 服务接口
- 定义了各种请求和响应消息结构
- 包含 HTTP 路由映射配置
-
crontab.pb.go
,crontab.pb.gw.go
,crontab_grpc.pb.go
:- 由 Protocol Buffers 编译器自动生成的 Go 代码
- 实现了消息序列化/反序列化和 gRPC 服务接口
4. 工作流程
4.1 插件初始化流程
- 插件启动时,
OnInit()
方法被调用 - 执行数据库迁移,确保必要的表结构存在
- 从数据库加载所有录制计划和关联的流信息
- 对于已启用的计划,创建并启动相应的定时任务
4.2 录制计划执行流程
- 定时任务启动后,进入
Run()
方法的循环 - 通过
getNextTimeSlot()
计算下一个需要执行的时间段 - 设置定时器等待到达开始时间
- 到达开始时间后,调用
startRecording()
开始录制 - 设置定时器等待到达结束时间
- 到达结束时间后,调用
stopRecording()
停止录制 - 循环继续,计算下一个时间段
4.3 API 交互流程
- 前端通过 HTTP/gRPC 接口与插件交互
- 可以创建、更新、删除录制计划和流关联
- 可以查询当前正在执行和计划中的录制任务状态
- 可以解析计划字符串,获取时间段信息
5. 关键概念
5.1 录制计划 (RecordPlan)
录制计划定义了何时进行录制的时间表。每个计划包含:
- ID:唯一标识符
- 名称:计划名称
- 时间表:168位的二进制字符串,表示一周中每个小时是否进行录制
- 启用状态:是否启用该计划
5.2 录制计划流 (RecordPlanStream)
将录制计划与特定的流路径关联,定义了录制的具体参数:
- 计划ID:关联的录制计划ID
- 流路径:要录制的流的路径
- 分片设置:录制文件的分片参数
- 文件路径:录制文件的保存路径
- 启用状态:是否启用该关联
5.3 时间表格式
时间表使用 168 位的二进制字符串表示一周中的每个小时是否进行录制:
- 每天 24 小时,一周 7 天,共 168 小时
- 字符串中的每一位对应一个小时,'1' 表示录制,'0' 表示不录制
- 字符串按周日到周六的顺序排列,每天 24 位
例如:
- 全为 '0':一周中不进行任何录制
- 前 24 位为 '1',其余为 '0':仅在周日全天录制
- 每天的第 9 位到第 17 位为 '1':每天上午 9 点到下午 5 点录制
6. 使用场景
- 定期节目录制:适用于每周固定时间播出的节目自动录制
- 工作时间监控:仅在工作时间段自动录制监控视频
- 带宽管理:在网络带宽充足的时间段进行录制,避开高峰期
- 存储优化:只录制有价值的时间段,节省存储空间
7. API 接口说明
7.1 录制计划管理
- 列表查询:
GET /plan/api/list
- 添加计划:
POST /plan/api/add
- 更新计划:
POST /plan/api/update/{id}
- 删除计划:
POST /plan/api/remove/{id}
7.2 录制计划流管理
- 列表查询:
GET /planstream/api/list
- 添加关联:
POST /planstream/api/add
- 更新关联:
POST /planstream/api/update
- 删除关联:
POST /planstream/api/remove/{planId}/{streamPath}
7.3 其他接口
- 解析计划:
GET /plan/api/parse/{plan}
- 状态查询:
GET /crontab/api/status
8. 总结
Crontab 插件为 M7S 流媒体服务器提供了强大的定时录制功能,通过灵活的时间表设置和流路径关联,实现了自动化的录制控制。该插件适用于需要定期录制特定时间段流媒体内容的场景,能有效节省人力和存储资源。