Skip to content

Repository files navigation

ISAPI 录像机管理工具

海康威视 ISAPI 协议录像管理与下载工具,提供 Web 管理界面,支持录像搜索、多模式下载、实时预览、云台控制等功能。

功能特性

  • 设备管理 — 连接海康威视 NVR/DVR,查看设备信息、通道列表、存储状态
  • 录像搜索 — 按通道和时间段搜索设备上的录像记录
  • 多模式下载
    • ISAPI HTTP 时间段截取(推荐) — 通过 HTTP 接口直接下载指定时间段录像,速度远快于 RTSP,生成单个连续文件。失败时自动回退到 RTSP 方式
    • RTSP 时间段截取 — 使用 FFmpeg 按指定时间段截取 RTSP 回放流,生成单个连续文件(速度接近实时)
    • 文件下载(downloadPath)— 直接下载设备已存储的录像文件,速度快
    • 流式下载(playbackURI)— 通过流式接口分段下载,自动尝试多种下载方式
  • 实时预览 — 生成 RTSP / HTTP-FLV 预览地址,可用 VLC 等播放器观看
  • 云台控制(PTZ) — 支持上下左右、变焦、预置点调用
  • 存储管理 — 查看硬盘状态、容量、剩余空间
  • Web 界面 — 现代化深色主题 UI,无需安装额外前端依赖

下载模式对比

模式速度输出需要 FFmpeg说明
ISAPI HTTP 截取快(HTTP 文件传输速度)单文件可选(非 MP4 时需转封装)推荐,失败自动回退 RTSP
RTSP 截取慢(接近实时)单文件必需兼容性最好
文件下载多文件(按录像片段)不需要需先搜索
流式下载多文件(按录像片段)不需要需先搜索

ISAPI HTTP 截取工作原理

  1. 构建 playbackURI(含精确时间段),POST 到 /ISAPI/ContentMgmt/download
  2. 自动尝试 4 种 URI 变体(tracks/channels/ISAPI 路径 + 尾斜杠变体),兼容不同固件
  3. 下载到临时文件,检查是否为标准 MP4(ftyp 检测)
  4. 非 MP4 时使用 FFmpeg 本地转封装(三级降级策略:纯 copy → 音频 AAC → 无音频)
  5. 失败时自动回退到 FFmpeg RTSP 方式

环境要求

依赖版本说明
Java (JDK)>= 8必需,推荐 Adoptium
Maven>= 3.x可选,无 Maven 时自动下载依赖并编译
FFmpeg任意版本可选,RTSP 截取必需;ISAPI HTTP 截取时非 MP4 转封装需要
Python 3>= 3.6可选,仅运行模拟服务器时需要

快速开始

1. 一键启动

macOS / Linux:

chmod +x start.sh
./start.sh

Windows:

start.bat

启动脚本会自动完成以下操作:

  1. 检查 Java 环境
  2. 检查 FFmpeg(未安装时可选择自动下载到项目目录)
  3. 使用 Maven 构建项目(无 Maven 时自动下载依赖并手动编译)
  4. 启动 Web 服务器

2. 访问管理界面

启动成功后,在浏览器访问:

http://localhost:8080

3. 连接设备

在 Web 界面中填写设备 IP、端口、用户名和密码,点击"连接设备"即可。

项目结构

testISAPI/
├── src/main/java/com/comp/testISAPI/
│ ├── ISAPIWebServer.java # Web 服务器主程序(入口)
│ ├── ISAPIClient.java # ISAPI 协议客户端封装
│ ├── ISAPIQueryRecMain.java # 命令行录像查询/下载工具
│ ├── DigestAuthenticator.java # HTTP Digest 认证实现
│ └── Logger.java # 日志工具(控制台 + 文件)
├── index.html # Web 管理界面
├── pom.xml # Maven 项目配置
├── mock_server.py # ISAPI 模拟服务器(Python)
├── start.sh # macOS/Linux 一键启动脚本
├── start.bat # Windows 一键启动脚本
├── setup-ffmpeg.sh # FFmpeg 安装脚本(macOS/Linux)
├── setup-ffmpeg.bat # FFmpeg 安装脚本(Windows)
├── start_mock.sh # 模拟服务器启动脚本(macOS/Linux)
└── start_mock.bat # 模拟服务器启动脚本(Windows)

使用 Maven 构建

# 编译打包(生成 fat jar)
mvn clean package -DskipTests
# 运行cd target
java -Dfile.encoding=UTF-8 -jar testISAPI-1.0.0.jar

FFmpeg 安装

RTSP 时间段截取功能必需 FFmpeg;ISAPI HTTP 截取在非 MP4 转封装时也会用到 FFmpeg(无 FFmpeg 则跳过转封装直接输出原始文件)。

方式一:运行安装脚本(推荐)

# macOS / Linux
chmod +x setup-ffmpeg.sh
./setup-ffmpeg.sh
# Windows
setup-ffmpeg.bat

脚本会自动下载对应平台的 FFmpeg 到项目 ffmpeg/ 目录。

方式二:使用系统包管理器

# macOS
brew install ffmpeg
# Ubuntu / Debian
sudo apt install ffmpeg
# Windows (Scoop)
scoop install ffmpeg

程序会按以下优先级查找 FFmpeg:系统 PATH → 常见系统路径 → 用户目录 → 项目内置 → 旧目录结构。

API 接口

Web 服务器提供以下 REST 接口:

方法路径说明
GET/Web 管理界面
POST/api/device-info获取设备信息
POST/api/channels获取通道列表
POST/api/search搜索录像
POST/api/download下载录像(文件/流式模式)
POST/api/rtsp-download时间段截取下载(ISAPI HTTP / RTSP)
GET/api/download-status?taskId=xxx查询下载进度
DELETE/api/download-status?taskId=xxx取消运行中任务或删除已完成任务记录
POST/api/rtsp-url获取 RTSP 预览地址
POST/api/storage获取存储状态
POST/api/ptz云台控制
GET/downloads/{filename}下载已保存的录像文件

/api/rtsp-download 参数

参数类型必填说明
deviceIpstring设备 IP
portintHTTP 端口,默认 80
usernamestring用户名
passwordstring密码
channelIdstring通道 ID
startTimestring开始时间(yyyy-MM-dd'T'HH:mm
endTimestring结束时间
rtspPortintRTSP 端口,默认 554
downloadMethodstringisapi-http(推荐)或 rtsp,默认 rtsp
clientTimezoneOffsetMinutesint浏览器时区偏移(分钟)

/api/download-status 响应字段

除常规进度字段外,包含以下诊断字段:

字段说明
requestedMethod用户请求的下载方式(isapi-http / rtsp
effectiveMethod实际使用的下载方式(可能因回退而与请求不同)
fallbackUsed是否发生了自动回退(true / false
timeMode时间模式
timeBasis时间基准来源(device / browser / server
deviceTimeZone设备时区
normalizedStart / normalizedEnd归一化后的搜索时间
attemptedUrls已尝试的 URL 列表
cancelRequested是否收到取消请求

环境变量配置

变量名默认值说明
ISAPI_TIME_MODEDEVICE_LOCAL_LITERAL_Z时间模式,可选 DEVICE_LOCAL_LITERAL_Z / UTC_Z
MAX_DOWNLOAD_RANGE_MINUTES1440最大下载时间范围(分钟)
STREAM_READ_TIMEOUT_SECONDS600流式下载 / ISAPI HTTP 下载读取超时(秒)
FFMPEG_TIMEOUT_SECONDS1800RTSP 截取 FFmpeg 总超时(秒)
FFMPEG_STALL_TIMEOUT_SECONDS30RTSP 截取时 FFmpeg 无输出判定卡死超时(秒)
FFMPEG_GRACEFUL_QUIT_SECONDS10RTSP 截取结束时等待 FFmpeg 优雅退出的时间(秒)
TASK_TTL_MINUTES30已完成/失败/取消任务保留时长(分钟)
MAX_TASK_LOG_LINES500单任务日志最大保留行数
RTSP_PORT_DEFAULT554RTSP 默认端口
METHOD5_ENABLEDtrue是否启用 StreamingProxy 回退下载方法

模拟服务器(开发测试)

项目内置 Python 模拟服务器,可在无真实设备的情况下进行开发调试:

# macOS / Linux
./start_mock.sh
# Windows
start_mock.bat
# 或直接运行
python3 mock_server.py

模拟服务器默认监听 localhost:8000,支持设备信息查询和录像搜索接口。在 Web 界面中将设备 IP 设为 localhost,端口设为 8000 即可连接。

技术栈

  • 后端:Java 8 + com.sun.net.httpserver(内置 HTTP 服务器)
  • HTTP 客户端:OkHttp 4.12.0(含 Digest Authentication)
  • 认证方式:HTTP Digest Authentication(Apache Commons Codec)
  • 前端:原生 HTML/CSS/JavaScript(单文件,无框架依赖)
  • 录像下载:ISAPI ContentMgmt/download(HTTP 快速下载)+ FFmpeg(RTSP 流录制 / 本地转封装)
  • 构建工具:Maven 3.x(maven-shade-plugin 打 fat jar)

日志

日志同时输出到控制台和文件,日志文件按日期存放在 ./log/ 目录,文件名格式为 isapi_yyyy-MM-dd.log

log/isapi_2026-02-09.log
  • 支持 DEBUG、INFO、WARN、ERROR 四个级别,默认 DEBUG。
  • 控制台与文件均使用 UTF-8 编码,跨平台一致。
  • RTSP 截取任务会记录目标时长、尝试的 URL、进度等详细日志,便于排查问题。

注意事项

  • 录像下载保存在 ./recordings/ 目录
  • 建议单次搜索时间段不超过 1 小时,避免返回过多录像片段
  • ISAPI HTTP 截取模式在设备不支持时会自动回退到 RTSP 方式
  • RTSP 截取模式需要设备支持 RTSP 回放功能,且必须安装 FFmpeg
  • 流式下载会自动尝试多种方式(POST+XML、GET+Token、StreamingProxy 等),兼容不同固件版本
  • 搜索录像时会尝试 3 种 XML 命名空间格式,兼容不同设备型号
  • ISAPI HTTP 下载使用 CDATA 包裹 playbackURI,避免 URL 中的 & 破坏 XML
  • 流式下载方法2 使用 GET + query 参数传递 playbackURI(避免 GET 带 body 的兼容问题),方法3 使用 PUT + XML Body

最近更新

  • RTSP 截取:增加目标时长计算与日志输出,便于确认请求时间范围;支持 FFmpeg 卡死超时与优雅退出时间配置(FFMPEG_STALL_TIMEOUT_SECONDSFFMPEG_GRACEFUL_QUIT_SECONDS)。
  • 流式下载:方法2 改为 GET + playbackURI query 参数;方法3 改为 PUT + XML Body;新增 playbackURI 请求窗口派生,兼容按时间段缩窄下载的机型。
  • 环境变量:README 与环境变量表已同步上述 FFmpeg 相关配置及日志说明。

License

MIT License

About

海康威视 ISAPI 录像下载工具 - 支持 ISAPI HTTP 快速截取 / FFmpeg RTSP 时间段截取

Resources

Stars

2 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages