From aefe632dc06ade8aea1941ab8aa388851da54802 Mon Sep 17 00:00:00 2001 From: machenghai Date: Mon, 20 Jul 2026 16:40:09 +0800 Subject: [PATCH] =?UTF-8?q?=E9=80=82=E9=85=8DWindows=E5=B9=B3=E5=8F=B0?= =?UTF-8?q?=E9=83=A8=E7=BD=B2?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Analyzer/Core/AlgorithmOnYolo.cpp | 5 +- Analyzer/Core/Config.cpp | 3 +- Analyzer/Core/Config.h | 3 +- Analyzer/Core/Utils/Request.cpp | 57 +++-- Analyzer/main.cpp | 38 +-- CMakeLists.txt | 213 +++++++++++++---- ...50\347\275\262\346\214\207\345\215\227.md" | 226 ++++++++++++++++++ config.json | 23 +- 8 files changed, 469 insertions(+), 99 deletions(-) create mode 100644 "SVA-server-Win\351\203\250\347\275\262\346\214\207\345\215\227.md" diff --git a/Analyzer/Core/AlgorithmOnYolo.cpp b/Analyzer/Core/AlgorithmOnYolo.cpp index 5bcaffc..d0a5d2e 100644 --- a/Analyzer/Core/AlgorithmOnYolo.cpp +++ b/Analyzer/Core/AlgorithmOnYolo.cpp @@ -1,4 +1,4 @@ -#include "AlgorithmOnYolo.h" +#include "AlgorithmOnYolo.h" #include "Config.h" #include "Utils/Log.h" #include "Utils/Common.h" @@ -58,7 +58,8 @@ namespace SVAAnalyzer trt_options.trt_min_subgraph_size = 1; // 日志提示的默认值 // 引擎缓存配置(可选,加速后续推理) - trt_options.trt_engine_cache_path = "/opt/SVA/tmp/trt_cache"; + std::string cachePath = mConfig->trtCachePath.empty() ? "./trt_cache" : mConfig->trtCachePath; + trt_options.trt_engine_cache_path = cachePath.c_str(); trt_options.trt_engine_cache_enable = 1; // 添加TensorRT执行提供者 diff --git a/Analyzer/Core/Config.cpp b/Analyzer/Core/Config.cpp index b170a6a..e9e2305 100644 --- a/Analyzer/Core/Config.cpp +++ b/Analyzer/Core/Config.cpp @@ -1,4 +1,4 @@ -#include "Config.h" +#include "Config.h" #include #include #include @@ -39,6 +39,7 @@ namespace SVAAnalyzer this->uploadDir = root["uploadDir"].asString(); this->modelDir = root["modelDir"].asString(); + this->trtCachePath = root.isMember("trtCachePath") ? root["trtCachePath"].asString() : ""; std::filesystem::path path(uploadDir); try diff --git a/Analyzer/Core/Config.h b/Analyzer/Core/Config.h index 8f9004c..483785c 100644 --- a/Analyzer/Core/Config.h +++ b/Analyzer/Core/Config.h @@ -1,4 +1,4 @@ -#ifndef ANALYZER_CONFIG_H +#ifndef ANALYZER_CONFIG_H #define ANALYZER_CONFIG_H #include @@ -48,6 +48,7 @@ namespace SVAAnalyzer std::string uploadDir{}; std::string modelDir{}; + std::string trtCachePath{}; }; } #endif // ANALYZER_CONFIG_H diff --git a/Analyzer/Core/Utils/Request.cpp b/Analyzer/Core/Utils/Request.cpp index 76e09e2..811ec27 100644 --- a/Analyzer/Core/Utils/Request.cpp +++ b/Analyzer/Core/Utils/Request.cpp @@ -1,11 +1,24 @@ -#include "Request.h" +#include "Request.h" + +#ifdef WIN32 + #include + #include + #pragma comment(lib, "ws2_32.lib") + #pragma comment(lib, "crypt32.lib") + #define CLOSE_SOCKET closesocket +#else + #include + #include + #include + #include + #define CLOSE_SOCKET close +#endif + #include #include -#include -#include -#include -#include -#include +#ifndef WIN32 + #include +#endif #include #include #include @@ -122,7 +135,7 @@ namespace SVAAnalyzer { if (connection.fd >= 0) { - close(connection.fd); + CLOSE_SOCKET(connection.fd); connection.fd = -1; } connection.lastSendMs = 0; @@ -138,7 +151,7 @@ namespace SVAAnalyzer #ifdef MSG_NOSIGNAL flags |= MSG_NOSIGNAL; #endif - ssize_t sent = send(fd, cursor, remaining, flags); + int sent = send(fd, cursor, (int)remaining, flags); if (sent <= 0) { return false; @@ -155,7 +168,7 @@ namespace SVAAnalyzer char buffer[1024]; while (response.find("\r\n\r\n") == std::string::npos) { - ssize_t received = recv(fd, buffer, sizeof(buffer), 0); + int received = recv(fd, buffer, sizeof(buffer), 0); if (received <= 0) { return false; @@ -267,18 +280,24 @@ namespace SVAAnalyzer continue; } - struct timeval timeout; - timeout.tv_sec = 5; - timeout.tv_usec = 0; - setsockopt(fd, SOL_SOCKET, SO_RCVTIMEO, &timeout, sizeof(timeout)); - setsockopt(fd, SOL_SOCKET, SO_SNDTIMEO, &timeout, sizeof(timeout)); + #ifdef WIN32 + DWORD timeoutMs = 5000; + setsockopt(fd, SOL_SOCKET, SO_RCVTIMEO, (const char*)&timeoutMs, sizeof(timeoutMs)); + setsockopt(fd, SOL_SOCKET, SO_SNDTIMEO, (const char*)&timeoutMs, sizeof(timeoutMs)); + #else + struct timeval timeout; + timeout.tv_sec = 5; + timeout.tv_usec = 0; + setsockopt(fd, SOL_SOCKET, SO_RCVTIMEO, &timeout, sizeof(timeout)); + setsockopt(fd, SOL_SOCKET, SO_SNDTIMEO, &timeout, sizeof(timeout)); + #endif if (connect(fd, rp->ai_addr, rp->ai_addrlen) == 0) { break; } - close(fd); + CLOSE_SOCKET(fd); fd = -1; } freeaddrinfo(result); @@ -292,7 +311,7 @@ namespace SVAAnalyzer std::string secKey; if (!buildSecWebSocketKey(secKey)) { - close(fd); + CLOSE_SOCKET(fd); return false; } @@ -309,7 +328,7 @@ namespace SVAAnalyzer if (!sendAll(fd, requestText.data(), requestText.size())) { LOGE("websocket handshake send failed: url=%s", url.c_str()); - close(fd); + CLOSE_SOCKET(fd); return false; } @@ -317,14 +336,14 @@ namespace SVAAnalyzer if (!readHttpUpgradeResponse(fd, response)) { LOGE("websocket handshake receive failed: url=%s", url.c_str()); - close(fd); + CLOSE_SOCKET(fd); return false; } if (!verifyUpgradeResponse(response, buildExpectedAccept(secKey))) { LOGE("websocket handshake verify failed: url=%s, response=%s", url.c_str(), response.c_str()); - close(fd); + CLOSE_SOCKET(fd); return false; } diff --git a/Analyzer/main.cpp b/Analyzer/main.cpp index 5b61ec5..00b5425 100644 --- a/Analyzer/main.cpp +++ b/Analyzer/main.cpp @@ -51,11 +51,14 @@ #include "Core/Server.h" #include "Core/Version.h" #include "Core/Algorithm.h" +#include + using namespace SVAAnalyzer; int main(int argc, char **argv) { #ifdef WIN32 + SetConsoleOutputCP(CP_UTF8); srand(time(NULL)); #endif @@ -70,24 +73,23 @@ int main(int argc, char **argv) } switch (argv[i][1]) { - case 'h': - { - printf("-h 打印参数配置信息并退出\n"); - printf("-f 配置文件 如:-f config.json \n"); - system("pause\n"); - exit(0); - return -1; - } - case 'f': - { - file = argv[i + 1]; - break; - } - default: - { - printf("set parameter error:%s\n", argv[i]); - return -1; - } + case 'h': + { + printf("-h 打印参数配置信息并退出\n"); + printf("-f 配置文件 如:-f config.json \n"); + system("pause\n"); + exit(0); + } + case 'f': + { + file = argv[i + 1]; + break; + } + default: + { + printf("set parameter error:%s\n", argv[i]); + return -1; + } } } diff --git a/CMakeLists.txt b/CMakeLists.txt index 61d05ca..cf5cb52 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -1,64 +1,183 @@ cmake_minimum_required(VERSION 3.16.0) + +#指定vcpkg路径,放在project前面 +if(WIN32) + SET(CMAKE_TOOLCHAIN_FILE "c:/vcpkg/scripts/buildsystems/vcpkg.cmake") + set(VCPKG_TARGET_TRIPLET "x64-windows") +endif() + project(Analyzer) set(CMAKE_CXX_STANDARD 17) -set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++17 -pthread ") +set(CMAKE_CXX_STANDARD_REQUIRED ON) if(NOT CMAKE_BUILD_TYPE) set(CMAKE_BUILD_TYPE Release CACHE STRING "Build type" FORCE) endif() set_property(CACHE CMAKE_BUILD_TYPE PROPERTY STRINGS Debug Release RelWithDebInfo MinSizeRel) -SET(CMAKE_CXX_FLAGS_DEBUG "$ENV{CXXFLAGS} -O0 -Wall -g2 -ggdb") -SET(CMAKE_CXX_FLAGS_RELEASE "$ENV{CXXFLAGS} -O3 -Wall") -set(ARCH_X86_64 "x86_64") -set(ARCH_AARCH64 "aarch64") -message(STATUS "System architecture: ${CMAKE_SYSTEM_PROCESSOR}") +# ============================================ +# Platform-specific configurations +# ============================================ + +if(WIN32) + # --- Windows (MSVC) --- + add_compile_options(/W4 /WX- /utf-8) + add_compile_definitions(_WIN32_WINNT=0x0601) + add_compile_definitions(NOMINMAX) + add_compile_definitions(_CRT_SECURE_NO_WARNINGS) + add_compile_definitions(_USE_MATH_DEFINES) + +elseif(UNIX) + # --- Linux / Unix --- + set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++17 -pthread") + SET(CMAKE_CXX_FLAGS_DEBUG "$ENV{CXXFLAGS} -O0 -Wall -g2 -ggdb") + SET(CMAKE_CXX_FLAGS_RELEASE "$ENV{CXXFLAGS} -O3 -Wall") + + set(ARCH_X86_64 "x86_64") + set(ARCH_AARCH64 "aarch64") + message(STATUS "System architecture: ${CMAKE_SYSTEM_PROCESSOR}") + + add_compile_options(-Wall -Wextra -Wno-unused-parameter) +endif() + +# ============================================ +# Third-party libraries +# ============================================ + +find_package(OpenCV REQUIRED) +include_directories(${OpenCV_INCLUDE_DIRS}) -set(ONNXRUNTIME_ROOT "/usr/local/onnxruntime" CACHE PATH "ONNX Runtime installation root") -option(SVA_ONNXRUNTIME_GPU "Enable ONNX Runtime TensorRT/CUDA execution providers" ON) +# === 修改成你的ONNX Runtime路径 === +if(WIN32) + set(ONNXRUNTIME_ROOT "D:/public/onnxruntime-win-x64-gpu-1.18.0" CACHE PATH "ONNX Runtime root dir") +else() + set(ONNXRUNTIME_ROOT "/usr/local/onnxruntime" CACHE PATH "ONNX Runtime installation root") +endif() + +option(SVA_ONNXRUNTIME_GPU "Enable ONNX Runtime GPU" ON) message(STATUS "ONNX Runtime root: ${ONNXRUNTIME_ROOT}") message(STATUS "SVA_ONNXRUNTIME_GPU: ${SVA_ONNXRUNTIME_GPU}") -# third lib start -include_directories(/usr/local/include) -link_directories(/usr/local/lib) -link_directories(/usr/local/lib64) -include_directories(/usr/include/jsoncpp) #jsoncpp -include_directories(/usr/local/ffmpeg/include) #ffmpeg -link_directories(/usr/local/ffmpeg/lib) #ffmpeg -find_package(OpenCV REQUIRED) #opencv - -include_directories(${ONNXRUNTIME_ROOT}/include) #onnxruntime -link_directories(${ONNXRUNTIME_ROOT}/lib) #onnxruntime - -# third lib end - -set(source - Analyzer/Core/Utils/CalcuIOU.cpp - Analyzer/Core/Utils/Request.cpp - Analyzer/Core/Utils/GeometryUtils.cpp - Analyzer/Core/Algorithm.cpp - Analyzer/Core/AlgorithmOnYolo.cpp - Analyzer/Core/Analyzer.cpp - Analyzer/Core/AvPullStream.cpp - Analyzer/Core/AvPushStream.cpp - Analyzer/Core/BehaviorEvaluator.cpp - Analyzer/Core/Config.cpp - Analyzer/Core/Frame.cpp - Analyzer/Core/GenerateAlarmVideo.cpp - Analyzer/Core/Scheduler.cpp - Analyzer/Core/Server.cpp - Analyzer/Core/TemporalContext.cpp - Analyzer/Core/Worker.cpp - Analyzer/main.cpp) - -add_executable(Analyzer ${source}) +include_directories(${ONNXRUNTIME_ROOT}/include) +link_directories(${ONNXRUNTIME_ROOT}/lib) + +# --- FFmpeg --- +# === 修改成你的 FFmpeg === +if(WIN32) + set(FFMPEG_DIR "D:/public/ffmpeg-6.0" CACHE PATH "FFmpeg root dir") + include_directories(${FFMPEG_DIR}/include) + link_directories(${FFMPEG_DIR}/lib) +else() + include_directories(/usr/local/ffmpeg/include) + link_directories(/usr/local/ffmpeg/lib) +endif() + +# --- libevent --- +if(WIN32) + find_path(LIBEVENT_INCLUDE_DIR event2/event.h) + find_library(LIBEVENT_LIB event) + message(STATUS "LIBEVENT_LIB: ${LIBEVENT_LIB}") +endif() + +# --- jsoncpp --- +if(WIN32) + find_library(JSONCPP_LIBRARY NAMES jsoncpp jsoncpp_lib) + message(STATUS "JSONCPP_LIBRARY: ${JSONCPP_LIBRARY}") +else() + include_directories(/usr/include/jsoncpp) +endif() + +# --- CURL & OpenSSL (Windows uses find_package; Linux uses system paths) --- +if(WIN32) + find_package(CURL REQUIRED) + find_package(OpenSSL REQUIRED) +endif() + +# --- Linux additional include/link paths --- +if(UNIX) + include_directories(/usr/local/include) + link_directories(/usr/local/lib) + link_directories(/usr/local/lib64) +endif() + +# ============================================ +# Source files +# ============================================ + +# ── 收集源文件 +file(GLOB_RECURSE SOURCE_FILES + "Analyzer/*.cpp" + "Analyzer/*.h" + "Analyzer/*/*.cpp" + "Analyzer/*/*.h" + "Analyzer/*/*/*.cpp" + "Analyzer/*/*/*.h" +) + +add_executable(Analyzer ${SOURCE_FILES}) + +# ============================================ +# Windows: 构建后自动拷贝运行时 DLL +# ============================================ +if(WIN32) + set(RUNTIME_DLL_DIRS + "D:/public/ffmpeg-6.0/bin" # FFmpeg + "C:/vcpkg/installed/x64-windows/bin" # vcpkg (OpenCV/CURL/libevent/jsoncpp/OpenSSL) + "D:/public/onnxruntime-win-x64-gpu-1.18.0/lib" # ONNX Runtime + ) + + foreach(dll_dir IN LISTS RUNTIME_DLL_DIRS) + if(IS_DIRECTORY "${dll_dir}") + add_custom_command(TARGET Analyzer POST_BUILD + COMMAND ${CMAKE_COMMAND} -E copy_directory + "${dll_dir}" + "$" + COMMENT "Copying runtime DLLs from ${dll_dir}" + ) + else() + message(WARNING "Runtime DLL directory not found: ${dll_dir}") + endif() + endforeach() +endif() + +# ============================================ +# Compile definitions +# ============================================ + if(SVA_ONNXRUNTIME_GPU) - target_compile_definitions(Analyzer PRIVATE SVA_ONNXRUNTIME_GPU=1) + target_compile_definitions(Analyzer PRIVATE SVA_ONNXRUNTIME_GPU=1) else() - target_compile_definitions(Analyzer PRIVATE SVA_ONNXRUNTIME_GPU=0) + target_compile_definitions(Analyzer PRIVATE SVA_ONNXRUNTIME_GPU=0) +endif() + +# ============================================ +# Link libraries (platform-specific) +# ============================================ + +if(WIN32) + # Windows link libraries + target_link_libraries(Analyzer + ${OpenCV_LIBS} + CURL::libcurl + OpenSSL::Crypto + OpenSSL::SSL + ${JSONCPP_LIBRARY} + ${LIBEVENT_LIB} + avformat avcodec avutil swscale swresample + onnxruntime + ws2_32 + crypt32) + +elseif(UNIX) + # Linux link libraries + target_link_libraries(Analyzer + ${OpenCV_LIBS} + event + curl + crypto + jsoncpp + avformat avcodec avutil swscale swresample + pthread + onnxruntime) endif() -target_link_libraries(Analyzer ${OpenCV_LIBS}) -target_link_libraries(Analyzer event curl crypto jsoncpp avformat avcodec avutil swscale swresample pthread) -target_link_libraries(Analyzer onnxruntime) #onnxruntime diff --git "a/SVA-server-Win\351\203\250\347\275\262\346\214\207\345\215\227.md" "b/SVA-server-Win\351\203\250\347\275\262\346\214\207\345\215\227.md" new file mode 100644 index 0000000..c7d5560 --- /dev/null +++ "b/SVA-server-Win\351\203\250\347\275\262\346\214\207\345\215\227.md" @@ -0,0 +1,226 @@ +# SVA-server Windows 原生部署指南 + +## 1.环境要求 + +| 组件 | 版本 | 说明 | +|------|------|------| +| Visual Studio | 2022 Community | MSVC 19.44 | +| CMake | 3.16+ | 实测 4.0.4 | +| vcpkg | latest | 路径 `c:\vcpkg` | +| FFmpeg | 6.0 | 路径 `D:\public\ffmpeg-6.0` | +| OpenCV | 4.11 | vcpkg 安装 | +| ONNX Runtime | 1.18.0 GPU | 路径 `D:\public\onnxruntime-win-x64-gpu-1.18.0` | +| CUDA | 12.6 SDK | 已安装 | + +## 2.vcpkg 依赖安装 + +```cmd +c:\vcpkg\vcpkg.exe install libevent:x64-windows +c:\vcpkg\vcpkg.exe install jsoncpp:x64-windows +c:\vcpkg\vcpkg.exe install curl:x64-windows +c:\vcpkg\vcpkg.exe install openssl:x64-windows +c:\vcpkg\vcpkg.exe install opencv4[x64-windows] +``` + +## 3.源码适配修改 + +### 3.1. CMakeLists.txt + +**修改前的问题:** + +- 缺少 `_USE_MATH_DEFINES` 导致 `M_PI` 未定义 +- 未链接 OpenSSL,导致 `SHA1` 符号未解析 + +**修改内容:** + +```cmake +cmake_minimum_required(VERSION 3.16.0) + +# vcpkg 工具链 +SET(CMAKE_TOOLCHAIN_FILE "c:/vcpkg/scripts/buildsystems/vcpkg.cmake") +set(VCPKG_TARGET_TRIPLET "x64-windows") + +project(Analyzer) +set(CMAKE_CXX_STANDARD 17) +set(CMAKE_CXX_STANDARD_REQUIRED ON) + +if(MSVC) + add_compile_options(/W4 /WX- /utf-8) + add_compile_definitions(_WIN32_WINNT=0x0601) + add_compile_definitions(NOMINMAX) + add_compile_definitions(_CRT_SECURE_NO_WARNINGS) + add_compile_definitions(_USE_MATH_DEFINES) # 修复 M_PI +endif() + +# 依赖查找 +find_package(OpenCV REQUIRED) +find_package(CURL REQUIRED) +find_package(OpenSSL REQUIRED) + +# FFmpeg 路径使用正斜杠 +set(FFMPEG_DIR "D:/public/ffmpeg-6.0" CACHE PATH "FFmpeg root dir") + +# 链接 OpenSSL +target_link_libraries(Analyzer + ${OpenCV_LIBS} + CURL::libcurl + OpenSSL::Crypto # 新增 + OpenSSL::SSL # 新增 + ${JSONCPP_LIBRARY} + ${LIBEVENT_LIB} + avformat avcodec avutil swscale swresample + onnxruntime) +``` + +### 3.2 Analyzer/Core/Utils/Request.cpp + +**修改前的问题:** + +- 第 19 行 `#include ` 是 Linux 专有头文件 +- 第 138 行 `close(connection.fd)` 使用 Linux 的 `close()`,Windows 需要用 `closesocket()` +- 第 154、171 行 `ssize_t` 类型在 Windows 上未定义 +- 第 283-296 行 `timeout` 变量重定义冲突 + +**修改内容:** + +头文件条件编译: +```cpp +#ifdef WIN32 + #include + #include + #pragma comment(lib, "ws2_32.lib") + #pragma comment(lib, "crypt32.lib") + #define CLOSE_SOCKET closesocket +#else + #include + #include + #include + #include + #define CLOSE_SOCKET close +#endif + +#include +#include +#ifndef WIN32 + #include // 仅 Linux +#endif +``` + +`close()` 替换为 `CLOSE_SOCKET()`: +```cpp +// 第 138 行 +CLOSE_SOCKET(connection.fd); // 原: close(connection.fd) +``` + +`ssize_t` 替换为 `int`: +```cpp +// 第 154 行 +int sent = send(fd, cursor, (int)remaining, flags); // 原: ssize_t sent = send(...) + +// 第 171 行 +int received = recv(fd, buffer, sizeof(buffer), 0); // 原: ssize_t received = recv(...) +``` + +`timeout` 变量重定义修复: +```cpp +// 移除第 283-285 行无条件声明的 struct timeval timeout +// 改为: +#ifdef WIN32 + DWORD timeoutMs = 5000; + setsockopt(fd, SOL_SOCKET, SO_RCVTIMEO, (const char*)&timeoutMs, sizeof(timeoutMs)); + setsockopt(fd, SOL_SOCKET, SO_SNDTIMEO, (const char*)&timeoutMs, sizeof(timeoutMs)); +#else + struct timeval timeout; + timeout.tv_sec = 5; + timeout.tv_usec = 0; + setsockopt(fd, SOL_SOCKET, SO_RCVTIMEO, &timeout, sizeof(timeout)); + setsockopt(fd, SOL_SOCKET, SO_SNDTIMEO, &timeout, sizeof(timeout)); +#endif +``` + +## 4.编译步骤 + +```cmd +cd E:\study\sva\SVA-server +mkdir build && cd build +cmake .. -G "Visual Studio 17 2022" -A x64 +cmake --build . --config Release +``` + +## 5.DLL 依赖处理 + +编译完成后 `build\Release\` 下只有 `Analyzer.exe`,需要复制运行时 DLL: + +```powershell +# FFmpeg DLL +Copy-Item "D:\public\ffmpeg-6.0\bin\*.dll" "build\Release\" -Force + +# vcpkg DLL(OpenCV、libevent、jsoncpp、curl、openssl) +Copy-Item "C:\vcpkg\installed\x64-windows\bin\*.dll" "build\Release\" -Force + +# ONNX Runtime DLL +Copy-Item "D:\public\onnxruntime-win-x64-gpu-1.18.0\lib\*.dll" "build\Release\" -Force +``` + +### 可删除的多余 DLL + +ONNX Runtime GPU 版捆绑了 AWS SDK(用于 S3 加载模型),本项目不需要: + +```powershell +Remove-Item "build\Release\aws-*.dll" +``` + +约节省 23MB。 + +## 6.配置文件 + +创建 `config_win.json`(替代原始 Linux 版本的 `config.json`): + +```json +{ + "code": "node-win", + "name": "Windows-Node", + "describe": "native Windows deployment", + "host": "127.0.0.1", + "adminPort": 9991, + "mediaHttpPort": 9992, + "analyzerPort": 9993, + "mediaRtspPort": 9994, + "mediaSecret": "your_secret", + "uploadDir": "C:/SVA/upload", + "modelDir": "C:/SVA/models", + "saveAlarmType": 1, + "saveAlarmUrl": "http://127.0.0.1:9114/waring/waring/addFromSvaSimple", + "detectEventUrl": "ws://127.0.0.1:9114/websocket/sva/noop" +} +``` + +关键:路径使用正斜杠 `C:/SVA/...`,不要用反斜杠。 + +## 7.运行 + +```cmd +build\Release\Analyzer.exe -f config_win.json +``` + +## 8.已知问题 + +### 日志中文乱码 + +现象:启动后日志中的中文显示为乱码,如 `GPU浼樺厛锛孋PU鍥為€€`。 + +原因:Windows 控制台默认编码为 GBK(CP936),而源码中 `fprintf(stderr, ...)` 输出的是 UTF-8 中文。 + +解决方案(任选其一): +1. 运行前执行 `chcp 65001` 切换控制台到 UTF-8 编码 +2. 在程序入口添加 `SetConsoleOutputCP(CP_UTF8);`(需 `#include `) +3. 不影响功能,可忽略 + +### ONNX Runtime GPU 会话创建失败 + +现象:`failed to create GPU ONNX Runtime session: Load model ... File doesn't exist` + +原因:模型目录中没有对应的 `.onnx` 文件。 + +解决:将模型文件放到 `config_win.json` 中 `modelDir` 指定的目录。 + diff --git a/config.json b/config.json index 6d99c55..53cbeb6 100644 --- a/config.json +++ b/config.json @@ -1,16 +1,17 @@ { - "code": "node-353", - "name": "name", - "describe": "describe", - "host": "10.129.52.114", + "code": "node-win", + "name": "Windows-Node", + "describe": "native Windows deployment", + "host": "192.168.0.29", "adminPort": 9991, - "mediaHttpPort": 9992, + "mediaHttpPort": 8088, "analyzerPort": 9993, - "mediaRtspPort": 9994, - "mediaSecret": "V3522025zlm0aA9ajn7UiOWi", - "uploadDir": "/var/www/SVA-web/upload", - "modelDir": "/opt/SVA/models", + "mediaRtspPort": 8554, + "mediaSecret": "machh03", + "uploadDir": "E:/study/sva/upload", + "modelDir": "E:/study/sva/models", + "trtCachePath": "E:/study/sva/trt_cache", "saveAlarmType": 1, - "saveAlarmUrl": "http://127.0.0.1:9114/waring/waring/addFromSvaSimple", - "detectEventUrl": "ws://127.0.0.1:9114/websocket/sva/noop" + "saveAlarmUrl": "http://192.168.0.29:9114/waring/waring/addFromSvaSimple", + "detectEventUrl": "ws://192.168.0.29:9114/websocket/sva/noop" } -- Gitee