#include #include #include "test.h" #include typedef CompareResult* (*Compare)(const char *, const char *, double); typedef std::string (*Fingerprints)(const char *); typedef void (*Free_compare_result)(CompareResult* result); int main(int argc, char* argv[]) { // 参数验证 if (argc < 3) { std::cerr << "用法: " << argv[0] << " <源音频路径> <目标音频路径> [灵敏度=20, 0~100]" << "\n(必须提供至少两个音频文件路径)" << std::endl; return 1; } // 解析参数 const char* source = argv[1]; const char* target = argv[2]; // 启用文件存在性检查 if (access(source, F_OK) != 0 || access(target, F_OK) != 0) { std::cerr << "错误:输入文件不存在" << std::endl; return 1; } // 灵敏度参数验证 double sensitivity = argc > 3 ? atof(argv[3]) : 20; if (sensitivity < 0 || sensitivity > 100) { std::cerr << "错误:灵敏度值必须在0-100范围内" << std::endl; return 1; } // auto ret = fingerprints(source); // std::cout << ret << std::endl; // 修改后的库加载提示 void* handle = dlopen("./libsignalcompare.so", RTLD_LAZY); if (!handle) { std::cerr << "库加载失败: " << dlerror() << "\n排查建议:" << "\n1. 确认库文件存在于项目根目录" << "\n2. 检查库依赖:ldd libsignalcompare.so" << "\n3. 设置库路径:export LD_LIBRARY_PATH=." << std::endl; return 1; } // 加载函数 Fingerprints fingerprints = (Fingerprints)dlsym(handle, "fingerprints"); const char* err1 = dlerror(); if (err1) { std::cerr << err1 << std::endl; dlclose(handle); return 1; } auto rfps = fingerprints(source); std::cout << rfps << std::endl; // 加载函数 Compare compare = (Compare)dlsym(handle, "compare"); const char* err2 = dlerror(); if (err2) { std::cerr << err2 << std::endl; dlclose(handle); return 1; } /* 开始比对 */ auto result = compare(source, target, sensitivity); // 添加空指针保护 if (!result) { std::cerr << "Comparison failed! 可能原因:" << "\n1. 输入文件格式不支持" << "\n2. 动态库版本不匹配" << "\n3. 内存分配失败" << std::endl; if (handle) dlclose(handle); return 2; } // 输出结果 std::cout << "\n===== 分析结果 =====" << "\n源文件: " << source << "\n目标文件: " << target << "\n最高相似度: " << result->highest_similarity << "\n平均相似度: " << result->average_similarity << std::endl; // 输出时间偏移数据 if (!result->full_offsets.empty()) { std::cout << "\n完整对齐时段:\n"; for (auto& offset : result->full_offsets) { std::cout << "起始: " << offset[0] << "s 结束: " << offset[1] << "s\n"; } } delete result; dlclose(handle); return 0; }