视频会议保存
This commit is contained in:
@@ -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))
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user