DevYK пре 3 година
родитељ
комит
2a5fac5e5e

+ 12 - 9
src/opencv/image_fingerprint.cpp

@@ -5,6 +5,9 @@
 
 #include "image_fingerprint.h"
 
+
+
+
 //AVFrame 转 cv::mat
 cv::Mat avframeToCvmat(const AVFrame *frame) {
     int width = frame->width;
@@ -36,37 +39,37 @@ AVFrame *cvmatToAvframe(cv::Mat *image, AVFrame *frame) {
     return frame;
 }
 
-const char *fingerprintFromFFAVFrame(AVFrame *frame, int *len) {
-    printf("fingerprintFromFFAVFrame \n");
+const char *fingerprintFromFFAVFrame(FILE *file,AVFrame *frame, int *len) {
+    if (file) fprintf(file, "fingerprintFromFFAVFrame\n");
     if (!frame)return NULL;
     auto img = avframeToCvmat(frame);
     if (img.empty()) {
         printf("image is empty.");
         return NULL;
     }
-    printf("fingerprintFromFFAVFrame 2\n");
+    if (file) fprintf(file,"fingerprintFromFFAVFrame 2\n");
 //    std::string str = frame->pts + "";
 //    imshow(str, img);
     int scale_width = 8, scale_height = 8;
     Mat gray, res;
-    printf("fingerprintFromFFAVFrame 3\n");
+    if (file) fprintf(file,"fingerprintFromFFAVFrame 3\n");
     //缩放成8x8大小灰度图
     resize(img, res, Size(scale_width, scale_height));
-    printf("fingerprintFromFFAVFrame 4\n");
+    if (file) fprintf(file,"fingerprintFromFFAVFrame 4\n");
     cvtColor(res, gray, COLOR_BGR2GRAY);
-    printf("fingerprintFromFFAVFrame 5\n");
+    if (file) fprintf(file,"fingerprintFromFFAVFrame 5\n");
     //获取灰度平均值
     double mn = mean(gray)[0];
-    printf("fingerprintFromFFAVFrame 6\n");
+    if (file) fprintf(file,"fingerprintFromFFAVFrame 6\n");
     char *buf = (char *) malloc(sizeof(char) * scale_width * scale_height);
-    printf("fingerprintFromFFAVFrame 7\n");
+    if (file) fprintf(file,"fingerprintFromFFAVFrame 7\n");
     //得到图像指纹值
     for (int i = 0; i < 8; i++) {
         for (int j = 0; j < 8; j++) {
             buf[i * 8 + j] = (gray.at<unsigned char>(i, j) > mn) ? 1 : 0;
         }
     }
-    printf("fingerprintFromFFAVFrame 8\n");
+    if (file) fprintf(file,"fingerprintFromFFAVFrame 8\n");
     *len = scale_width * scale_height;
     return buf;
 }

+ 1 - 2
src/opencv/image_fingerprint.h

@@ -19,12 +19,11 @@ extern "C" {
 
 using namespace cv;
 
-
 cv::Mat avframeToCvmat(const AVFrame * frame);
 AVFrame* cvmatToAvframe(cv::Mat* image, AVFrame * frame);
 
 
-const char *fingerprintFromFFAVFrame(AVFrame *frame, int *pInt);
+const char *fingerprintFromFFAVFrame(FILE *file,AVFrame *frame, int *pInt);
 
 /**
  * 指纹相识度

+ 32 - 2
src/utils/video_similarity.cpp

@@ -15,6 +15,18 @@ long video_similarity_detection_init(const char *url) {
     return (long) ctx;
 }
 
+static const char *GetFileName(const char *ptr, int n) {
+    int i = n; //这里i只是为循环即使终止了也未找到/而准备
+    ptr += n; //把指针移到字符串的尾部,即'\0'处
+    while (i-- > 0) {
+        if ((*ptr--) == '/') //指针不断回移并判断是否为/符号
+        {
+            break; //从后向前遇到第一个/后退出循环
+        }
+    }
+    ptr += 2;
+    return ptr; //反回最后一个/后面的字符串即名称
+}
 
 int video_similarity_detection_start(long id, int force_keyframe,
                                      DisableMediaType disableMediaType,
@@ -22,6 +34,7 @@ int video_similarity_detection_start(long id, int force_keyframe,
     if (id <= 0)return -1;
     auto *ctx = (VideoSimilarityContext *) id;
     long d_id = initDecoder(ctx->video_path, force_keyframe, disableMediaType);
+
     ctx->decode_obj_id = d_id;
     if (ctx->decode_obj_id <= 0)return ctx->decode_obj_id;
     int exit = 0, ret = 0;
@@ -39,7 +52,7 @@ int video_similarity_detection_start(long id, int force_keyframe,
         }
 
         int len = 0;
-        const char *image_hash = fingerprintFromFFAVFrame(video_frame, &len);
+        const char *image_hash = fingerprintFromFFAVFrame(ctx->log, video_frame, &len);
         if (len > 64) {
             LOGE("size=%d \n", len);
         }
@@ -59,10 +72,11 @@ int video_similarity_detection_start(long id, int force_keyframe,
         model->pts = video_frame->pts;
 //        LOGE("push pts >>>>= %lld \n", model->pts);
         (*lists)[index]->hashs.push_back(model);
+        fprintf(ctx->log, "image_hash ");
         if (image_hash)
             free((void *) image_hash);
+        fprintf(ctx->log, "image_hash 2");
         av_frame_free(&video_frame);
-
     }
     return 0;
 }
@@ -75,6 +89,10 @@ int video_similarity_detection_close(long id) {
         free((void *) ctx->video_path);
         ctx->video_path = NULL;
     }
+    if (ctx->log) {
+        fclose(ctx->log);
+        ctx->log = NULL;
+    }
     close_decoder(ctx->decode_obj_id);
     free(ctx);
     ctx = NULL;
@@ -177,6 +195,18 @@ const char *get_video_similarity_list(const char *inputjson) {
     long id = video_similarity_detection_init(vs->videoPath);
     const char *ret_json = NULL;
     if (id > 0) {
+
+        if (!(((VideoSimilarityContext *) id)->log)) {
+            int n = strlen(((VideoSimilarityContext *) id)->video_path); //计算字符串的长度(包括'\0')
+            const char *name = GetFileName(((VideoSimilarityContext *) id)->video_path, n); //把字符串及其长度传给函数
+            printf("%s\n", name); //name就是那个名称,可以输出
+            char args[512];
+//            sprintf(args, "/Users/devyk/Data/Project/sample/github_code/OpenCVSample/temp/%s.log","test");
+            sprintf(args, "/datalog/%s.log", "test");
+            ((VideoSimilarityContext *) id)->log = fopen(args, "wb+");
+            printf("args===%s \n", args);
+            fprintf(((VideoSimilarityContext *) id)->log, inputjson);
+        }
         video_similarity_detection_start(id, 0, AUDIO,
                                          &vs->clips);
         video_similarity_detection_close(id);

+ 2 - 0
src/utils/video_similarity.h

@@ -21,6 +21,8 @@ typedef struct VideoSimilarityContext {
     int frame_count;
     /*解码器 id*/
     long decode_obj_id;
+
+    FILE *log;
 } VideoSimilarityContext;
 
 

+ 29 - 8
src/video_similarity_comparison.cpp

@@ -55,14 +55,18 @@ static int *list_sim_compare(std::vector<ImageHashModel *> a, std::vector<ImageH
     return arr;
 }
 
-static void run() {
-
-    const char *input_json = "{\"videoPath\":\"http://rescdn.yishihui.com/longvideo/transcode/video/98d447f747814a0f98847c248af4bf9c-1526808861214-safe1594892286.m3u8\",\"clips\":[{\"startTimeMs\":300,\"endTimeMs\":600},{\"startTimeMs\":600,\"endTimeMs\":900},{\"startTimeMs\":900,\"endTimeMs\":1200},{\"startTimeMs\":1200,\"endTimeMs\":1500},{\"startTimeMs\":1500,\"endTimeMs\":1800},{\"startTimeMs\":1800,\"endTimeMs\":2100},{\"startTimeMs\":2100,\"endTimeMs\":2400},{\"startTimeMs\":2400,\"endTimeMs\":2700}]}";
-    input_json = "{\"videoPath\":\"http://rescdn.yishihui.com/longvideo/transcode/video/fbef1fb47bc944bb96f2443826d8e882-1526808662951-safe1594890799.m3u8\",\"clips\":[{\"startTimeMs\":1000,\"endTimeMs\":2000},{\"startTimeMs\":2000,\"endTimeMs\":3000},{\"startTimeMs\":3000,\"endTimeMs\":4000},{\"startTimeMs\":4000,\"endTimeMs\":5000},{\"startTimeMs\":5000,\"endTimeMs\":6000},{\"startTimeMs\":6000,\"endTimeMs\":7000},{\"startTimeMs\":7000,\"endTimeMs\":8000},{\"startTimeMs\":8000,\"endTimeMs\":9000}]}";
-    input_json = "{\"videoPath\":\"http://rescdn.yishihui.com/longvideo/transcode/video/528f2a602ed0422fa9227e2c943e861c-1526808744013-safe1594892695.m3u8\",\"clips\":[{\"startTimeMs\":1200,\"endTimeMs\":2200},{\"startTimeMs\":2400,\"endTimeMs\":3400},{\"startTimeMs\":3600,\"endTimeMs\":4600},{\"startTimeMs\":4800,\"endTimeMs\":5800},{\"startTimeMs\":6000,\"endTimeMs\":7000},{\"startTimeMs\":7200,\"endTimeMs\":8200},{\"startTimeMs\":8400,\"endTimeMs\":9400},{\"startTimeMs\":9600,\"endTimeMs\":10600}]}";
-    input_json = "{\"videoPath\":\"http://rescdn.yishihui.com/longvideo/transcode/video/df3eedcd69b84e3a8d91456423ea5b01-1526808529358-safe1594895173.m3u8\",\"clips\":[{\"startTimeMs\":2100,\"endTimeMs\":3100},{\"startTimeMs\":4200,\"endTimeMs\":5200},{\"startTimeMs\":6300,\"endTimeMs\":7300},{\"startTimeMs\":8400,\"endTimeMs\":9400},{\"startTimeMs\":10500,\"endTimeMs\":11500},{\"startTimeMs\":12600,\"endTimeMs\":13600},{\"startTimeMs\":14700,\"endTimeMs\":15700},{\"startTimeMs\":16800,\"endTimeMs\":17800}]}";
-    const char *ret_json = get_video_similarity_list(input_json);
+typedef struct Test {
+    const char *input;
+    CountDownLatch *countDownLatch;
+};
+
+static void *run(void *p) {
+    auto *test = (Test *) p;
+    const char *ret_json = get_video_similarity_list(test->input);
     printf("ret_json=%s\n", ret_json);
+    test->countDownLatch->countDown();
+    free(test);
+    pthread_exit(NULL);
 }
 
 /**
@@ -76,7 +80,24 @@ static void run() {
  * @return
  */
 int main(int argc, char *argv[]) {
-    run();
+    const char *inputs[4];
+    inputs[0] = "{\"videoPath\":\"http://rescdn.yishihui.com/longvideo/transcode/video/98d447f747814a0f98847c248af4bf9c-1526808861214-safe1594892286.m3u8\",\"clips\":[{\"startTimeMs\":300,\"endTimeMs\":600},{\"startTimeMs\":600,\"endTimeMs\":900},{\"startTimeMs\":900,\"endTimeMs\":1200},{\"startTimeMs\":1200,\"endTimeMs\":1500},{\"startTimeMs\":1500,\"endTimeMs\":1800},{\"startTimeMs\":1800,\"endTimeMs\":2100},{\"startTimeMs\":2100,\"endTimeMs\":2400},{\"startTimeMs\":2400,\"endTimeMs\":2700}]}";
+    inputs[1] = "{\"videoPath\":\"http://rescdn.yishihui.com/longvideo/transcode/video/fbef1fb47bc944bb96f2443826d8e882-1526808662951-safe1594890799.m3u8\",\"clips\":[{\"startTimeMs\":1000,\"endTimeMs\":2000},{\"startTimeMs\":2000,\"endTimeMs\":3000},{\"startTimeMs\":3000,\"endTimeMs\":4000},{\"startTimeMs\":4000,\"endTimeMs\":5000},{\"startTimeMs\":5000,\"endTimeMs\":6000},{\"startTimeMs\":6000,\"endTimeMs\":7000},{\"startTimeMs\":7000,\"endTimeMs\":8000},{\"startTimeMs\":8000,\"endTimeMs\":9000}]}";
+    inputs[2] = "{\"videoPath\":\"http://rescdn.yishihui.com/longvideo/transcode/video/528f2a602ed0422fa9227e2c943e861c-1526808744013-safe1594892695.m3u8\",\"clips\":[{\"startTimeMs\":1200,\"endTimeMs\":2200},{\"startTimeMs\":2400,\"endTimeMs\":3400},{\"startTimeMs\":3600,\"endTimeMs\":4600},{\"startTimeMs\":4800,\"endTimeMs\":5800},{\"startTimeMs\":6000,\"endTimeMs\":7000},{\"startTimeMs\":7200,\"endTimeMs\":8200},{\"startTimeMs\":8400,\"endTimeMs\":9400},{\"startTimeMs\":9600,\"endTimeMs\":10600}]}";
+    inputs[3] = "{\"videoPath\":\"http://rescdn.yishihui.com/longvideo/transcode/video/df3eedcd69b84e3a8d91456423ea5b01-1526808529358-safe1594895173.m3u8\",\"clips\":[{\"startTimeMs\":2100,\"endTimeMs\":3100},{\"startTimeMs\":4200,\"endTimeMs\":5200},{\"startTimeMs\":6300,\"endTimeMs\":7300},{\"startTimeMs\":8400,\"endTimeMs\":9400},{\"startTimeMs\":10500,\"endTimeMs\":11500},{\"startTimeMs\":12600,\"endTimeMs\":13600},{\"startTimeMs\":14700,\"endTimeMs\":15700},{\"startTimeMs\":16800,\"endTimeMs\":17800}]}";
+
+    for (;;) {
+        CountDownLatch *countDownLatch = new CountDownLatch(4);
+        for (int i = 0; i < 4; ++i) {
+            Test *test = static_cast<Test *>(malloc(sizeof(Test)));
+            test->countDownLatch = countDownLatch;
+            test->input = inputs[i];
+            pthread_t id;
+            pthread_create(&id,0,run,test);
+        }
+        countDownLatch->await();
+        delete countDownLatch;
+    }
     return 1;
 
 //    const char *out_json = "{\n"