From 478d3efea003cc5bb777bdef99a8ea5d7a9e0022 Mon Sep 17 00:00:00 2001
From: zhangmeng <775834166@qq.com>
Date: 星期五, 19 七月 2019 15:24:31 +0800
Subject: [PATCH] init
---
capture.go | 111 +++++++++++++++++++++++++++++++++++++++++++++++++++++++
1 files changed, 111 insertions(+), 0 deletions(-)
diff --git a/capture.go b/capture.go
new file mode 100644
index 0000000..936c4fe
--- /dev/null
+++ b/capture.go
@@ -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
+}
--
Gitblit v1.8.0