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/thirdparty/gb28181/include/PsToEs.hpp |   77 +++++++++++++++++++++++++++++++-------
 1 files changed, 62 insertions(+), 15 deletions(-)

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;
 	}
 

--
Gitblit v1.8.0