获取当前帧bytes

This commit is contained in:
lijun 2025-01-23 22:31:04 +08:00
parent 9362523c39
commit c6bc92c4de
2 changed files with 55 additions and 38 deletions

View File

@ -213,52 +213,23 @@ func subscribeAndHandleMessagesV3(ws *websocket.Conn, deviceId int) {
//图片计数器
count := 0
//定时器,发送计数器
t_count := 0
t := 0
img := gocv.NewMat()
tCount := 0
//计算帧率
for {
//从service获取当前帧
c := service.GetDeviceCurrentFrameV2(&img, deviceId)
buf, c := service.GetDeviceCurrentFrameV4(deviceId, count)
if c != count {
if c == -1 {
log.Printf("device:%d get frame err!", deviceId)
worker.SetRedisSetRemove(online_conn_key, con_id)
break
}
//将img转[]byte
if img.Empty() {
log.Printf("device:%d img is empty! count = %d \n", deviceId, c)
} else {
//gocv.Matrix转为jpeg
buf, err := gocv.IMEncode(".jpg", img)
if err != nil {
log.Printf("img encode err:%v", err)
worker.SetRedisSetRemove(online_conn_key, con_id)
break
}
buf1 := buf.GetBytes()
err2 := ws.WriteMessage(websocket.BinaryMessage, buf1)
count = c
err2 := ws.WriteMessage(websocket.BinaryMessage, buf)
if err2 != nil {
log.Printf("send message to client err:%v", err2)
worker.SetRedisSetRemove(online_conn_key, con_id)
break
}
c = count
err5 := img.Close()
if err5 != nil {
log.Printf("img close err:%v", err)
}
buf.Close()
t++
if t%50 == 0 {
log.Printf("device:%d send frame count:%d,img and buf had been closed", deviceId, c)
}
}
} else {
//每秒发送一次心跳检测
if t_count%10 == 0 {
if tCount%10 == 0 {
err := ws.WriteControl(websocket.PingMessage, []byte{}, time.Now().Add(time.Second))
if err != nil {
log.Printf("Connection check failed:%v", err)
@ -270,7 +241,7 @@ func subscribeAndHandleMessagesV3(ws *websocket.Conn, deviceId int) {
}
}
time.Sleep(100 * time.Millisecond)
t_count++
tCount++
}
// 查看是否还有其他连接,没有则设置 is_play 为 0

View File

@ -93,6 +93,52 @@ func SetDeviceCurrentFrameV2(frame *gocv.Mat, deviceId int) error {
return nil
}
func GetDeviceCurrentFrameV4(deviceId int, curCount int) (buf []byte, cnt 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 nil, -1
}
mutex, ok := mutex_.(*sync.RWMutex)
if !ok {
log.Printf("DeviceRWMap 存储的不是 *sync.RWMutex 类型device_id: %d \n", deviceId)
return nil, -1
}
mutex.RLock()
defer mutex.RUnlock()
frameCount, ok := DeviceFrameCount[deviceId]
if !ok {
return buf, -1
}
if frameCount == curCount {
return nil, frameCount
}
//获取当前帧
switch deviceId {
case 1:
if Device1CurrentFrame.Empty() {
return nil, -1
}
buf = Device1CurrentFrame.ToBytes()
case 50:
if Device50CurrentFrame.Empty() {
return nil, -1
}
buf = Device50CurrentFrame.ToBytes()
case 73:
if Device73CurrentFrame.Empty() {
return nil, -1
}
}
return buf, frameCount
}
func GetDeviceCurrentFrameV2(frame *gocv.Mat, deviceId int) int {
defer func() {
if err := recover(); err != nil {