From 19b3ad6e4e9c8e195e9255d5448ab5952b1ed54e Mon Sep 17 00:00:00 2001 From: zhangmeng <775834166@qq.com> Date: 星期二, 25 五月 2021 16:42:02 +0800 Subject: [PATCH] bug fixed gb28181 capture --- csrc/thirdparty/gb28181/include/PsToEs.hpp | 55 ++++++++++++++++++++++++++++++++++--------------------- 1 files changed, 34 insertions(+), 21 deletions(-) diff --git a/csrc/thirdparty/gb28181/include/PsToEs.hpp b/csrc/thirdparty/gb28181/include/PsToEs.hpp index 3073a45..7a6278c 100644 --- a/csrc/thirdparty/gb28181/include/PsToEs.hpp +++ b/csrc/thirdparty/gb28181/include/PsToEs.hpp @@ -43,7 +43,7 @@ pthread_mutex_lock(&mtx); if (q.empty()) { gettimeofday(&now, NULL); - t.tv_sec = now.tv_sec + 5; + t.tv_sec = now.tv_sec + 3; t.tv_nsec = now.tv_usec * 1000; // pthread_cond_wait(&cond, &mtx); pthread_cond_timedwait(&cond, &mtx, &t); @@ -177,13 +177,17 @@ return bufsize; } - static int capturePic(void *opaque, char *buf, int *bufsize) { + static int capturePic(void *opaque, char *buf, int *bufsize, const int tt) { GB28181API *_this = (GB28181API *) opaque; int len = 0; *bufsize = 0; + int ttt = 0; do { + if (ttt > tt) return 0; + ttt++; + //浠庣紦瀛樹腑鑾峰彇buffinfo if (_this->m_rtpQueue.count_queue() == 0) { // printf(" count_queue == 0 \n"); @@ -196,33 +200,42 @@ printf(" buffinfo == nullptr \n"); return 0; } - +//////////////////////////////////////////////////////// + FILE* fpJpg = NULL; + char fileJpgName[32] = "./tmpCaptureJpg.jpg"; char fileIFrameName[32] = "./tmpCaptureX264IFrame"; - auto fpIframe = fopen(fileIFrameName, "wb+"); - fwrite(buffinfo->buff, buffinfo->buffLen, 1, fpIframe); - fflush(fpIframe); - fclose(fpIframe); + char cmd[512] = {0}; - 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); + for(int i = 0; i < 10 * 25; i++){ + if (!buffinfo){ + buffinfo = _this->m_rtpQueue.pop(); + } + auto fpIframe = fopen(fileIFrameName, "wb+"); + fwrite(buffinfo->buff, buffinfo->buffLen, 1, fpIframe); + fflush(fpIframe); + fclose(fpIframe); - auto fpJpg = fopen(fileJpgName, "rb"); - if (fpJpg == NULL) { - printf("fopen(fileJpgName, \"rb\")\n"); - return 0; + memset(cmd, 0, 512); + sprintf(cmd, "ffmpeg -i %s -y -f image2 -ss 00:00:00 -vframes 1 %s >/dev/null", fileIFrameName, + fileJpgName); + int rr = system(cmd); + + delete[] buffinfo->buff; + delete buffinfo; + buffinfo = nullptr; + + fpJpg = fopen(fileJpgName, "rb"); + if (fpJpg) { + break; + } } +/////////////////////////////////////////////////////////// + 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); @@ -246,7 +259,7 @@ } long addCamera(string &rtsp){ - static int count = 0; + int count = 0; while (handle == -1 && count <= 3) { count ++; handle = RTSPSTREAM_Open(rtsp.c_str(), streamCallBack, (long) this); -- Gitblit v1.8.0