Compare commits

..

No commits in common. "2040232735c4d28cb1694a6b7a5ae146b513aadf" and "5f2b5b55f4c8e47f59d0bd5293bfa0451e12b58b" have entirely different histories.

1 changed files with 27 additions and 7 deletions

View File

@ -8,6 +8,7 @@ import (
"github.com/gin-gonic/gin" "github.com/gin-gonic/gin"
"github.com/google/uuid" "github.com/google/uuid"
"github.com/gorilla/websocket" "github.com/gorilla/websocket"
"gocv.io/x/gocv"
"io" "io"
"log" "log"
"net/http" "net/http"
@ -112,40 +113,59 @@ func GetVideoStream(c *gin.Context) {
//设备流 //设备流
c.Stream(func(w io.Writer) bool { c.Stream(func(w io.Writer) bool {
var count int var count int
var frame gocv.Mat
errCount := 0 errCount := 0
for { for {
if errCount > 10 { if errCount > 10 {
log.Printf("stream device:%d errCount > 10", deviceID) log.Printf("stream device:%d errCount > 10", deviceID)
return false return false
} }
buf, cnt := service.GetDeviceCurrentFrameV4(deviceID, count) 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)
}
}()
if cnt == count || cnt == -1 { if cnt == count || cnt == -1 {
time.Sleep(50 * time.Millisecond) time.Sleep(50 * time.Millisecond)
log.Printf("stream device:%d,cnt =%d,count=%d,errCount=%d", deviceID, cnt, count, errCount) log.Printf("stream device:%d,cnt =%d,count=%d,errCount=%d", deviceID, cnt, count, errCount)
errCount++ errCount++
continue continue
} }
count = cnt 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()
_, err = w.Write([]byte("--frame\r\nContent-Type: image/jpeg\r\n\r\n")) _, err = w.Write([]byte("--frame\r\nContent-Type: image/jpeg\r\n\r\n"))
if err != nil { if err != nil {
fmt.Printf("写入头部信息错误: %v\n", err) fmt.Printf("写入头部信息错误: %v\n", err)
buf = nil
return false return false
} }
_, err = w.Write(buf) _, err = w.Write(frame_)
if err != nil { if err != nil {
fmt.Printf("写入帧数据错误: %v\n", err) fmt.Printf("写入帧数据错误: %v\n", err)
buf = nil
return false return false
} }
_, err = w.Write([]byte("\r\n")) _, err = w.Write([]byte("\r\n"))
if err != nil { if err != nil {
fmt.Printf("写入帧结束标记错误: %v\n", err) fmt.Printf("写入帧结束标记错误: %v\n", err)
buf = nil
return false return false
} }
time.Sleep(50 * time.Millisecond) // 控制帧率模拟每秒约20帧可按实际调整 time.Sleep(50 * time.Millisecond) // 控制帧率模拟每秒约20帧可按实际调整
buf = nil
} }
}) })
} }