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