feat: 自动建立实时监看媒体路径 (#51)

This commit is contained in:
ila
2026-08-13 12:42:10 +08:00
parent 75e0360a43
commit 04e2598be0
+30 -3
View File
@@ -21,7 +21,33 @@ type Service struct {
}
func NewService(store Store, process mediamtx.Process, controller mediamtx.Controller) *Service {
return &Service{store: store, process: process, controller: controller, profile: admission.VerifiedProfile, credential: device.ReadCredential, now: time.Now}
return &Service{store: store, process: process, controller: controller, profile: admission.VerifiedProfile, credential: device.ReadRTSPCredential, now: time.Now}
}
func (s *Service) ConfigureProfiles(ctx context.Context, actor identity.Principal, result admission.Result) admission.MediaOutcome {
configured := 0
ready := 0
for _, profile := range result.Profiles {
if profile.Verification.Status != "ready" {
continue
}
configured++
route, err := s.Configure(ctx, actor, result.DeviceID, profile.Token)
if err != nil {
continue
}
route, err = s.Reconcile(ctx, actor, route.ID)
if err == nil && route.Actual == "ready" {
ready++
}
}
if configured == 0 {
return admission.MediaOutcome{Status: "needs_attention", Detail: "未找到可用码流,请检查接入结果"}
}
if ready == configured {
return admission.MediaOutcome{Status: "ready", Detail: "视频已进入实时监看"}
}
return admission.MediaOutcome{Status: "needs_attention", Detail: "摄像机已接入,媒体服务未就绪,请到视频服务查看并重试"}
}
func (s *Service) Configure(ctx context.Context, actor identity.Principal, deviceID, profileToken string) (Route, error) {
if _, err := s.profile(deviceID, profileToken); err != nil {
@@ -55,7 +81,7 @@ func (s *Service) Reconcile(ctx context.Context, actor identity.Principal, id st
}
if err := s.process.Start(ctx); err != nil {
route.Actual = "process_failed"
route.Detail = err.Error()
route.Detail = "媒体进程未启动,请检查视频服务配置"
route.Version++
route.UpdatedAt = s.now().UTC()
_ = s.store.Save(ctx, route)
@@ -72,7 +98,7 @@ func (s *Service) Reconcile(ctx context.Context, actor identity.Principal, id st
source := mediamtx.Source{Path: route.Path, URI: profile.StreamURI, Username: credential.Username, Password: credential.Password}
if err := s.controller.Apply(ctx, source); err != nil {
route.Actual = "apply_failed"
route.Detail = err.Error()
route.Detail = "媒体路径配置失败,请检查视频服务"
route.Version++
route.UpdatedAt = s.now().UTC()
_ = s.store.Save(ctx, route)
@@ -138,3 +164,4 @@ func safe(value string) string {
return '_'
}, value)
}