123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106 |
- #include <dlfcn.h>
- #include <iostream>
- #include "test.h"
- #include <unistd.h>
- 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;
- }
|