video analysis2.0拆分,ffmpeg封装go接口库
chenshijun
2019-12-03 0e021985f483e593c6ef872b8bcbe299566c7dd2
增加获取国标图片接口
8个文件已修改
137 ■■■■ 已修改文件
cffmpeg.h 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
csrc/cffmpeg.cpp 12 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
csrc/thirdparty/gb28181/include/PsToEs.hpp 77 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
csrc/wrapper.cpp 21 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
csrc/wrapper.hpp 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
goffmpeg.go 13 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
libcffmpeg.c 8 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
libcffmpeg.h 3 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
cffmpeg.h
@@ -17,6 +17,7 @@
int c_ffmpeg_get_fps(const cffmpeg h);
void c_ffmpeg_run_gb28181(const cffmpeg h);
char * c_ffmpeg_get_gb28181_pic(const char *rtspUrl, int *retDataLen);
void c_ffmepg_use_cpu(const cffmpeg h);
/////////passive api
void c_ffmpeg_set_record_duration(const cffmpeg h, const int min, const int max);
csrc/cffmpeg.cpp
@@ -43,6 +43,18 @@
    s->GB28181();
}
char * c_ffmpeg_get_gb28181_pic(const char *rtspUrl, int *retDataLen){
    char * retData = (char *)malloc(sizeof(char) * 3000000);
    int flag = GetGb28181Pic(rtspUrl, retData, retDataLen);
    if(flag == -1){
        free(retData);
        *retDataLen = 0;
        return NULL;
    }
    return retData;
}
void c_ffmepg_use_cpu(const cffmpeg h){
    Wrapper *s = (Wrapper*)h;
    s->CPUDec();
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;
    }
csrc/wrapper.cpp
@@ -501,5 +501,26 @@
        free(c);
    }
    int GetGb28181Pic(const char *rtspUrl, char *retData, int *retDataLen){
        int ret = 0;
        std::string fn = rtspUrl;
        auto handle_gb28181 = new GB28181API;
        if(handle_gb28181->addCamera(fn) == -1){
            delete(handle_gb28181);
            logIt("do addCamera Error\n");
            return -1;
        }
        int retLen = handle_gb28181->capturePic(handle_gb28181, retData, retDataLen);
        if(retLen == 0){
            logIt("do capturePic failed:%d");
            ret = -1;
        }
        handle_gb28181->deleteCamera();
        return ret;
    }
}
csrc/wrapper.hpp
@@ -89,6 +89,8 @@
                          const int dstW, const int dstH, const int dstFormat, const int flag);
    uint8_t *Convert(void *h, uint8_t *src);
    void DestoryConvertor(void *h);
    int GetGb28181Pic(const char *filename, char *retData, int *retDataLen);
}
#endif
goffmpeg.go
@@ -99,3 +99,16 @@
func (h *GoFFMPEG) FPS() int {
    return int(C.wrap_fn_fps(unsafe.Pointer(libcffmpeg), h.ffmpeg))
}
// GetGBJpg Get GB28181 Jpg
func GetGBJpg(rtspUrl string) []byte {
    rtsp := C.CString(rtspUrl)
    defer C.free(unsafe.Pointer(rtsp))
    var jpgLen C.int
    pic := C.wrap_fn_get_gb28181_pic(unsafe.Pointer(libcffmpeg), rtsp, &jpgLen)
    defer C.free(unsafe.Pointer(pic))
    retJpg := C.GoBytes(unsafe.Pointer(pic), jpgLen)
    return retJpg
}
libcffmpeg.c
@@ -79,6 +79,14 @@
    fn_gb28181(h);
}
char * wrap_fn_get_gb28181_pic(void *lib, const char *rtspUrl, int *retDataLen){
    if (!fn_get_gb28181_pic){
        fn_get_gb28181_pic = (lib_cffmpeg_get_gb28181_pic)dlsym(lib, "c_ffmpeg_get_gb28181_pic");
        if(!fn_get_gb28181_pic) return;
    }
    return fn_get_gb28181_pic(rtspUrl, retDataLen);
}
void wrap_fn_use_cpu(void *lib, const cffmpeg h){
    if (!fn_cpu){
        fn_cpu = (lib_cffmpeg_cpu)dlsym(lib, "c_ffmepg_use_cpu");
libcffmpeg.h
@@ -16,6 +16,7 @@
typedef void (*lib_cffmpeg_run)(const cffmpeg, const char*);
typedef int (*lib_cffmpeg_fps)(const cffmpeg);
typedef void (*lib_cffmpeg_gb28181)(const cffmpeg);
typedef char * (*lib_cffmpeg_get_gb28181_pic)(const char *rtspUrl, int *retDataLen);
typedef void (*lib_cffmpeg_cpu)(const cffmpeg);
typedef void (*lib_cffmpeg_rec_duration)(const cffmpeg, const int, const int);
typedef void (*lib_cffmpeg_recorder)(const cffmpeg, const char*, const char*, const int64_t, int, int, int);
@@ -32,6 +33,7 @@
static lib_cffmpeg_run                 fn_run = NULL;
static lib_cffmpeg_fps                 fn_fps = NULL;
static lib_cffmpeg_gb28181             fn_gb28181 = NULL;
static lib_cffmpeg_get_gb28181_pic     fn_get_gb28181_pic = NULL;
static lib_cffmpeg_cpu                 fn_cpu = NULL;
static lib_cffmpeg_rec_duration        fn_rec_duration = NULL;
static lib_cffmpeg_recorder            fn_recorder = NULL;
@@ -52,6 +54,7 @@
void wrap_fn_run(void *lib, const cffmpeg h, const char* input);
int wrap_fn_fps(void *lib, const cffmpeg h);
void wrap_fn_run_gb28181(void *lib, const cffmpeg h);
char * wrap_fn_get_gb28181_pic(void *lib, const char *rtspUrl, int *retDataLen);
void wrap_fn_use_cpu(void *lib, const cffmpeg h);
void wrap_fn_rec_duration(void *lib, const cffmpeg h, const int min, const int max);
void wrap_fn_recorder(void *lib, const cffmpeg h, const char* id, const char* dir, const int64_t fid, int mind, int maxd, int audio);