Arkiv媒体资产管理器 是 AI Skill Hub 本期精选AI工具之一。综合评分 7.8 分,整体质量较高。我们推荐使用将其纳入你的 AI 工具库,帮助提升工作效率。
本地优先的媒体资产管理工具,集成AI语义搜索和专业相机元数据读取功能。支持DaVinci Resolve集成,适合视频编辑、摄影师和内容创作者快速组织和检索海量媒体文件。
Arkiv媒体资产管理器 是一款基于 Python 开发的开源工具,专注于 媒体管理、AI搜索、元数据 等核心功能。作为 GitHub 开源项目,它拥有活跃的社区支持和持续的版本迭代,代码完全透明可审计,支持本地部署以保护数据隐私。无论是个人使用还是集成到企业工作流,都能提供稳定可靠的解决方案。
本地优先的媒体资产管理工具,集成AI语义搜索和专业相机元数据读取功能。支持DaVinci Resolve集成,适合视频编辑、摄影师和内容创作者快速组织和检索海量媒体文件。
Arkiv媒体资产管理器 是一款基于 Python 开发的开源工具,专注于 媒体管理、AI搜索、元数据 等核心功能。作为 GitHub 开源项目,它拥有活跃的社区支持和持续的版本迭代,代码完全透明可审计,支持本地部署以保护数据隐私。无论是个人使用还是集成到企业工作流,都能提供稳定可靠的解决方案。
# 方式一:pip 安装(推荐)
pip install arkiv
# 方式二:虚拟环境安装(推荐生产环境)
python -m venv .venv
source .venv/bin/activate # Windows: .venv\Scripts\activate
pip install arkiv
# 方式三:从源码安装(获取最新功能)
git clone https://github.com/vulture-s/arkiv
cd arkiv
pip install -e .
# 验证安装
python -c "import arkiv; print('安装成功')"
# 命令行使用
arkiv --help
# 基本用法
arkiv input_file -o output_file
# Python 代码中调用
import arkiv
# 示例
result = arkiv.process("input")
print(result)
# arkiv 配置文件示例(config.yml) app: name: "arkiv" debug: false log_level: "INFO" # 运行时指定配置文件 arkiv --config config.yml # 或通过环境变量配置 export ARKIV_API_KEY="your-key" export ARKIV_OUTPUT_DIR="./output"
Open-source AI metadata layer for DIT workflows — Resolve-native, CJK-first.
🌐 English | 繁體中文
arkiv sits between your media drive and DaVinci Resolve: it ingests your footage, attaches AI-generated metadata (transcript, vision tags, atmosphere, energy, edit position), and surfaces clips via semantic search in any language — Chinese, Japanese, or English. The Resolve plugin lets you search, import with clip color, and drop frame markers without leaving the NLE.
Designed for solo DITs and small crews who own their data: local-first, self-hosted, MIT license, no cloud dependency.
---
/api/export/metadata-csv endpoint exports clip metadata (Camera/Lens/ISO/Shutter/Aperture/GPS/CreateDate) ready for Resolve's File → Import Metadata from CSV. Plugin auto-prompts after import.XML, iPhone Keys group, Blackmagic Cam app per-vendor lens tags. Auto-detects exiftool binary on Windows (winget/scoop/chocolatey/Program Files)mhl.py create / verify CLI emits real urn:ASC:MHL:v2.0 with xxh3 / md5 / sha1 / sha256 / c4, directory + structure root hashes, chained ascmhl_chain.xml. Interop-verified with ASC reference impl 1.2 — drop-in for Silverstack / MediaVerify / Hedge / YoYotta workflowsoffload.py --src <SD> --dst <A> --dst <B> does chunked parallel copy + per-file hash verify + 3× retry on mismatch + atomic rename + sidecar-aware (XAVC / ARRI / RED / iPhone Live Photo). Resumable JSON state file — kill mid-copy and pending files pick up exactly where they stopped. Emits per-dst MHL v2camera_report.py writes 20-col DIT-spec CSV (Reel / TC / Camera / Lens / ISO / Shutter / Aperture / WB / FPS / Codec / ...) for Resolve's File → Import Metadata from CSV. Day-summary footer aggregates clip count + runtime by camera / by card| Dependency | macOS (brew) | Linux (apt) | Windows |
|---|---|---|---|
| Python 3.9+ | brew install python | sudo apt install python3 python3-venv | [python.org](https://python.org) |
| FFmpeg 6.0+ | brew install ffmpeg | sudo apt install ffmpeg | [ffmpeg.org](https://ffmpeg.org/download.html) |
| Ollama | brew install ollama | [ollama.com/download](https://ollama.com/download) | [ollama.com/download](https://ollama.com/download) |
DaVinci Resolve Plugin extra (macOS): Resolve requires the official Python 3.10 Framework installer (.pkg) from python.org — Homebrew Python is not recognized. Install path: /Library/Frameworks/Python.framework/Versions/3.10/. Restart Resolve after install; Py3 should appear in Console and scripts load via Workspace > Scripts.
$env:PYTHONUTF8=1; uvicorn server:app --host 0.0.0.0 --port 8501
brew install python ffmpeg ollama
git clone https://github.com/vulture-s/arkiv.git
cd arkiv
python3 -m venv .venv && source .venv/bin/activate
pip install -r requirements.txt
pip install mlx-whisper # Apple Silicon (Metal GPU)
ollama pull bge-m3 && ollama pull qwen3-vl:8b && ollama pull qwen2.5:14b
python health.py
```bash sudo apt install python3 python3-venv ffmpeg git clone https://github.com/vulture-s/arkiv.git cd arkiv python3 -m venv .venv && source .venv/bin/activate pip install -r requirements.txt pip install faster-whisper torch # NVIDIA CUDA GPU
ollama pull bge-m3 && ollama pull qwen3-vl:8b && ollama pull qwen2.5:14b python health.py ```
```powershell
git clone https://github.com/vulture-s/arkiv.git cd arkiv python -m venv .venv .\.venv\Scripts\activate pip install -r requirements.txt pip install faster-whisper torch # NVIDIA CUDA GPU
ollama pull bge-m3; ollama pull qwen3-vl:8b; ollama pull qwen2.5:14b $env:PYTHONUTF8=1; python health.py ```
```bash git clone https://github.com/vulture-s/arkiv.git cd arkiv docker compose up -d
python embed.py
docker exec arkiv-arkiv-1 bash smoke-test.sh --platform docker ```
The test has two phases: Health Check (environment) and API Smoke Test (server endpoints).

```bash
Both options use the same database. You can mix and match — ingest via CLI, then browse in Web UI, or vice versa. Note: Do not run CLI and Web UI ingest at the same time. SQLite does not support concurrent writes — run one at a time.
```bash
python ingest.py --dir ./media --limit 10 # process first 10 files only python ingest.py --dir ./media --skip-vision # skip AI frame descriptions python ingest.py --dir ./media --refresh # re-process already-indexed files
python embed.py --rebuild # drop and rebuild from scratch
Copy .env.example to .env and customize:
| Variable | Default | Description |
|---|---|---|
ARKIV_DB_PATH | ./media.db | SQLite database path |
ARKIV_CHROMA_PATH | ./chroma_db | ChromaDB vector store |
ARKIV_THUMBNAILS_DIR | ./thumbnails | Thumbnail output dir |
ARKIV_OLLAMA_URL | http://localhost:11434 | Ollama API endpoint |
ARKIV_EMBED_MODEL | bge-m3 | Embedding model — **do not change after indexing** (see note below) |
ARKIV_VISION_MODEL | qwen3-vl:8b | Vision model for frame descriptions |
ARKIV_CHAT_MODEL | qwen2.5:14b | Chat model — answers and (by default) intent classification |
ARKIV_INTENT_MODEL | *(= ARKIV_CHAT_MODEL)* | Optional faster model for intent classification only; must be installed |
ARKIV_WHISPER_MODEL | mlx-community/whisper-large-v3-turbo (macOS) / large-v3-turbo (other) | Whisper model |
ARKIV_CUSTOM_VOCABULARY | *(empty)* | Comma-separated hotwords (names/jargon) fed to Whisper's initial_prompt |
ARKIV_VOCABULARY_FILE | *(empty → .arkiv/vocabulary.txt if present)* | Newline-delimited hotword file (one term/line, # comments); merged with the above |
ARKIV_EXIFTOOL_PATH | *(empty — auto-detect)* | Path to exiftool binary (optional) |
ARKIV_FFMPEG_PATH | *(empty — auto-detect)* | Path to ffmpeg binary (optional; set on headless Windows where only a WinGet alias shim is on PATH) |
ARKIV_FFPROBE_PATH | *(empty — auto-detect)* | Path to ffprobe binary (optional; same as above) |
ARKIV_HOST | 0.0.0.0 | Server bind address |
ARKIV_PORT | 8501 | Server port |
Embedding model is locked to your index. The vector store is built with one embedding model (bge-m3, 1024-dim). ChangingARKIV_EMBED_MODELafter you have indexed media makes new query vectors incompatible with stored ones — search results degrade silently. To switch models, re-index from scratch. Hardware floor for chat:qwen2.5:14bneeds ~9 GB and runs alongside the embedding model. Plan for ~12–16 GB free RAM/VRAM on the Ollama host. On tighter machines, setARKIV_CHAT_MODEL=qwen2.5:7b(~4.7 GB) for a lighter default.
All /api/* endpoints require a Bearer token with the correct scope. Scope-based tokens let you split a fleet by machine role: read-only review stations can use videos_read or media_read, ingest machines can use ingest_write, and admin machines can manage tokens.
First-time bootstrap:
export ARKIV_ADMIN_BOOTSTRAP_TOKEN=$(openssl rand -base64 32)
python server.py
On first startup, the server seeds a single admin token from that env var. Use it once to create per-machine tokens, then unset it and revoke the bootstrap token.
Create and manage tokens directly with the CLI:
python arkiv_token.py create --name "PC-dev" --scopes videos_read,videos_write --ip-allowlist 127.0.0.1/32,100.64.0.0/10 --expires-in 90
python arkiv_token.py list
python arkiv_token.py show <token-id>
python arkiv_token.py revoke <token-id>
Use the token in requests:
curl -H "Authorization: Bearer <token>" http://localhost:8501/api/media
Available scopes: videos_read, videos_write, media_read, collections_read, collections_write, projects_read, projects_write, ingest_write, chat_read, chat_write, admin
Ask natural-language questions about your archive. The classifier routes each prompt to one of five handlers:
| Intent | Example | What it does |
|---|---|---|
compilation | "Give me all sunset shots from May" | Semantic search → ranked scene list |
refinement | "Only the indoor ones" | Filters the *previous* result, in-conversation |
similarity | "Similar to scene 42" | Vector nearest-neighbours to a reference clip |
analytics | "How many hours did I shoot this month?" | Aggregate query over the library |
general | "What can you help me with?" | Plain LLM chat, no search |
Conversation history (last 10 messages) is threaded into each follow-up, so refinement acts on what the previous turn returned.
Model requirement: chat uses ARKIV_CHAT_MODEL (default qwen2.5:14b) for both intent classification and answers — a single ollama pull qwen2.5:14b covers it. Only set ARKIV_INTENT_MODEL to a smaller model (e.g. qwen2.5:7b-instruct) if that model is actually installed on the Ollama host. If the model is missing, /api/chat returns a clear "run ollama pull …" message instead of a 500.
Prerequisite — ingest + index first: chat queries your indexed library, not a standalone chatbot. Ingest media (Step 1) and build the index with python embed.py (Step 2) before chatting. compilation / refinement / similarity need the vector index; analytics needs ingested media only; general is the only intent that works on an empty library. On an empty/unindexed library chat does not error — it just returns "0 results".
```bash
Q: Which Whisper backend should I use? - macOS with Apple Silicon: mlx-whisper (fastest, uses Metal GPU) - NVIDIA GPU: faster-whisper + torch (CUDA acceleration) - CPU only: faster-whisper (slower but works everywhere)
Q: Do I need Ollama running? Yes, for semantic search (embedding) and optional frame descriptions. Run ollama serve before starting arkiv.
Q: How do I add media? Use the + button in the Media Pool sidebar, or run python ingest.py --dir /path/to/media from CLI.
Q: Can I use this without Docker? Yes — the native Python install is the primary workflow. Docker is optional for deployment.
Q: What file formats are supported? Video: .mp4, .mov, .mkv, .avi, .webm, .m4v, .mts 360: .insv (Insta360), .360 (GoPro Max) — indexed as raw fisheye Audio: .wav, .mp3, .m4a, .aac, .flac, .ogg Camera metadata (make/model/lens/timecode) is read from embedded EXIF and Sony XAVC NRT sidecar XML — so FX30/FX-series footage keeps its identity.
���新的本地媒体管理方案,AI语义搜索和专业元数据支持是亮点。架构清晰,FastAPI+ChromaDB组合成熟可靠,但社区规模小,文档完整度待提升。
AI Skill Hub 为第三方内容聚合平台,本页面信息基于公开数据整理,不对工具功能和质量作任何法律背书。
建议在沙箱或测试环境中充分验证后,再部署至生产环境,并做好必要的安全评估。
✅ MIT 协议 — 最宽松的开源协议之一,可自由商用、修改、分发,仅需保留版权声明。
经综合评估,Arkiv媒体资产管理器 在AI工具赛道中表现稳健,质量良好。如果你已有明确的使用需求,可以直接上手体验;如果还在评估阶段,建议对比同类工具后再做决策。
| 原始名称 | arkiv |
| Topics | 媒体管理AI搜索元数据视频编辑本地优先 |
| GitHub | https://github.com/vulture-s/arkiv |
| License | MIT |
| 语言 | Python |
收录时间:2026-06-13 · 更新时间:2026-06-13 · License:MIT · AI Skill Hub 不对第三方内容的准确性作法律背书。