video analysis2.0拆分,ffmpeg封装go接口库
chenshijun
2019-12-03 0e021985f483e593c6ef872b8bcbe299566c7dd2
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;
   }