视频会议保存

This commit is contained in:
duoaohui
2026-05-18 19:42:55 +08:00
parent 315884685f
commit ac8ec4c903
41 changed files with 5069 additions and 39 deletions

View File

@@ -80,6 +80,22 @@ type MeetingService struct {
onlineChecker OnlineChecker
mediaOrchestrator MediaOrchestrator
lifecycleSvc *MeetingLifecycleService
// recordingStopper 由 NewApp 在 Wire 注入完成后通过 SetRecordingStopper 注入
// 用 setter 而非构造函数参数:避免与 MeetingRecordingService 形成构造期循环依赖
// nil 时 EndRoom 跳过录制清理(向后兼容,生产路径始终非 nil
recordingStopper RecordingStopper
}
// RecordingStopper EndRoom / 空房 TTL 等系统路径强制停止活跃录制的钩子
// 由 *MeetingRecordingService 实现,通过 setter 注入,避免循环依赖
type RecordingStopper interface {
StopActiveForEndRoom(ctx context.Context, room *model.MeetingRoom)
}
// SetRecordingStopper 注入录制停止钩子(在 NewApp 完成 Wire 后调用)
func (s *MeetingService) SetRecordingStopper(stopper RecordingStopper) {
s.recordingStopper = stopper
}
// NewMeetingService 创建 MeetingService 实例
@@ -591,6 +607,12 @@ func (s *MeetingService) EndRoom(ctx context.Context, userID int64, code string)
_ = s.broadcaster.PublishToUser(ctx, p.UserID, constants.MeetingWSEventRoomEnded, payload)
}
// Phase B先停掉活跃录制再关 Router否则 CloseRouter 会触发录制 Consumer 异常退出,
// 录制文件可能丢失最后几秒。stopper 同步执行(含 ffmpeg 优雅退出 + MinIO 上传),失败仅 Warn 不阻断
if s.recordingStopper != nil {
s.recordingStopper.StopActiveForEndRoom(ctx, room)
}
if err := s.mediaOrchestrator.CloseRouter(ctx, code); err != nil {
logs.Warn(ctx, funcName, "关闭 mediasoup Router 失败", zap.Error(err))
}