Compare commits
2 Commits
5f2b5b55f4
...
2040232735
| Author | SHA1 | Date |
|---|---|---|
|
|
2040232735 | |
|
|
7c1d9559b9 |
|
|
@ -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,59 +112,40 @@ 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)
|
||||
buf = nil
|
||||
return false
|
||||
}
|
||||
_, err = w.Write(frame_)
|
||||
_, err = w.Write(buf)
|
||||
if err != nil {
|
||||
fmt.Printf("写入帧数据错误: %v\n", err)
|
||||
buf = nil
|
||||
return false
|
||||
}
|
||||
_, err = w.Write([]byte("\r\n"))
|
||||
if err != nil {
|
||||
fmt.Printf("写入帧结束标记错误: %v\n", err)
|
||||
buf = nil
|
||||
return false
|
||||
}
|
||||
time.Sleep(50 * time.Millisecond) // 控制帧率,模拟每秒约20帧,可按实际调整
|
||||
buf = nil
|
||||
}
|
||||
})
|
||||
}
|
||||
|
|
|
|||
Loading…
Reference in New Issue