zhangmeng
2019-07-19 478d3efea003cc5bb777bdef99a8ea5d7a9e0022
init
1个文件已添加
111 ■■■■■ 已修改文件
capture.go 111 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
capture.go
New file
@@ -0,0 +1,111 @@
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
}