test.cpp 3.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106
  1. #include <dlfcn.h>
  2. #include <iostream>
  3. #include "test.h"
  4. #include <unistd.h>
  5. typedef CompareResult* (*Compare)(const char *, const char *, double);
  6. typedef std::string (*Fingerprints)(const char *);
  7. typedef void (*Free_compare_result)(CompareResult* result);
  8. int main(int argc, char* argv[]) {
  9. // 参数验证
  10. if (argc < 3) {
  11. std::cerr << "用法: " << argv[0]
  12. << " <源音频路径> <目标音频路径> [灵敏度=20, 0~100]"
  13. << "\n(必须提供至少两个音频文件路径)"
  14. << std::endl;
  15. return 1;
  16. }
  17. // 解析参数
  18. const char* source = argv[1];
  19. const char* target = argv[2];
  20. // 启用文件存在性检查
  21. if (access(source, F_OK) != 0 || access(target, F_OK) != 0) {
  22. std::cerr << "错误:输入文件不存在" << std::endl;
  23. return 1;
  24. }
  25. // 灵敏度参数验证
  26. double sensitivity = argc > 3 ? atof(argv[3]) : 20;
  27. if (sensitivity < 0 || sensitivity > 100) {
  28. std::cerr << "错误:灵敏度值必须在0-100范围内" << std::endl;
  29. return 1;
  30. }
  31. // auto ret = fingerprints(source);
  32. // std::cout << ret << std::endl;
  33. // 修改后的库加载提示
  34. void* handle = dlopen("./libsignalcompare.so", RTLD_LAZY);
  35. if (!handle) {
  36. std::cerr << "库加载失败: " << dlerror()
  37. << "\n排查建议:"
  38. << "\n1. 确认库文件存在于项目根目录"
  39. << "\n2. 检查库依赖:ldd libsignalcompare.so"
  40. << "\n3. 设置库路径:export LD_LIBRARY_PATH=."
  41. << std::endl;
  42. return 1;
  43. }
  44. // 加载函数
  45. Fingerprints fingerprints = (Fingerprints)dlsym(handle, "fingerprints");
  46. const char* err1 = dlerror();
  47. if (err1) {
  48. std::cerr << err1 << std::endl;
  49. dlclose(handle);
  50. return 1;
  51. }
  52. auto rfps = fingerprints(source);
  53. std::cout << rfps << std::endl;
  54. // 加载函数
  55. Compare compare = (Compare)dlsym(handle, "compare");
  56. const char* err2 = dlerror();
  57. if (err2) {
  58. std::cerr << err2 << std::endl;
  59. dlclose(handle);
  60. return 1;
  61. }
  62. /* 开始比对 */
  63. auto result = compare(source, target, sensitivity);
  64. // 添加空指针保护
  65. if (!result) {
  66. std::cerr << "Comparison failed! 可能原因:"
  67. << "\n1. 输入文件格式不支持"
  68. << "\n2. 动态库版本不匹配"
  69. << "\n3. 内存分配失败"
  70. << std::endl;
  71. if (handle) dlclose(handle);
  72. return 2;
  73. }
  74. // 输出结果
  75. std::cout << "\n===== 分析结果 ====="
  76. << "\n源文件: " << source
  77. << "\n目标文件: " << target
  78. << "\n最高相似度: " << result->highest_similarity
  79. << "\n平均相似度: " << result->average_similarity << std::endl;
  80. // 输出时间偏移数据
  81. if (!result->full_offsets.empty()) {
  82. std::cout << "\n完整对齐时段:\n";
  83. for (auto& offset : result->full_offsets) {
  84. std::cout << "起始: " << offset[0]
  85. << "s 结束: " << offset[1]
  86. << "s\n";
  87. }
  88. }
  89. delete result;
  90. dlclose(handle);
  91. return 0;
  92. }