mirror of
https://github.com/gowvp/gb28181.git
synced 2026-04-22 15:07:10 +08:00
58 lines
1.5 KiB
Go
58 lines
1.5 KiB
Go
package onvifadapter
|
||
|
||
import (
|
||
"context"
|
||
"fmt"
|
||
"log/slog"
|
||
|
||
"github.com/gowvp/owl/internal/core/ipc"
|
||
"github.com/gowvp/owl/internal/core/sms"
|
||
"github.com/ixugo/goddd/pkg/orm"
|
||
)
|
||
|
||
// OnStreamChanged implements ipc.Protocoler.
|
||
// ONVIF 协议的 stream 就是 channel.ID,app 固定为 live
|
||
func (a *Adapter) OnStreamChanged(ctx context.Context, app, stream string) error {
|
||
var ch ipc.Channel
|
||
if err := a.adapter.Store().Channel().Get(ctx, &ch, orm.Where("id=?", stream)); err != nil {
|
||
return err
|
||
}
|
||
if err := a.adapter.EditPlayingByID(ctx, ch.ID, false); err != nil {
|
||
slog.ErrorContext(ctx, "编辑播放状态失败", "err", err)
|
||
}
|
||
return nil
|
||
}
|
||
|
||
func (a *Adapter) OnStreamNotFound(ctx context.Context, app, stream string) error {
|
||
var ch ipc.Channel
|
||
if err := a.adapter.Store().Channel().Get(ctx, &ch, orm.Where("id=?", stream)); err != nil {
|
||
return err
|
||
}
|
||
|
||
onvifDev, ok := a.devices.Load(ch.DeviceID)
|
||
if !ok {
|
||
return fmt.Errorf("ONVIF 设备未初始化")
|
||
}
|
||
|
||
streamURI, err := a.getStreamURI(ctx, onvifDev, ch.ChannelID)
|
||
if err != nil {
|
||
return err
|
||
}
|
||
svr, err := a.sms.GetMediaServer(ctx, sms.DefaultMediaServerID)
|
||
if err != nil {
|
||
return err
|
||
}
|
||
|
||
_, err = a.sms.AddStreamProxy(svr, sms.AddStreamProxyRequest{
|
||
App: app,
|
||
Stream: stream,
|
||
URL: streamURI,
|
||
})
|
||
if err == nil {
|
||
if err := a.adapter.EditPlaying(ctx, ch.DeviceID, ch.ChannelID, true); err != nil {
|
||
slog.ErrorContext(ctx, "编辑播放状态失败", "err", err)
|
||
}
|
||
}
|
||
return err
|
||
}
|