使用分离的全局变量存储帧,不用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
for {
//从service获取当前帧
var img gocv.Mat
c := service.GetDeviceCurrentFrameV2(&img, device_id)
img, c := service.GetDeviceCurrentFrameV3(device_id)
if c != count {
//将img转[]byte
if img.Empty() {

View File

@ -104,6 +104,12 @@ func ReadConfigAndSetSystem() {
service.DeviceIsGettingFrame.Store(device.ID, 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)
log.Printf("device:%d has started!\n", device.ID)
}

View File

@ -18,6 +18,8 @@ var DeviceRWMap = &sync.Map{}
var DeviceCurrentFrameMap = &sync.Map{}
var DeviceFrameCount = &sync.Map{}
var DeviceIsGettingFrame = &sync.Map{}
var Device1CurrentFrame gocv.Mat
var Device50CurrentFrame gocv.Mat
func SetDeviceCurrentFrame(frame gocv.Mat, device_id int) error {
//获取读写锁
@ -51,6 +53,32 @@ func SetDeviceCurrentFrame(frame gocv.Mat, device_id int) error {
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 {
defer func() {
if err := recover(); err != nil {
@ -92,6 +120,45 @@ func GetDeviceCurrentFrameV2(frame *gocv.Mat, deviceId int) int {
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) {
defer func() {
if err := recover(); err != nil {
@ -185,7 +252,7 @@ func getVideoFrame(device proto.DeviceInfo) {
currentTime := time.Now().Format("2006-01-02 15:04:05")
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 {
log.Printf("设备:%d 错误: 无法设置当前帧,err:%s \n", device.ID, err3.Error())
}