From c7d2513c42d56bab8da3ba2ba312326908241874 Mon Sep 17 00:00:00 2001
From: pansen <pansen626@sina.com>
Date: 星期六, 09 三月 2019 18:40:52 +0800
Subject: [PATCH] 增加断线重连功能,增加国标的流地址。

---
 QiaoJiaSystem/GB28181DecoderModel/VideoCaptureElementWithRtp.cpp |   77 +++++++++++++++++++++++---------------
 1 files changed, 46 insertions(+), 31 deletions(-)

diff --git a/QiaoJiaSystem/GB28181DecoderModel/VideoCaptureElementWithRtp.cpp b/QiaoJiaSystem/GB28181DecoderModel/VideoCaptureElementWithRtp.cpp
index bf433a6..3efd923 100644
--- a/QiaoJiaSystem/GB28181DecoderModel/VideoCaptureElementWithRtp.cpp
+++ b/QiaoJiaSystem/GB28181DecoderModel/VideoCaptureElementWithRtp.cpp
@@ -35,6 +35,38 @@
 
 bool BASICGB28181::VideoCaptureElementWithRtp::startRtpStream(int streamTransType) {
 
+    std::thread waitSignalAndEmit([&](BASICGB28181::VideoCaptureElementWithRtp *p_this) {
+        p_this->m_waitSignal = true;
+        while (p_this->m_waitSignal) {
+//#TODO wait test
+#ifdef TestCode
+            DBG("waitSignal(\"DecoderImageOK\") begin");
+#endif
+            gSignalLock.waitSignal(p_this->m_chanPubID + "DecoderImageOK");
+#ifdef TestCode
+            DBG("waitSignal(\"DecoderImageOK\") after");
+#endif
+            p_this->m_picCount++;
+            //鍑犲紶閫変竴寮犳斁鍏edis
+            if (p_this->m_picCount % m_nPicsPickOne != 0) {
+                continue;
+            } else {
+                p_this->m_picCount.store(0);
+            }
+
+            p_this->m_fFmpegDecoderJPG.getImage().copyTo(p_this->m_image);
+            {
+                cv::Mat copyMat;
+                std::string imageName = p_this->m_fFmpegDecoderJPG.GetImageName();
+                p_this->m_image.copyTo(copyMat);
+                m_pManager->SaveImageToRedis(p_this->m_chanPubID, imageName, copyMat);
+            }
+            p_this->submit();
+        }
+        INFO("waitSignalAndEmit is exit...");
+    }, this);
+    waitSignalAndEmit.detach();
+
     TryCath(
     //--------------鍥芥爣璁惧鎴栧垯鍥芥爣涓嬬骇骞冲彴蹇呴』鏀寔GB28181-2016----------------------------------------------
         std::thread videoCaptureElementThd([&](VideoCaptureElementWithRtp *p_this, int streamType) {
@@ -73,8 +105,10 @@
                 }
                 DBG("videoCaptureElementThd stop ...");
                 C_RealVideoStop(lrealhandle);
+                p_this->m_waitSignal = false;
                 DBG("videoCaptureElementThd stop ok...");
             } else {
+                p_this->m_waitSignal = false;
                 p_this->m_running = false;
                 p_this->m_fFmpegDecoderJPG.stopThd();
                 ERR(p_this->m_chanPubID << " C_RealVideoStart is error lrealhandle is  " << lrealhandle);
@@ -124,42 +158,23 @@
 }
 
 void BASICGB28181::VideoCaptureElementWithRtp::threadFunc() {
+    if ((!m_running) || (!m_waitSignal)) {
+        if (reopenTime < 0) {
+            stop();
+            INFO("grabFrame faild, element stopping");
+            return;
+        } else {
+            usleep(reopenTime * 1000);
+            INFO("grabFrame faild, try reopen video: ");
+            startRtpStream(m_streamTransType);
+            return;
+        }
+    }
     fireConnectors();
 }
 
 void BASICGB28181::VideoCaptureElementWithRtp::threadInitial() {
 
-    std::thread waitSignalAndEmit([&](BASICGB28181::VideoCaptureElementWithRtp *p_this) {
-        p_this->m_waitSignal = true;
-        while (p_this->m_waitSignal) {
-//#TODO wait test
-#ifdef TestCode
-            DBG("waitSignal(\"DecoderImageOK\") begin");
-#endif
-            gSignalLock.waitSignal(p_this->m_chanPubID + "DecoderImageOK");
-#ifdef TestCode
-            DBG("waitSignal(\"DecoderImageOK\") after");
-#endif
-            p_this->m_picCount++;
-            //鍑犲紶閫変竴寮犳斁鍏edis
-            if (p_this->m_picCount % m_nPicsPickOne != 0) {
-                continue;
-            } else {
-                p_this->m_picCount.store(0);
-            }
-
-            p_this->m_fFmpegDecoderJPG.getImage().copyTo(p_this->m_image);
-            {
-                cv::Mat copyMat;
-                std::string imageName = p_this->m_fFmpegDecoderJPG.GetImageName();
-                p_this->m_image.copyTo(copyMat);
-                m_pManager->SaveImageToRedis(p_this->m_chanPubID, imageName, copyMat);
-            }
-            p_this->submit();
-        }
-        INFO("waitSignalAndEmit is exit...");
-    }, this);
-    waitSignalAndEmit.detach();
     startRtpStream(m_streamTransType);
 }
 

--
Gitblit v1.8.0