使用分离方式,修改视频流返回方式
This commit is contained in:
parent
69f81addeb
commit
d69e02115f
|
|
@ -135,21 +135,29 @@ func GetVideoStream(c *gin.Context) {
|
|||
func GetRealTimeImage(c *gin.Context) {
|
||||
id, _ := c.Get("id")
|
||||
id1 := id.(int)
|
||||
device_id := c.Query("device_id")
|
||||
device_id_int, _ := strconv.Atoi(device_id)
|
||||
device := service.GetDevice(device_id_int, id1)
|
||||
deviceId := c.Query("device_id")
|
||||
deviceIdInt, _ := strconv.Atoi(deviceId)
|
||||
device := service.GetDevice(deviceIdInt, id1)
|
||||
if device.ID == 0 {
|
||||
c.JSON(http.StatusOK, gin.H{"code": 4, "message": "device not found"})
|
||||
return
|
||||
}
|
||||
//查看设备是否在获取
|
||||
is_get, ok := service.DeviceIsGettingFrame.Load(device.ID)
|
||||
if !ok || is_get == false {
|
||||
//直接返回
|
||||
c.JSON(http.StatusOK, gin.H{"code": 4, "message": "device not getting frame or not exist"})
|
||||
log.Printf("device:%d not found", device.ID)
|
||||
return
|
||||
}
|
||||
ws, err := upgrader.Upgrade(c.Writer, c.Request, nil)
|
||||
if err != nil {
|
||||
log.Printf("connect wss err:%v", err)
|
||||
return
|
||||
}
|
||||
worker.SetRedisWithExpire(strconv.Itoa(int(device.ID))+"_is_play", "1", time.Minute*5)
|
||||
log.Printf("device_id:%d has set is_play to 1", device_id_int)
|
||||
go subscribeAndHandleMessagesV3(ws, device_id_int)
|
||||
log.Printf("device_id:%d has set is_play to 1", deviceIdInt)
|
||||
go subscribeAndHandleMessagesV3(ws, deviceIdInt)
|
||||
}
|
||||
|
||||
func subscribeAndHandleMessagesV3(ws *websocket.Conn, device_id int) {
|
||||
|
|
|
|||
5
main.go
5
main.go
|
|
@ -71,13 +71,14 @@ func init() {
|
|||
if err != nil {
|
||||
panic("failed to read config file:" + err.Error())
|
||||
}
|
||||
service.DeviceFrameCount = make(map[int]int)
|
||||
for _, device := range proto.Config.DeviceInfo {
|
||||
//service.DeviceRWMap[device.ID] = sync.RWMutex{}
|
||||
//service.DeviceCurrentFrameMap[device.ID] = gocv.NewMat()
|
||||
//service.DeviceIsGettingFrame[device.ID] = false
|
||||
service.DeviceRWMap.Store(device.ID, &sync.RWMutex{})
|
||||
service.DeviceCurrentFrameMap.Store(device.ID, gocv.NewMat())
|
||||
service.DeviceFrameCount.Store(device.ID, 0)
|
||||
service.DeviceFrameCount[device.ID] = 0
|
||||
service.DeviceIsGettingFrame.Store(device.ID, false)
|
||||
}
|
||||
}
|
||||
|
|
@ -100,7 +101,7 @@ func ReadConfigAndSetSystem() {
|
|||
//说明没有这个设备,需初始化添加
|
||||
service.DeviceRWMap.Store(device.ID, &sync.RWMutex{})
|
||||
service.DeviceCurrentFrameMap.Store(device.ID, gocv.NewMat())
|
||||
service.DeviceFrameCount.Store(device.ID, 0)
|
||||
service.DeviceFrameCount[device.ID] = 0
|
||||
service.DeviceIsGettingFrame.Store(device.ID, false)
|
||||
}
|
||||
if is_get == false && device.NextStop == false { //如果设备流已经停止且不暂停,则开启
|
||||
|
|
|
|||
|
|
@ -16,83 +16,77 @@ import (
|
|||
|
||||
var DeviceRWMap = &sync.Map{}
|
||||
var DeviceCurrentFrameMap = &sync.Map{}
|
||||
var DeviceFrameCount = &sync.Map{}
|
||||
var DeviceFrameCount map[int]int
|
||||
var DeviceIsGettingFrame = &sync.Map{}
|
||||
var Device1CurrentFrame gocv.Mat
|
||||
var Device50CurrentFrame gocv.Mat
|
||||
var Device73CurrentFrame gocv.Mat
|
||||
|
||||
func SetDeviceCurrentFrame(frame gocv.Mat, device_id int) error {
|
||||
func SetDeviceCurrentFrame(frame gocv.Mat, deviceId int) error {
|
||||
//获取读写锁
|
||||
mutex_, ok := DeviceRWMap.Load(device_id)
|
||||
mutex_, ok := DeviceRWMap.Load(deviceId)
|
||||
if !ok {
|
||||
return fmt.Errorf("设备:%s 读写锁不存在", device_id)
|
||||
return fmt.Errorf("设备:%s 读写锁不存在", deviceId)
|
||||
}
|
||||
mutex := mutex_.(*sync.RWMutex)
|
||||
mutex.Lock()
|
||||
defer mutex.Unlock()
|
||||
//获取前一帧,将前一帧释放
|
||||
framePrev, ok := DeviceCurrentFrameMap.Load(device_id)
|
||||
framePrev, ok := DeviceCurrentFrameMap.Load(deviceId)
|
||||
if ok {
|
||||
frame_, ok2 := framePrev.(gocv.Mat)
|
||||
if ok2 {
|
||||
err2 := frame_.Close()
|
||||
if err2 != nil {
|
||||
log.Printf("设备:%d, 错误: 无法关闭帧\n", device_id)
|
||||
log.Printf("设备:%d, 错误: 无法关闭帧\n", deviceId)
|
||||
}
|
||||
}
|
||||
}
|
||||
//设置当前帧
|
||||
DeviceCurrentFrameMap.Store(device_id, frame)
|
||||
frame_count, ok := DeviceFrameCount.Load(device_id)
|
||||
DeviceCurrentFrameMap.Store(deviceId, frame)
|
||||
frameCount, ok := DeviceFrameCount[deviceId]
|
||||
if !ok {
|
||||
return fmt.Errorf("设备:%s 当前帧计数不存在", device_id)
|
||||
return fmt.Errorf("设备:%s 当前帧计数不存在", deviceId)
|
||||
}
|
||||
frame_count_ := frame_count.(int)
|
||||
frame_count_++
|
||||
DeviceFrameCount.Store(device_id, frame_count_)
|
||||
frameCount++
|
||||
DeviceFrameCount[deviceId] = frameCount
|
||||
return nil
|
||||
}
|
||||
|
||||
func SetDeviceCurrentFrameV2(frame *gocv.Mat, device_id int) error {
|
||||
func SetDeviceCurrentFrameV2(frame *gocv.Mat, deviceId int) error {
|
||||
//获取读写锁
|
||||
mutex_, ok := DeviceRWMap.Load(device_id)
|
||||
mutex_, ok := DeviceRWMap.Load(deviceId)
|
||||
if !ok {
|
||||
return fmt.Errorf("设备:%s 读写锁不存在", device_id)
|
||||
return fmt.Errorf("设备:%s 读写锁不存在", deviceId)
|
||||
}
|
||||
mutex := mutex_.(*sync.RWMutex)
|
||||
mutex.Lock()
|
||||
defer mutex.Unlock()
|
||||
//设置当前帧
|
||||
switch device_id {
|
||||
switch deviceId {
|
||||
case 1:
|
||||
//err := Device1CurrentFrame.Close()
|
||||
//if err != nil {
|
||||
// log.Printf("设备:%d, 错误: 无法关闭帧\n", device_id)
|
||||
//}
|
||||
if Device1CurrentFrame.Empty() {
|
||||
Device1CurrentFrame = gocv.NewMatWithSize((*frame).Rows(), (*frame).Cols(), (*frame).Type())
|
||||
}
|
||||
(*frame).CopyTo(&Device1CurrentFrame)
|
||||
//err := deepcopier.Copy(*frame).To(&Device1CurrentFrame)
|
||||
//if err != nil {
|
||||
// log.Printf("设备:%d, 错误: 无法设置帧,err: %s \n", device_id, err.Error())
|
||||
//}
|
||||
//查看帧状态
|
||||
//log.Printf("frame:%v,Device1CurrentFrame:%v \n", (*frame).Empty(), Device1CurrentFrame.Empty())
|
||||
//Device1CurrentFrame = *frame
|
||||
case 50:
|
||||
if Device50CurrentFrame.Empty() {
|
||||
Device50CurrentFrame = gocv.NewMatWithSize((*frame).Rows(), (*frame).Cols(), (*frame).Type())
|
||||
}
|
||||
(*frame).CopyTo(&Device50CurrentFrame)
|
||||
case 73:
|
||||
if Device73CurrentFrame.Empty() {
|
||||
Device73CurrentFrame = gocv.NewMatWithSize((*frame).Rows(), (*frame).Cols(), (*frame).Type())
|
||||
}
|
||||
(*frame).CopyTo(&Device73CurrentFrame)
|
||||
|
||||
}
|
||||
frame_count, ok := DeviceFrameCount.Load(device_id)
|
||||
frameCount, ok := DeviceFrameCount[deviceId]
|
||||
if !ok {
|
||||
return fmt.Errorf("设备:%s 当前帧计数不存在", device_id)
|
||||
return fmt.Errorf("设备:%s 当前帧计数不存在", deviceId)
|
||||
}
|
||||
frame_count_ := frame_count.(int)
|
||||
frame_count_++
|
||||
DeviceFrameCount.Store(device_id, frame_count_)
|
||||
frameCount++
|
||||
DeviceFrameCount[deviceId] = frameCount
|
||||
return nil
|
||||
}
|
||||
|
||||
|
|
@ -126,15 +120,11 @@ func GetDeviceCurrentFrameV2(frame *gocv.Mat, deviceId int) int {
|
|||
log.Printf("DeviceCurrentFrameMap 存储的不是 gocv.Mat 类型,device_id: %d \n", deviceId)
|
||||
}
|
||||
*frame = frame_
|
||||
frame_countIface, ok := DeviceFrameCount.Load(deviceId)
|
||||
frameCount, ok := DeviceFrameCount[deviceId]
|
||||
if !ok {
|
||||
return -1
|
||||
}
|
||||
frame_count, ok := frame_countIface.(int)
|
||||
if !ok {
|
||||
log.Printf("DeviceFrameCount 存储的不是 int 类型,device_id: %d", deviceId)
|
||||
}
|
||||
return frame_count
|
||||
return frameCount
|
||||
}
|
||||
|
||||
func GetDeviceCurrentFrameV3(deviceId int) (gocv.Mat, int) {
|
||||
|
|
@ -174,17 +164,14 @@ func GetDeviceCurrentFrameV3(deviceId int) (gocv.Mat, int) {
|
|||
|
||||
}
|
||||
|
||||
frame_countIface, ok := DeviceFrameCount.Load(deviceId)
|
||||
frameCount, ok := DeviceFrameCount[deviceId]
|
||||
if !ok {
|
||||
return gocv.NewMat(), -1
|
||||
}
|
||||
frame_count, ok := frame_countIface.(int)
|
||||
if !ok {
|
||||
log.Printf("DeviceFrameCount 存储的不是 int 类型,device_id: %d", deviceId)
|
||||
}
|
||||
|
||||
//查看地址
|
||||
//log.Printf("frame:%p,Device1CurrentFrame:%p,Device50CurrentFrame:%p\n", &frame, &Device1CurrentFrame, &Device50CurrentFrame)
|
||||
return frame, frame_count
|
||||
return frame, frameCount
|
||||
}
|
||||
func GetDeviceCurrentFrame(deviceId int) (gocv.Mat, int) {
|
||||
defer func() {
|
||||
|
|
@ -215,15 +202,11 @@ func GetDeviceCurrentFrame(deviceId int) (gocv.Mat, int) {
|
|||
if !ok {
|
||||
log.Printf("DeviceCurrentFrameMap 存储的不是 gocv.Mat 类型,device_id: %d \n", deviceId)
|
||||
}
|
||||
frame_countIface, ok := DeviceFrameCount.Load(deviceId)
|
||||
frameCount, ok := DeviceFrameCount[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
|
||||
return frame, frameCount
|
||||
}
|
||||
|
||||
func getVideoFrame(device proto.DeviceInfo) {
|
||||
|
|
|
|||
Loading…
Reference in New Issue