03 /The platform underneath
A distributed data format that unlocks random access to video frames.
VideoDB built a distributed data format for machine understanding of the visual world. It sits as a logical layer on top of your existing files and spreads the work across as many machines as you give it. Every video primitive in your workflow, from transcoding to search, runs on top.
Transcoding
Distributed, batch and realtime
- MP4, archives, S3
- RTSP, live cameras
- Screens and audio
Transcoded once, in parallel. Addressable by frame.
Frames
Distributed extraction and sampling
Sample at any rate, tile for models, across the whole archive at once.
Annotation
Distributed pipelines, hosted and enterprise models
Any model as an analyzer, with human checks. Built for massive scale.
Files stay in storage. VideoDB builds a logical layer on top.
Episodes, metadata and indexes, persistent and timestamped to the frame. Scoped to a user, an agent or a workspace. Every stage above writes to it. Every stage below reads from it.
Retrieval
Scalable engine, sub-second
- Semantic and metadata queries
- Filters and aggregations
- Frame access in milliseconds
Every result is an evidence stream: people watch it, agents process the frames.
Streaming
Scalable engine, one stream per query
- ws://events/agent-42
- sse://text/answer
- frames://run-0412@30fps
- hls://cdn/stream-x.m3u8
One live stream per query, to a screen, a model or an agent.
Runtime
Agents run on top
- Agent loops
- Tool calls and webhooks
- Harness and observability
Loops, harness and observability already there. Bring your agents or use ours.
04 /Quickstart
Get started immediately.
Get your API key, upload a file, index it, search it, play the evidence.
from videodb import connect conn = connect() # 1. get your API key at console.videodb.io coll = conn.get_collection() video = coll.upload(url="s3://lab/run-0412.mp4") # 2. upload a file u = video.understand(analyzers=[{"type": "vlm", "name": "scene", "config": {"prompt": "What happens, and with what result?"}}]) u.wait_until_complete() idx = video.index(name="scene", source=u.get_analyzer("scene")) # 3. index res = video.semantic_search(query="the gripper drops the bottle", # 4. search index_ids=[idx.index_id], top_k=5) for shot in res.get_shots(): print(shot.start, shot.end, shot.metadata) stream = res.compile() # 5. the evidence, as a playable stream