diff --git a/handler/tool.go b/handler/tool.go index 7197e7a..d7db1fa 100644 --- a/handler/tool.go +++ b/handler/tool.go @@ -164,7 +164,8 @@ func subscribeAndHandleMessagesV3(ws *websocket.Conn, device_id int) { t_count := 0 for { //从service获取当前帧 - img, c := service.GetDeviceCurrentFrame(device_id) + var img gocv.Mat + c := service.GetDeviceCurrentFrameV2(&img, device_id) if c != count { //将img转[]byte if img.Empty() { diff --git a/service/tool.go b/service/tool.go index e8fbfcc..c74c990 100644 --- a/service/tool.go +++ b/service/tool.go @@ -51,6 +51,47 @@ func SetDeviceCurrentFrame(frame gocv.Mat, device_id int) error { return nil } +func GetDeviceCurrentFrameV2(frame *gocv.Mat, deviceId int) 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 -1 + } + mutex, ok := mutex_.(*sync.RWMutex) + if !ok { + log.Printf("DeviceRWMap 存储的不是 *sync.RWMutex 类型,device_id: %d \n", deviceId) + return -1 + } + mutex.RLock() + defer mutex.RUnlock() + var frame_ gocv.Mat + //获取当前帧 + frameIface, ok := DeviceCurrentFrameMap.Load(deviceId) + if !ok { + return -1 + } + frame_, ok = frameIface.(gocv.Mat) + if !ok { + log.Printf("DeviceCurrentFrameMap 存储的不是 gocv.Mat 类型,device_id: %d \n", deviceId) + } + *frame = frame_ + frame_countIface, ok := DeviceFrameCount.Load(deviceId) + if !ok { + return -1 + } + frame_count, ok := frame_countIface.(int) + if !ok { + log.Printf("DeviceFrameCount 存储的不是 int 类型,device_id: %d", deviceId) + } + return frame_count +} + func GetDeviceCurrentFrame(deviceId int) (gocv.Mat, int) { defer func() { if err := recover(); err != nil {