使用分离的全局变量存储帧,不用map

This commit is contained in:
lijun 2025-01-18 14:21:04 +08:00
parent 15a78b10c5
commit f83e720224
3 changed files with 75 additions and 3 deletions

View File

@ -164,8 +164,7 @@ func subscribeAndHandleMessagesV3(ws *websocket.Conn, device_id int) {
t_count := 0 t_count := 0
for { for {
//从service获取当前帧 //从service获取当前帧
var img gocv.Mat img, c := service.GetDeviceCurrentFrameV3(device_id)
c := service.GetDeviceCurrentFrameV2(&img, device_id)
if c != count { if c != count {
//将img转[]byte //将img转[]byte
if img.Empty() { if img.Empty() {

View File

@ -104,6 +104,12 @@ func ReadConfigAndSetSystem() {
service.DeviceIsGettingFrame.Store(device.ID, false) service.DeviceIsGettingFrame.Store(device.ID, false)
} }
if is_get == false && device.NextStop == false { //如果设备流已经停止且不暂停,则开启 if is_get == false && device.NextStop == false { //如果设备流已经停止且不暂停,则开启
switch device.ID {
case 1:
service.Device1CurrentFrame = gocv.NewMat()
case 50:
service.Device50CurrentFrame = gocv.NewMat()
}
go service.GetVideoStream(device.ID) go service.GetVideoStream(device.ID)
log.Printf("device:%d has started!\n", device.ID) log.Printf("device:%d has started!\n", device.ID)
} }

View File

@ -18,6 +18,8 @@ var DeviceRWMap = &sync.Map{}
var DeviceCurrentFrameMap = &sync.Map{} var DeviceCurrentFrameMap = &sync.Map{}
var DeviceFrameCount = &sync.Map{} var DeviceFrameCount = &sync.Map{}
var DeviceIsGettingFrame = &sync.Map{} var DeviceIsGettingFrame = &sync.Map{}
var Device1CurrentFrame gocv.Mat
var Device50CurrentFrame gocv.Mat
func SetDeviceCurrentFrame(frame gocv.Mat, device_id int) error { func SetDeviceCurrentFrame(frame gocv.Mat, device_id int) error {
//获取读写锁 //获取读写锁
@ -51,6 +53,32 @@ func SetDeviceCurrentFrame(frame gocv.Mat, device_id int) error {
return nil return nil
} }
func SetDeviceCurrentFrameV2(frame gocv.Mat, device_id int) error {
//获取读写锁
mutex_, ok := DeviceRWMap.Load(device_id)
if !ok {
return fmt.Errorf("设备:%s 读写锁不存在", device_id)
}
mutex := mutex_.(*sync.RWMutex)
mutex.Lock()
defer mutex.Unlock()
//设置当前帧
switch device_id {
case 1:
Device1CurrentFrame = frame
case 50:
Device50CurrentFrame = frame
}
frame_count, ok := DeviceFrameCount.Load(device_id)
if !ok {
return fmt.Errorf("设备:%s 当前帧计数不存在", device_id)
}
frame_count_ := frame_count.(int)
frame_count_++
DeviceFrameCount.Store(device_id, frame_count_)
return nil
}
func GetDeviceCurrentFrameV2(frame *gocv.Mat, deviceId int) int { func GetDeviceCurrentFrameV2(frame *gocv.Mat, deviceId int) int {
defer func() { defer func() {
if err := recover(); err != nil { if err := recover(); err != nil {
@ -92,6 +120,45 @@ func GetDeviceCurrentFrameV2(frame *gocv.Mat, deviceId int) int {
return frame_count return frame_count
} }
func GetDeviceCurrentFrameV3(deviceId int) (gocv.Mat, int) {
defer func() {
if err := recover(); err != nil {
log.Printf("设备:%d 错误: %v\n", deviceId, err)
}
}()
//获取读写锁
mutex_, ok := DeviceRWMap.Load(deviceId)
if !ok {
log.Printf("DeviceRWMap 读写锁不存在device_id: %d \n", deviceId)
return gocv.NewMat(), -1
}
mutex, ok := mutex_.(*sync.RWMutex)
if !ok {
log.Printf("DeviceRWMap 存储的不是 *sync.RWMutex 类型device_id: %d \n", deviceId)
return gocv.NewMat(), -1
}
mutex.RLock()
defer mutex.RUnlock()
//获取当前帧
var frame gocv.Mat
switch deviceId {
case 1:
frame = Device1CurrentFrame
case 50:
frame = Device50CurrentFrame
}
frame_countIface, ok := DeviceFrameCount.Load(deviceId)
if !ok {
return gocv.NewMat(), -1
}
frame_count, ok := frame_countIface.(int)
if !ok {
log.Printf("DeviceFrameCount 存储的不是 int 类型device_id: %d", deviceId)
}
return frame, frame_count
}
func GetDeviceCurrentFrame(deviceId int) (gocv.Mat, int) { func GetDeviceCurrentFrame(deviceId int) (gocv.Mat, int) {
defer func() { defer func() {
if err := recover(); err != nil { if err := recover(); err != nil {
@ -185,7 +252,7 @@ func getVideoFrame(device proto.DeviceInfo) {
currentTime := time.Now().Format("2006-01-02 15:04:05") currentTime := time.Now().Format("2006-01-02 15:04:05")
gocv.PutText(&frame, currentTime, image.Point{10, 20}, font, fontScale, fontColor, lineType) gocv.PutText(&frame, currentTime, image.Point{10, 20}, font, fontScale, fontColor, lineType)
//需要将帧付给全局变量 //需要将帧付给全局变量
err3 := SetDeviceCurrentFrame(frame, device.ID) err3 := SetDeviceCurrentFrameV2(frame, device.ID)
if err3 != nil { if err3 != nil {
log.Printf("设备:%d 错误: 无法设置当前帧,err:%s \n", device.ID, err3.Error()) log.Printf("设备:%d 错误: 无法设置当前帧,err:%s \n", device.ID, err3.Error())
} }