- 人工智能
- AI 应用
- 大模型
- 计算机视觉
- 语音
- 本地部署
- 视频处理
【免费下载链接】video-analyzer
Analyze videos using LLMs, Computer Vision and Automatic Speech Recognition
本文以video-analyzer-ui子包为对象,讲清这个为video-analyzer命令行工具配套的轻量 Web 界面:如何安装启动、表单字段如何一一映射为 CLI 参数、上传/分析/结果/清理四条 API 背后的会话机制,以及基于 Server-Sent Events(SSE)的实时输出流是如何实现的。读完你可以独立部署并运行该界面,并能结合源码理解它"上传视频 → 拼装命令 → 流式回显 → 下载 JSON 结果"的完整调用链。
一、video-analyzer-ui 是什么:功能定位与安装
video-analyzer-ui是 video-analyzer 项目的 Web 界面层,按 README 的定义,它的功能包括:
- 简洁直观的交互式分析界面;
- 实时命令输出流式回显(Real-time command output streaming);
- 拖拽式视频上传;
- 结果可视化与下载;
- 会话(Session)管理与清理。
它本身不做任何音视频或模型推理,而是一个薄封装:服务端把浏览器表单参数翻译成video-analyzerCLI 命令,用子进程执行,再把 stdout 逐行推回浏览器。这种"UI 即 CLI 包装器"的架构,让命令行用户和浏览器用户可以共享同一套分析逻辑。
1.1 前置条件
- Python 3.8 或更高(pyproject.toml 中声明
requires-python = ">=3.8";注意主项目 readme 对本地运行视觉模型的完整环境建议 Python 3.11+,实际部署建议从主项目的要求); - 已安装
video-analyzer包; - 已安装 FFmpeg(video-analyzer 的音频处理依赖)。
依赖声明见 requirements.txt:flask>=3.0.0、video-analyzer>=0.1.0、werkzeug>=3.0.0。
1.2 安装方式
按 README 给出的方式是:
pip install video-analyzer-ui如果手头是本项目源码,则进入子目录做可编辑安装(对应 README 的 Development Setup 流程,仅把远程克隆替换为本地目录):
cd video-analyzer-ui python -m venv venv source venv/bin/activate # Windows 下为 venv\Scripts\activate pip install -e .打包时 MANIFEST.in 会把templates与static目录一并打入分发包,保证 Flask 模板和前端静态资源随包分发。
1.3 快速开始
video-analyzer-ui # 浏览器打开 http://localhost:5000video-analyzer-ui这个可执行入口由 pyproject.toml 中的[project.scripts]注册,指向video_analyzer_ui.server:main。服务端启动时会先做一项自检(见下文),确认video-analyzer命令可用后才真正起服务。
二、启动参数与运行模式
README 给出的命令行选项如下,与 server.py 中main()的 argparse 定义对照:
| 选项 | 说明 | 默认值 |
|---|---|---|
--dev | 启用开发模式 | 关闭 |
--host | 绑定地址 | localhost |
--port | 监听端口 | 5000 |
--log-file | 日志文件路径 | 仅输出到控制台 |
两种典型运行模式:
# 开发模式:代码改动自动重载、DEBUG 级日志、开发错误页 video-analyzer-ui --dev # 生产模式:绑定到 0.0.0.0 对外提供服务 video-analyzer-ui --host 0.0.0.0 --port 5000从源码看,两种模式的差异体现在两处(server.py):
- 日志级别:
--dev时logging级别为DEBUG,否则为INFO,日志格式统一为%(asctime)s - %(levelname)s - %(message)s,指定--log-file时落到文件; - Flask 调试开关:
VideoAnalyzerUI.run()将debug=self.dev_mode传给app.run()(server.py 第 255–260 行),即只有--dev才开启自动重载与交互式错误页。
另外两个值得注意的启动行为:
- 前置检查:
main()在起服务前会执行video-analyzer --help(server.py 第 281–288 行),若命令不存在则打印video-analyzer command not found. Please install video-analyzer package.并以退出码 1 终止——这解释了"为什么必须先装主包"; - 临时目录初始化:
VideoAnalyzerUI.__init__会在系统临时目录下创建video-analyzer-ui/uploads与video-analyzer-ui/results两级根目录(server.py 第 25–29 行,Path(tempfile.gettempdir()) / 'video-analyzer-ui'),后续每个会话再在其下按会话 ID 建子目录。
事实核对提示:README 的选项列表中列出了
--config(自定义配置文件路径),但当前 server.py 的 argparse 只实现了--host、--port、--dev、--log-file四项,从源码结构看 README 文档略超前于代码,实际以--help输出为准。
三、核心工作流:上传、配置、分析、看结果
README 的 "How It Works" 描述了四步流程,下面结合前后端源码逐步拆解。
3.1 第一步:上传视频,创建会话
前端(main.js)把文件以FormData字段名videoPOST 到/upload。拖拽区同时做前端格式校验(.mp4/.avi/.mov/.mkv),服务端在/upload路由中做同样的白名单校验(server.py 第 47 行),不合法直接返回 400Invalid file type。
服务端处理逻辑:
- 生成
uuid.uuid4()作为session_id; - 在
uploads/<session_id>/与results/<session_id>/下分别建目录; - 用 werkzeug 的
secure_filename规范化文件名后落盘; - 把
{video_path, results_dir, filename}记入内存字典self.sessions,返回session_id。
后续所有 API 都凭这个session_id定位会话,这就是 README 所说"文件暂存在会话专属目录(session-specific directory)"的实现。
3.2 第二步:配置分析参数,实时命令预览
上传成功后,前端隐藏拖拽区、展示配置表单(index.html)。表单字段如下(括号内为字段名,它会被原样作为 CLI 选项名使用):
| 表单项 | 字段名 | 说明与默认 |
|---|---|---|
| Client 下拉 | client | ollama(本地)或openai_api,默认 ollama |
| Ollama URL 输入框 | ollama-url | 表单默认http://localhost:11434,仅 ollama 模式显示 |
| API Key 输入框 | api-key | 仅 openai_api 模式显示,带*必填标记 |
| API URL 输入框 | api-url | 仅 openai_api 模式显示,带*必填标记 |
| Vision Model 输入框 | model | 占位提示llama3.2-vision |
| Duration 数字框 | duration | 分析时长(秒),min=1 |
| Max Frames 数字框 | max-frames | min=1 |
| Whisper Model 下拉 | whisper-model | tiny / base / small /medium(默认选中)/ large |
| Language 输入框 | language | 留空即自动检测(占位提示 Auto-detect) |
| Device 下拉 | device | cpu(默认)/cuda/mps |
| Analysis Prompt 文本域 | prompt | 想向视频提的问题 |
| Keep Extracted Frames 复选框 | keep-frames | 布尔开关,无值 |
注意表单中*标记的字段(api-key、api-url)对应 README 中"必填字段带 * 标记,可选参数可留空"的说明。选openai_api客户端时这两个字段是必填的——这一点与主项目 config.py 中get_client的校验一致:api_key、api_url缺失会抛ValueError。
表单下方有一个"Command Preview"区域:每次输入变化都会触发 main.js 的updateCommandPreview(),按video-analyzer <video_path> --<字段名> <值>的规则拼出将要执行的命令实时显示,实现 README 所说的"实时命令预览"。其中keep-frames作为无值 flag 处理,与后端拼装规则保持一致。
3.3 第三步:运行分析,SSE 流式回显
点击 Start Analysis 后,前端分两阶段请求(main.js):
- POST
/analyze/<session_id>(带表单数据):服务端拼装命令并暂存到会话,返回Analysis started(此时还没真正执行); - GET
/analyze/<session_id>/stream:前端用new EventSource(...)建立 SSE 长连接,服务端才真正用subprocess.Popen起子进程。
/analyze的命令拼装是理解整个 UI 的关键(server.py):
cmd = ['video-analyzer', session['video_path']] for param, value in request.form.items(): if value: # 只添加有值的参数 if param in ['keep-frames', 'dev']: # 无值 flag cmd.append(f'--{param}') else: cmd.extend([f'--{param}', value]) cmd.extend(['--output', str(results_dir)]) # 强制输出到会话结果目录也就是说,表单字段名直接就是 CLI 选项名:ollama-url→--ollama-url、whisper-model→--whisper-model……这与主项目 cli.py 中 argparse 定义的选项一一对应,包括--client、--ollama-url、--api-key、--api-url、--model、--duration、--max-frames、--whisper-model、--language、--device、--prompt、--keep-frames。这些参数在 CLI 内部通过Config.update_from_args覆盖默认配置(config.py),例如--whisper-model写入audio.whisper_model、--model写入当前客户端的model字段,与 default_config.json 的结构完全对齐。从源码结构看,['keep-frames', 'dev']都被当作无值 flag 处理,但表单里没有dev字段,实际能触发的只有keep-frames。
流式输出端(server.py):
process = subprocess.Popen( session['cmd'], stdout=subprocess.PIPE, stderr=subprocess.STDOUT, # 错误流并入标准流,一并回显 universal_newlines=True, bufsize=1 # 行缓冲,逐行读取 ) for line in process.stdout: line = line.strip() if line: yield f"data: {line}\n\n" # SSE 帧格式响应以text/event-stream返回,并带Cache-Control: no-cache、Connection: keep-alive头。进程结束后按退出码追发一行Analysis completed successfully或Analysis failed with code N。前端收到每一帧就追加到输出<pre>区域并自动滚动到底部;识别到成功/失败标记后关闭EventSource并切换按钮状态——这就是"输出随产生即流式呈现"的完整链路。由于主 CLI 用logging.basicConfig把日志打到 stderr,而 stderr 已并入 stdout,因此你在浏览器里看到的"实时进度"实际上就是video-analyzer的日志输出。
3.4 第四步:查看并下载结果
分析成功后,前端可点 Download Results,请求 GET/results/<session_id>(server.py)。服务端:
- 以
analysis_<原始文件名>.json为下载名,用send_file(..., as_attachment=True)返回analysis.json; - 若会话结果目录里找不到该文件,还会检查默认的
output/analysis.json并尝试rename进会话目录(失败则退化为"读内容 → 写副本 → 删原文件"的补偿逻辑),这是对"CLI 未按要求写目录"的兜底。
该 JSON 的结构由主 CLI 生成(cli.py),包含四部分:metadata(客户端、模型、whisper 模型、抽帧数等)、transcript(转录文本与分段)、frame_analyses(逐帧分析)、video_description(最终视频描述),可对照 docs/sample_analysis.json 查看完整样例。
若勾选了keep-frames,抽出的帧会保留在结果目录中(否则主 CLI 在结束时调用cleanup_files删除frames/与audio.wav,见 cli.py),对应 README 中"View extracted frames (if kept)"的说法。
3.5 会话清理
点击 "New Analysis" 时,前端先 POST/cleanup/<session_id>(main.js),服务端(server.py)会:删除该会话的上传文件与目录、递归删除会话结果目录、顺带清理默认output/目录,最后把会话从内存字典中移除。这对应 README 特性列表中的 "Session management and cleanup"。
四、会话模型与存储布局小结
把散落在源码中的存储信息汇总,便于排障时定位文件:
$TMPDIR/video-analyzer-ui/ ├── uploads/ │ └── <uuid session_id>/ # 上传视频(secure_filename 处理后的文件名) └── results/ └── <uuid session_id>/ # 分析输出,analysis.json 等 └── analysis.json- 会话状态保存在
self.sessions内存字典中(server.py 第 22、63–67 行),不写任何持久化存储; - 从源码结构可以推断:服务端重启后旧
session_id都会返回 404Invalid session,且未被 cleanup 清理过的临时文件需要手动到系统临时目录删除; - UI 以 Flask
app.run()单进程方式启动(server.py 第 255–260 行),self.sessions为进程内共享,适合本地单机使用。
五、适用前提与限制
结合仓库实际内容,使用video-analyzer-ui时需要注意:
- 依赖主包:UI 只负责调度和回显,分析能力全部来自
video-analyzerCLI;启动前的video-analyzer --help自检失败会直接退出(server.py)。使用 OpenAI 兼容 API 时还需要在主包层面配好--api-key/--api-url(经 UI 表单透传),本地 Ollama 场景则需先ollama pull llama3.2-vision并启动ollama serve,这些前置步骤见主项目 readme.md; - 视频格式白名单:仅
.mp4 / .avi / .mov / .mkv(前后端双重校验,index.html 的accept属性与 server.py 第 47 行); - 会话是易失的:内存态会话 + 前端触发式清理,浏览器长时间挂机后若服务端重启,需重新上传;
- 文档与代码的小差异:README 列出的
--config选项在当前 server.py 中尚未实现,实际可选参数以video-analyzer-ui --help为准; - 版本要求:UI 包声明
Python >= 3.8,但完整跑通本地视觉模型 + Whisper 的主包环境建议遵循主项目的 Python 3.11+ 建议。
六、小结
video-analyzer-ui用约 300 行 Flask 代码完成了一次典型的"CLI 包装为 Web 服务"实践:UUID 会话 + 临时目录隔离实现多任务并存,secure_filename+ 扩展名白名单做上传防护,表单字段名直映射 CLI 选项省去参数转换层,"POST 预检 + GET 起流"两段式接口配合 SSE 实现真·实时进度回显,最后以send_file附件下载和前端触发的 cleanup 闭环收尾。对于想把任意命令行分析工具快速界面化、又不想引入前后端分离工程体系的场景,这套"子进程 + 行缓冲 + SSE 帧"的写法(server.py 第 112–157 行)可以直接参考复用。
- 人工智能
- AI 应用
- 大模型
- 计算机视觉
- 语音
- 本地部署
- 视频处理
【免费下载链接】video-analyzer
Analyze videos using LLMs, Computer Vision and Automatic Speech Recognition
相关推荐
Zoom Video SDK Android 集成实战指南:自定义视频会话 UI、事件驱动状态管理与全生命周期实现
Zoom Video SDK Android 集成实战指南:自定义视频会话 UI、事件驱动状态管理与全生命周期实现 导读 本指南基于 knowledge wor
AI 技能AI 插件video-analyzer 使用指南:命令行参数、三阶段配置与本地/云端视觉模型实战
video analyzer 使用指南:命令行参数、三阶段配置与本地/云端视觉模型实战 本文基于官方使用文档 docs/USAGES.md 展开,系统梳理 vi
人工智能AI 应用大模型计算机视觉语音本地部署视频处理video-analyzer-tune 实战指南:用 DSPy MIPROv2 自动优化视频分析提示词
video analyzer tune 实战指南:用 DSPy MIPROv2 自动优化视频分析提示词 video analyzer tune 是 video
人工智能AI 应用大模型计算机视觉语音本地部署视频处理
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考