diff --git a/handler/tool.go b/handler/tool.go index 89604eb..3633a98 100644 --- a/handler/tool.go +++ b/handler/tool.go @@ -8,7 +8,6 @@ import ( "github.com/gin-gonic/gin" "github.com/google/uuid" "github.com/gorilla/websocket" - "gocv.io/x/gocv" "io" "log" "net/http" @@ -113,49 +112,26 @@ func GetVideoStream(c *gin.Context) { //设备流 c.Stream(func(w io.Writer) bool { var count int - var frame gocv.Mat errCount := 0 for { if errCount > 10 { log.Printf("stream device:%d errCount > 10", deviceID) return false } - frame = gocv.NewMat() - cnt := service.GetDeviceCurrentFrameV2(&frame, deviceID) - defer func() { - //关闭帧 - err4 := frame.Close() - if err4 != nil { - log.Printf("device:%d frame close err:%v", deviceID, err4) - } - }() + buf, cnt := service.GetDeviceCurrentFrameV4(deviceID, count) if cnt == count || cnt == -1 { time.Sleep(50 * time.Millisecond) log.Printf("stream device:%d,cnt =%d,count=%d,errCount=%d", deviceID, cnt, count, errCount) errCount++ continue } - if frame.Empty() { - log.Printf("stream device:%d frame is empty", deviceID) - time.Sleep(100 * time.Millisecond) - errCount++ - continue - } - //gocv.Matrix转为jpeg - img, err2 := gocv.IMEncode(".jpg", frame) - if err2 != nil { - log.Printf("stream img encode err:%v", err2) - return false - } - defer img.Close() - frame_ := img.GetBytes() - + count = cnt _, err = w.Write([]byte("--frame\r\nContent-Type: image/jpeg\r\n\r\n")) if err != nil { fmt.Printf("写入头部信息错误: %v\n", err) return false } - _, err = w.Write(frame_) + _, err = w.Write(buf) if err != nil { fmt.Printf("写入帧数据错误: %v\n", err) return false @@ -166,6 +142,7 @@ func GetVideoStream(c *gin.Context) { return false } time.Sleep(50 * time.Millisecond) // 控制帧率,模拟每秒约20帧,可按实际调整 + buf = nil } }) }