From 01d9022b47e5e20f39ca1115d334c43774378dfc Mon Sep 17 00:00:00 2001 From: zhangmeng <zhangmeng@aiiot.com> Date: 星期三, 25 三月 2020 13:56:16 +0800 Subject: [PATCH] add log for local video --- csrc/thirdparty/gb28181/include/PsToEs.hpp | 96 +++++++++++++++++++++++++++++++++++++++--------- 1 files changed, 78 insertions(+), 18 deletions(-) diff --git a/csrc/thirdparty/gb28181/include/PsToEs.hpp b/csrc/thirdparty/gb28181/include/PsToEs.hpp index 88eb4d9..438b06d 100644 --- a/csrc/thirdparty/gb28181/include/PsToEs.hpp +++ b/csrc/thirdparty/gb28181/include/PsToEs.hpp @@ -4,7 +4,9 @@ #include <deque> #include <pthread.h> +#include <unistd.h> #include "librtsp.h" +#include <sys/time.h> using namespace std; @@ -14,7 +16,7 @@ public: MyQueue():mtx(PTHREAD_MUTEX_INITIALIZER), cond(PTHREAD_COND_INITIALIZER){ t.tv_sec = 0; - t.tv_nsec = 20000000; + t.tv_nsec = 0; } ~MyQueue() { @@ -39,9 +41,16 @@ T pop() { pthread_mutex_lock(&mtx); - while (q.empty()) { - pthread_cond_wait(&cond, &mtx); + if (q.empty()) { + gettimeofday(&now, NULL); + 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); + } + if (q.empty()) { + pthread_mutex_unlock(&mtx); + return 0; } T value = q.front(); q.pop_front(); @@ -82,6 +91,7 @@ pthread_mutex_t mtx; pthread_cond_t cond; timespec t; + struct timeval now; }; typedef struct _buffInfo { @@ -129,7 +139,11 @@ //浠庣紦瀛樹腑鑾峰彇buffinfo frameBuffInfo *buffinfo = _this->m_rtpQueue.pop(); // printf(" m_rtpQueue.pop after \n"); + if(buffinfo != nullptr){ diff = len - buffinfo->buffLen; + }else{ + return 0; + } //甯ч暱澶т簬bufsize if (diff < 0) { @@ -163,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){ @@ -189,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); + 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