| New file |
| | |
| | | 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 |
| | | } |