From 0e021985f483e593c6ef872b8bcbe299566c7dd2 Mon Sep 17 00:00:00 2001
From: chenshijun <csj_sky@126.com>
Date: 星期二, 03 十二月 2019 15:32:18 +0800
Subject: [PATCH] 增加获取国标图片接口
---
csrc/wrapper.cpp | 21 +++++++
csrc/wrapper.hpp | 2
goffmpeg.go | 13 ++++
cffmpeg.h | 1
libcffmpeg.c | 8 ++
csrc/cffmpeg.cpp | 12 ++++
libcffmpeg.h | 3 +
csrc/thirdparty/gb28181/include/PsToEs.hpp | 77 ++++++++++++++++++++-----
8 files changed, 122 insertions(+), 15 deletions(-)
diff --git a/cffmpeg.h b/cffmpeg.h
index 0a7ebd1..687a4d9 100644
--- a/cffmpeg.h
+++ b/cffmpeg.h
@@ -17,6 +17,7 @@
int c_ffmpeg_get_fps(const cffmpeg h);
void c_ffmpeg_run_gb28181(const cffmpeg h);
+char * c_ffmpeg_get_gb28181_pic(const char *rtspUrl, int *retDataLen);
void c_ffmepg_use_cpu(const cffmpeg h);
/////////passive api
void c_ffmpeg_set_record_duration(const cffmpeg h, const int min, const int max);
diff --git a/csrc/cffmpeg.cpp b/csrc/cffmpeg.cpp
index 4cf92da..029816d 100644
--- a/csrc/cffmpeg.cpp
+++ b/csrc/cffmpeg.cpp
@@ -43,6 +43,18 @@
s->GB28181();
}
+char * c_ffmpeg_get_gb28181_pic(const char *rtspUrl, int *retDataLen){
+ char * retData = (char *)malloc(sizeof(char) * 3000000);
+ int flag = GetGb28181Pic(rtspUrl, retData, retDataLen);
+ if(flag == -1){
+ free(retData);
+ *retDataLen = 0;
+ return NULL;
+ }
+
+ return retData;
+}
+
void c_ffmepg_use_cpu(const cffmpeg h){
Wrapper *s = (Wrapper*)h;
s->CPUDec();
diff --git a/csrc/thirdparty/gb28181/include/PsToEs.hpp b/csrc/thirdparty/gb28181/include/PsToEs.hpp
index 4c10a28..3073a45 100644
--- a/csrc/thirdparty/gb28181/include/PsToEs.hpp
+++ b/csrc/thirdparty/gb28181/include/PsToEs.hpp
@@ -4,6 +4,7 @@
#include <deque>
#include <pthread.h>
+#include <unistd.h>
#include "librtsp.h"
#include <sys/time.h>
@@ -176,21 +177,64 @@
return bufsize;
}
+ static int capturePic(void *opaque, char *buf, int *bufsize) {
+
+ GB28181API *_this = (GB28181API *) opaque;
+ int len = 0;
+ *bufsize = 0;
+
+ do {
+ //浠庣紦瀛樹腑鑾峰彇buffinfo
+ if (_this->m_rtpQueue.count_queue() == 0) {
+// printf(" count_queue == 0 \n");
+ usleep(10000);
+ continue;
+ }
+
+ frameBuffInfo *buffinfo = _this->m_rtpQueue.pop();
+ if (buffinfo == nullptr) {
+ printf(" buffinfo == nullptr \n");
+ return 0;
+ }
+
+ char fileIFrameName[32] = "./tmpCaptureX264IFrame";
+ auto fpIframe = fopen(fileIFrameName, "wb+");
+ fwrite(buffinfo->buff, buffinfo->buffLen, 1, fpIframe);
+ fflush(fpIframe);
+ fclose(fpIframe);
+
+ char cmd[128] = {0};
+ memset(cmd, 0, 128);
+ char fileJpgName[32] = "./tmpCaptureJpg.jpg";
+ sprintf(cmd, "ffmpeg -i %s -y -f image2 -ss 00:00:00 -vframes 1 %s >/dev/null", fileIFrameName,
+ fileJpgName);
+ system(cmd);
+
+ auto fpJpg = fopen(fileJpgName, "rb");
+ if (fpJpg == NULL) {
+ printf("fopen(fileJpgName, \"rb\")\n");
+ return 0;
+ }
+ fseek(fpJpg, 0, SEEK_END);
+ len = ftell(fpJpg);
+ fseek(fpJpg, 0, SEEK_SET);
+ *bufsize = fread(buf, sizeof(char), len, fpJpg);
+ fclose(fpJpg);
+
+ delete[] buffinfo->buff;
+ delete buffinfo;
+
+ memset(cmd, 0, 128);
+ sprintf(cmd, "rm %s %s >/dev/null", fileIFrameName, fileJpgName);
+ system(cmd);
+ } while (*bufsize == 0);
+
+ return *bufsize;
+ }
+
static void streamCallBack(int datatype, int frametype, unsigned char *data, unsigned int datalen, long userdata)
{
GB28181API *_this = (GB28181API *)userdata;
- //printf("userdata:%ld,datatype:%d, frametype:%d, datalen:%d\n", userdata, datatype, frametype, datalen);
-
- /*static FILE* fp_write = NULL;
- if (!fp_write)
-
- {
-
- fp_write = fopen("stream_callback.mp4", "wb+");
-
- }
-
- fwrite(data, sizeof(char), datalen, fp_write); */
static bool startFlag = false;
if(frametype == GB_VIDEO_FRAME_I){
@@ -202,9 +246,12 @@
}
long addCamera(string &rtsp){
-// long userdata = 1001;//
- handle = RTSPSTREAM_Open(rtsp.c_str(), streamCallBack, (long)this);
- printf("RTSPSTREAM_Open, handle:%ld \n", handle);
+ static int count = 0;
+ while (handle == -1 && count <= 3) {
+ count ++;
+ handle = RTSPSTREAM_Open(rtsp.c_str(), streamCallBack, (long) this);
+ printf("RTSPSTREAM_Open, handle:%ld \n", handle);
+ }
return handle;
}
diff --git a/csrc/wrapper.cpp b/csrc/wrapper.cpp
index 86662a1..a8e8f6c 100644
--- a/csrc/wrapper.cpp
+++ b/csrc/wrapper.cpp
@@ -501,5 +501,26 @@
free(c);
}
+ int GetGb28181Pic(const char *rtspUrl, char *retData, int *retDataLen){
+ int ret = 0;
+ std::string fn = rtspUrl;
+
+ auto handle_gb28181 = new GB28181API;
+ if(handle_gb28181->addCamera(fn) == -1){
+ delete(handle_gb28181);
+ logIt("do addCamera Error\n");
+ return -1;
+ }
+
+ int retLen = handle_gb28181->capturePic(handle_gb28181, retData, retDataLen);
+ if(retLen == 0){
+ logIt("do capturePic failed:%d");
+ ret = -1;
+ }
+
+ handle_gb28181->deleteCamera();
+ return ret;
+ }
+
}
diff --git a/csrc/wrapper.hpp b/csrc/wrapper.hpp
index 73da823..4d51708 100644
--- a/csrc/wrapper.hpp
+++ b/csrc/wrapper.hpp
@@ -89,6 +89,8 @@
const int dstW, const int dstH, const int dstFormat, const int flag);
uint8_t *Convert(void *h, uint8_t *src);
void DestoryConvertor(void *h);
+
+ int GetGb28181Pic(const char *filename, char *retData, int *retDataLen);
}
#endif
\ No newline at end of file
diff --git a/goffmpeg.go b/goffmpeg.go
index efaf6cc..a2f46bc 100644
--- a/goffmpeg.go
+++ b/goffmpeg.go
@@ -99,3 +99,16 @@
func (h *GoFFMPEG) FPS() int {
return int(C.wrap_fn_fps(unsafe.Pointer(libcffmpeg), h.ffmpeg))
}
+
+// GetGBJpg Get GB28181 Jpg
+func GetGBJpg(rtspUrl string) []byte {
+ rtsp := C.CString(rtspUrl)
+ defer C.free(unsafe.Pointer(rtsp))
+ var jpgLen C.int
+
+ pic := C.wrap_fn_get_gb28181_pic(unsafe.Pointer(libcffmpeg), rtsp, &jpgLen)
+ defer C.free(unsafe.Pointer(pic))
+
+ retJpg := C.GoBytes(unsafe.Pointer(pic), jpgLen)
+ return retJpg
+}
\ No newline at end of file
diff --git a/libcffmpeg.c b/libcffmpeg.c
index 7c30caf..c6d05f8 100644
--- a/libcffmpeg.c
+++ b/libcffmpeg.c
@@ -79,6 +79,14 @@
fn_gb28181(h);
}
+char * wrap_fn_get_gb28181_pic(void *lib, const char *rtspUrl, int *retDataLen){
+ if (!fn_get_gb28181_pic){
+ fn_get_gb28181_pic = (lib_cffmpeg_get_gb28181_pic)dlsym(lib, "c_ffmpeg_get_gb28181_pic");
+ if(!fn_get_gb28181_pic) return;
+ }
+ return fn_get_gb28181_pic(rtspUrl, retDataLen);
+}
+
void wrap_fn_use_cpu(void *lib, const cffmpeg h){
if (!fn_cpu){
fn_cpu = (lib_cffmpeg_cpu)dlsym(lib, "c_ffmepg_use_cpu");
diff --git a/libcffmpeg.h b/libcffmpeg.h
index 7bc4998..59e6572 100644
--- a/libcffmpeg.h
+++ b/libcffmpeg.h
@@ -16,6 +16,7 @@
typedef void (*lib_cffmpeg_run)(const cffmpeg, const char*);
typedef int (*lib_cffmpeg_fps)(const cffmpeg);
typedef void (*lib_cffmpeg_gb28181)(const cffmpeg);
+typedef char * (*lib_cffmpeg_get_gb28181_pic)(const char *rtspUrl, int *retDataLen);
typedef void (*lib_cffmpeg_cpu)(const cffmpeg);
typedef void (*lib_cffmpeg_rec_duration)(const cffmpeg, const int, const int);
typedef void (*lib_cffmpeg_recorder)(const cffmpeg, const char*, const char*, const int64_t, int, int, int);
@@ -32,6 +33,7 @@
static lib_cffmpeg_run fn_run = NULL;
static lib_cffmpeg_fps fn_fps = NULL;
static lib_cffmpeg_gb28181 fn_gb28181 = NULL;
+static lib_cffmpeg_get_gb28181_pic fn_get_gb28181_pic = NULL;
static lib_cffmpeg_cpu fn_cpu = NULL;
static lib_cffmpeg_rec_duration fn_rec_duration = NULL;
static lib_cffmpeg_recorder fn_recorder = NULL;
@@ -52,6 +54,7 @@
void wrap_fn_run(void *lib, const cffmpeg h, const char* input);
int wrap_fn_fps(void *lib, const cffmpeg h);
void wrap_fn_run_gb28181(void *lib, const cffmpeg h);
+char * wrap_fn_get_gb28181_pic(void *lib, const char *rtspUrl, int *retDataLen);
void wrap_fn_use_cpu(void *lib, const cffmpeg h);
void wrap_fn_rec_duration(void *lib, const cffmpeg h, const int min, const int max);
void wrap_fn_recorder(void *lib, const cffmpeg h, const char* id, const char* dir, const int64_t fid, int mind, int maxd, int audio);
--
Gitblit v1.8.0