video_similarity_comparison.cpp 9.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218
  1. //
  2. // Created by 阳坤 on 2022/3/1.
  3. //
  4. #include "utils/video_similarity.h"
  5. #include "utils/count_down_latch.h"
  6. #include "ffmpeg/av_tools.h"
  7. extern "C" {
  8. #include "utils/md5.h"
  9. }
  10. typedef struct VsimBean {
  11. const char *filepath;
  12. const char *image_md5;
  13. std::vector<VideoSimilarityModel *> lists;
  14. pthread_t id;
  15. } VsimBean;
  16. static void run(const char *filepath, std::vector<VideoSimilarityModel *> *list) {
  17. long id = video_similarity_detection_init(filepath, nullptr);
  18. if (id > 0) {
  19. int ret = video_similarity_detection_start(id, 0, AUDIO,
  20. list);
  21. // char md5_str[64] = {0};
  22. // if (get_file_md5(vsimBean->filepath, md5_str) > 0);
  23. // vsimBean->image_md5 = strdup(md5_str);
  24. video_similarity_detection_close(id);
  25. }
  26. }
  27. static void *run_thread(void *p) {
  28. auto *vsimBean = (VsimBean *) p;
  29. run(vsimBean->filepath, &vsimBean->lists);
  30. return 0;
  31. }
  32. typedef struct Test {
  33. const char *input;
  34. CountDownLatch *countDownLatch;
  35. };
  36. static void *run(void *p) {
  37. auto *test = (Test *) p;
  38. const char *test_3 = "{\"videoPath\":\"/Users/ehlxr/Workspaces/tzld/videoDNA/videoDNA-core/target/tmposs/2.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}]}";
  39. const char *ret_json3 = get_video_similarity_list(test_3);
  40. printf("====> %s",ret_json3);
  41. // const char *ret_json = get_video_similarity_list(test_1);
  42. // const char *ret_json2 = get_video_similarity_list(test_2);
  43. // printf("ret_json=%s\n", ret_json);
  44. // printf("相似值为:%f \n", get_video_similarity_value(ret_json, ret_json2));
  45. // test->countDownLatch->countDown();
  46. // MD5_CTX md5c;
  47. // MD5Init(&md5c); //初始化
  48. // unsigned char decrypt[16] = {0};
  49. // unsigned char decrypt32[32] = {0};
  50. // size_t read_len = strlen(ret_json);
  51. // MD5Update(&md5c, (unsigned char *) ret_json, read_len);
  52. // MD5Final(&md5c, decrypt);
  53. // char temp[8]={0};
  54. // strcpy((char *) decrypt32, "");
  55. // for (int i = 0; i < 16; i++) {
  56. // sprintf(temp, "%02x", decrypt[i]);
  57. // strcat((char *) decrypt32, temp);
  58. // }
  59. // printf("md5:%s\n", decrypt32);
  60. //
  61. // char * dejson = "35070e4651614cced5604e93c4a59ff9";
  62. free(test);
  63. pthread_exit(NULL);
  64. }
  65. /**
  66. * 1、判断比对文件的 MD5 是否相等
  67. * 1.1、如果相等,
  68. * 1.1.1、判断媒体数据 mate 信息是否一致,如果一致,判断前面 N 关键帧的指纹码
  69. * 1.2、如果不等
  70. * 1.2.1、判断媒体数据 mate 信息是否一致, 如果一致,判断前面 N 关键帧的指纹码
  71. * @param argc
  72. * @param argv
  73. * @return
  74. */
  75. int main(int argc, char *argv[]) {
  76. const char *arr = "0000010001001111011101110010011100100011001001110100001101110111";
  77. const char *arr2 = "0000010001001111011101110010011100100011001001110100001101010111";
  78. int threads = 1;
  79. const char *inputs[1];
  80. // inputs[0] = "{\"videoPath\":\"http://rescdn.yishihui.com/longvideo/transcode/video/b46fd76f98364b3abad8c1297a868f82-1526976612340.m3u8\",\"clips\":[{\"startTimeMs\":3000,\"endTimeMs\":4000},{\"startTimeMs\":6000,\"endTimeMs\":7000},{\"startTimeMs\":9000,\"endTimeMs\":10000},{\"startTimeMs\":12000,\"endTimeMs\":13000},{\"startTimeMs\":15000,\"endTimeMs\":16000},{\"startTimeMs\":18000,\"endTimeMs\":19000},{\"startTimeMs\":21000,\"endTimeMs\":22000},{\"startTimeMs\":24000,\"endTimeMs\":25000}]}";
  81. // inputs[0] = "{\"videoPath\":\"http://rescdn.yishihui.com/longvideo/transcode/video/6b2efb8d1c6f4095a90b0b276d4b3a291532088309923.m3u8\",\"clips\":[{\"startTimeMs\":500,\"endTimeMs\":1000},{\"startTimeMs\":1000,\"endTimeMs\":1500},{\"startTimeMs\":1500,\"endTimeMs\":2000},{\"startTimeMs\":2000,\"endTimeMs\":2500},{\"startTimeMs\":2500,\"endTimeMs\":3000},{\"startTimeMs\":3000,\"endTimeMs\":3500},{\"startTimeMs\":3500,\"endTimeMs\":4000},{\"startTimeMs\":4000,\"endTimeMs\":4500}]}";
  82. inputs[0] = "{\"videoPath\":\"http://rescdn.yishihui.com/longvideo/transcode/video/3dbf36e8ec27479581514b8b7b4c8034-1526924772832-safe1594892815.m3u8\",\"clips\":[{\"startTimeMs\":6000,\"endTimeMs\":7000},{\"startTimeMs\":12000,\"endTimeMs\":13000},{\"startTimeMs\":18000,\"endTimeMs\":19000},{\"startTimeMs\":24000,\"endTimeMs\":25000},{\"startTimeMs\":30000,\"endTimeMs\":31000},{\"startTimeMs\":36000,\"endTimeMs\":37000},{\"startTimeMs\":42000,\"endTimeMs\":43000},{\"startTimeMs\":48000,\"endTimeMs\":49000}]}";
  83. // inputs[3] = "{\"videoPath\":\"http://rescdn.yishihui.com/longvideo/transcode/video/3dbf36e8ec27479581514b8b7b4c8034-1526924772832-safe1594892815.m3u8\",\"clips\":[{\"startTimeMs\":6000,\"endTimeMs\":7000},{\"startTimeMs\":12000,\"endTimeMs\":13000},{\"startTimeMs\":18000,\"endTimeMs\":19000},{\"startTimeMs\":24000,\"endTimeMs\":25000},{\"startTimeMs\":30000,\"endTimeMs\":31000},{\"startTimeMs\":36000,\"endTimeMs\":37000},{\"startTimeMs\":42000,\"endTimeMs\":43000},{\"startTimeMs\":48000,\"endTimeMs\":49000}]}";
  84. // for (;;) {
  85. CountDownLatch *countDownLatch = new CountDownLatch(threads);
  86. for (int i = 0; i < threads; ++i) {
  87. Test *test = static_cast<Test *>(malloc(sizeof(Test)));
  88. test->countDownLatch = countDownLatch;
  89. test->input = inputs[i];
  90. pthread_t id;
  91. pthread_create(&id, 0, run, test);
  92. }
  93. countDownLatch->await();
  94. delete countDownLatch;
  95. // }
  96. return 1;
  97. // const char *out_json = "{\n"
  98. // " \"videoPath\": \"\\\"/root/data/xxx.mp4\\\"\",\n"
  99. // " \"clips\": [\n"
  100. // " {\n"
  101. // " \"startTimeMs\": 15000,\n"
  102. // " \"endTimeMs\": 25000,\n"
  103. // " \"fingerprintCode\": [\n"
  104. // " \"\\\"0001000100101010101010\\\"\",\n"
  105. // " \"\\\"0001000100101010101010\\\"\",\n"
  106. // " \"\\\"0001000100101010101010\\\"\",\n"
  107. // " \"\\\"0001000100101010101010\\\"\"\n"
  108. // " ]\n"
  109. // " }\n"
  110. // " ]\n"
  111. // "}";
  112. // auto vs = json2VideoSimilarity(input_json);
  113. // auto json = videoSimilarity2json(vs);
  114. //
  115. // int32_t size = 7;
  116. // const char *filepath[size];
  117. // //票圈视频iOS客户端上传
  118. // filepath[0] = "http://rescdn.yishihui.com/longvideo/video/vpc/20220309/17025689Igao51Q0IMBYw8aNKH";
  119. // //ios 原生上传
  120. // filepath[1] = "http://rescdn.yishihui.com/longvideo/video/vpc/20220309/17025689VvI5KURrrxzlZ0Kcdv";
  121. // //iOS h5上传
  122. // filepath[2] = "http://rescdn.yishihui.com/longvideo/video/vpc/20220309/17025689iBy9WFswYdBNblY9au";
  123. // //票圈视频安卓客户端上传
  124. // filepath[3] = "http://rescdn.yishihui.com/longvideo/video/vpc/20220309/17677590exDXG6q75ELejK7aMY";
  125. // //安卓h5上传
  126. // filepath[4] = "http://rescdn.yishihui.com/longvideo/video/vpc/20220309/176775906GoWtUCYoVZYDbO1XX";
  127. // //安卓原生上传
  128. // filepath[5] = "";
  129. // //PC 上传
  130. //// filepath[5] = "http://rescdn.yishihui.com/longvideo/video/vpc/20220309/17025689nSyGzifJFr4Apl0zc8";
  131. // filepath[5] = "http://rescdn.yishihui.com/longvideo/video/vpc/20220310/701939000F0qpyCLetflI3COz";
  132. // http://rescdn.yishihui.com/longvideo/video/vpc/20220304/17938576TxEh0UJXpzcoYRJuHu
  133. // //本地 local 上传的视频
  134. // filepath[6] = "/Users/devyk/Data/Project/sample/github_code/OpenCVSample/temp/19581045gIiFKepxbbplF3XtsG.mp4";
  135. // run(vs->videoPath,&vs->clips);
  136. // const char * ret = videoSimilarity2json(vs);
  137. // const char *local_url = "/Users/devyk/Data/Project/sample/github_code/OpenCVSample/temp/19581045gIiFKepxbbplF3XtsG.mp4";
  138. // std::vector<VideoSimilarityModel *> local_list;
  139. // run(local_url, &local_list);
  140. //
  141. // std::vector<VideoSimilarityModel *> lists[size];
  142. // int split_count = 10;
  143. //// int total = 3960000;
  144. // int ii = 1000 * 60 * 6;
  145. //
  146. // int start = ii;
  147. // for (int i = 0; i < size; ++i) {
  148. // auto start_time = getCurrentTimeMills();
  149. // start = ii;
  150. // for (int j = 0; j < split_count; ++j) {
  151. // if (j == 0 || j == split_count - 1) {
  152. // continue;
  153. // }
  154. // auto *item = new VideoSimilarityModel();
  155. // item->startTimeMs = start;
  156. // item->endTimeMs = item->startTimeMs + 1000;
  157. // lists[i].push_back(item);
  158. // start += ii;
  159. // }
  160. // LOGE(">>>filepath=%s \n", filepath[i]);
  161. // run(filepath[i], &lists[i]);
  162. // LOGE("<<<filepath=%s cost time=%lld \n", filepath[i], getCurrentTimeMills() - start_time);
  163. // }
  164. //
  165. // //本地 local
  166. // std::vector<VideoSimilarityModel *> local = lists[size - 1];
  167. // //相似 hash 值
  168. // int test_vis[6][8] = {0};
  169. // //所有的 帧
  170. // int test_vis_total[6][8] = {0};
  171. // for (int j = 0; j < size - 1; ++j) {
  172. // for (int g = 0; g < lists[j].size(); ++g) {
  173. // int *cur_sim = list_sim_compare(local[g]->hashs, lists[j][g]->hashs);
  174. // int a = cur_sim[0];
  175. // int b = cur_sim[1];
  176. // test_vis[j][g] = a;
  177. // test_vis_total[j][g] = b;
  178. // }
  179. // }
  180. //
  181. //
  182. // for (int i = 0; i < size - 1; ++i) {
  183. // int a_t = 0, b_t = 0;
  184. // for (int j = 0; j < 8; ++j) {
  185. // a_t += test_vis[i][j];
  186. // b_t += test_vis_total[i][j];
  187. // }
  188. // LOGE("%s %s 相似度 = %f \n", filepath[6], filepath[i], a_t * 1.0 / b_t * 1.0);
  189. // }
  190. // printf("");
  191. LOGE("end \n");
  192. return 0;
  193. }