package capture
|
|
import (
|
"errors"
|
"fmt"
|
"image"
|
"time"
|
|
"basic.com/valib/goffmpeg.git"
|
"gocv.io/x/gocv"
|
)
|
|
// StreamMode stream mode
|
type StreamMode int
|
|
const (
|
// Rtsp mode
|
Rtsp = StreamMode(iota)
|
// GB28181 mode
|
GB28181
|
)
|
|
// PicExt file extention
|
type PicExt string
|
|
const (
|
// PNGFileExt png
|
PNGFileExt PicExt = PicExt(gocv.PNGFileExt)
|
// JPEGFileExt jpeg
|
JPEGFileExt PicExt = PicExt(gocv.JPEGFileExt)
|
// GIFFileExt gif
|
GIFFileExt PicExt = PicExt(gocv.GIFFileExt)
|
// InvalidFileExt invalid
|
InvalidFileExt PicExt = PicExt("")
|
)
|
|
const (
|
soFileRtsp = "./runtime/libcffmpeg.so"
|
soFileGB = "./runtime/libcffmpeg_gb28181.so"
|
)
|
|
// Capture pic
|
func Capture(m StreamMode, url string, ext PicExt, w, h, maxTry int) ([]byte, error) {
|
if ext == InvalidFileExt {
|
ext = JPEGFileExt
|
}
|
var ret []byte
|
var err error
|
|
if m == Rtsp {
|
err = goffmpeg.InitFFmpeg(soFileRtsp)
|
} else if m == GB28181 {
|
err = goffmpeg.InitFFmpeg(soFileGB)
|
} else {
|
err = errors.New("there is no this mode, try capture.Rtsp/capture.GB28181")
|
}
|
if err != nil {
|
return nil, err
|
}
|
|
ret, err = capt2Data(url, gocv.FileExt(ext), w, h, maxTry)
|
goffmpeg.FreeFFmpeg()
|
|
return ret, err
|
}
|
|
func capt2Data(url string, ext gocv.FileExt, w, h, maxTry int) ([]byte, error) {
|
|
gf := goffmpeg.New()
|
gf.Run(url)
|
gf.BuildDecoder()
|
|
tryTime := 0
|
|
var picData []byte
|
var err2 error
|
for {
|
|
data, wid, hei := gf.GetPicDecoder()
|
if wid > 0 && hei > 0 {
|
img, err := gocv.NewMatFromBytes(hei, wid, gocv.MatTypeCV8UC3, data)
|
if err != nil {
|
continue
|
}
|
pic := img
|
if w >= 0 && h >= 0 {
|
pic = gocv.NewMatWithSize(h, w, gocv.MatTypeCV8UC3)
|
gocv.Resize(img, &pic, image.Pt(w, h), 0, 0, gocv.InterpolationDefault)
|
}
|
picData, err2 = gocv.IMEncode(ext, pic)
|
if err2 != nil {
|
continue
|
}
|
break
|
} else {
|
tryTime++
|
if tryTime > maxTry {
|
break
|
}
|
time.Sleep(time.Second)
|
}
|
}
|
gf.Free()
|
|
if tryTime > maxTry {
|
err := fmt.Sprintf("try %d times to capture image, is url correct?\n", tryTime)
|
return nil, errors.New(err)
|
}
|
|
return picData, nil
|
}
|