opción

Importa, indexa, busca, edita y genera contenido de vídeo y audio a partir de archivos, direcciones URL, transmisiones en directo o capturas de pantalla.

...Expandir todo
0
Tiempo actualizado 30 de septiembre de 2026

VideoDB Habilidad

Percepción + memoria + acciones para vídeos, retransmisiones en directo y sesiones de escritorio.

Cuándo utilizarla

Percepción del escritorio

  • Iniciar/detener una sesión de escritorio capturando la pantalla, el micrófono y el audio del sistema
  • Transmitir el contexto en directo y almacenar la memoria de la sesión por episodios
  • Ejecutar alertas y activadores en tiempo real sobre lo que se dice y lo que ocurre en pantalla
  • Generar resúmenes de sesión, una línea temporal con función de búsqueda y enlaces a pruebas reproducibles

Captura y transmisión de vídeo

  • Importar un archivo o una URL y generar un enlace a una transmisión web reproducible
  • Transcodificación/normalización: códec, velocidad de bits, fps, resolución, relación de aspecto

Indexación + búsqueda (marcas de tiempo + pruebas)

  • Crear índices visuales, de voz y por palabras clave
  • Busca y muestra momentos exactos con marcas de tiempo y pruebas reproducibles
  • Crear automáticamente clips a partir de los resultados de la búsqueda

Edición y generación de la línea de tiempo

  • Subtítulos: generar, traducir, incrustar
  • Superposiciones: texto/imagen/marca, subtítulos animados
  • Audio: música de fondo, voz en off, doblaje
  • Composición programática y exportaciones mediante operaciones en la línea de tiempo

Transmisiones en directo (RTSP) + supervisión

  • Conectar RTSP/fuentes en directo
  • Ejecutar el reconocimiento visual y del habla en tiempo real y emitir eventos/alertas para supervisar los flujos de trabajo

Cómo funciona

Entradas habituales

  • Ruta de archivo local, URL pública o URL RTSP
  • Solicitud de captura de escritorio: iniciar / detener / resumir sesión
  • Operaciones deseadas: obtener contexto para la comprensión, especificaciones de transcodificación, especificaciones de indexación, consulta de búsqueda, rangos de clips, ediciones de la línea de tiempo, reglas de alerta

Resultados habituales

  • URL de la transmisión
  • Resultados de búsqueda con marcas de tiempo y enlaces a pruebas
  • Recursos generados: subtítulos, audio, imágenes, clips
  • Cargas útiles de eventos/alertas para transmisiones en directo
  • Resúmenes de sesiones de escritorio y entradas de memoria

Ejecución de código Python

Antes de ejecutar cualquier código de VideoDB, ve al directorio del proyecto y carga las variables de entorno:

from dotenv import load_dotenv
load_dotenv(".env")

import videodb
conn = videodb.connect()

Esto se lee VIDEO_DB_API_KEY desde:

  1. Entorno (si ya está exportado)
  2. El archivo .env del proyecto en el directorio actual

Si falta la clave, videodb.connect() se genera AuthenticationError automáticamente.

NO escribas un archivo de script cuando baste con un comando breve en línea.

Al escribir código Python en línea (python -c "..."), utiliza siempre código con el formato adecuado: emplea puntos y comas para separar las sentencias y mantén la legibilidad. Para cualquier código de más de unas tres sentencias, utiliza en su lugar un heredoc:

python << 'EOF'
from dotenv import load_dotenv
load_dotenv(".env")

import videodb
conn = videodb.connect()
coll = conn.get_collection()
print(f"Videos: {len(coll.get_videos())}")
EOF

Configuración

Cuando el usuario solicite «configurar videodb» o algo similar:

1. Instala el SDK

pip install "videodb[capture]" python-dotenv

Si videodb[capture] falla en Linux, instálalo sin el complemento «capture»:

pip install videodb python-dotenv

2. Configurar la clave de API

El usuario debe establecer VIDEO_DB_API_KEY utilizando cualquiera de estos métodos:

  • Exportar en la terminal (antes de iniciar Claude): export VIDEO_DB_API_KEY=your-key
  • Archivo «.env» del proyecto: Guardar VIDEO_DB_API_KEY=your-key en el .env del proyecto

Consigue una clave API gratuita en la consola.videodb.io (50 subidas gratuitas, sin tarjeta de crédito).

NO leas, escribas ni manejes la clave de la API tú mismo. Deja siempre que sea el usuario quien la configure.

Referencia rápida

Subir archivos multimedia

# URL
video = coll.upload(url="https://example.com/video.mp4")

# YouTube
video = coll.upload(url="https://www.youtube.com/watch?v=VIDEO_ID")

# Local file
video = coll.upload(file_path="/path/to/video.mp4")

Transcripción + subtítulos

# force=True skips the error if the video is already indexed
video.index_spoken_words(force=True)
text = video.get_transcript_text()
stream_url = video.add_subtitle()

Búsqueda dentro de los vídeos

from videodb.exceptions import InvalidRequestError

video.index_spoken_words(force=True)

# search() raises InvalidRequestError when no results are found.
# Always wrap in try/except and treat "No results found" as empty.
try:
    results = video.search("product demo")
    shots = results.get_shots()
    stream_url = results.compile()
except InvalidRequestError as e:
    if "No results found" in str(e):
        shots = []
    else:
        raise

Búsqueda de escenas

import re
from videodb import SearchType, IndexType, SceneExtractionType
from videodb.exceptions import InvalidRequestError

# index_scenes() has no force parameter — it raises an error if a scene
# index already exists. Extract the existing index ID from the error.
try:
    scene_index_id = video.index_scenes(
        extraction_type=SceneExtractionType.shot_based,
        prompt="Describe the visual content in this scene.",
    )
except Exception as e:
    match = re.search(r"id\s+([a-f0-9]+)", str(e))
    if match:
        scene_index_id = match.group(1)
    else:
        raise

# Use score_threshold to filter low-relevance noise (recommended: 0.3+)
try:
    results = video.search(
        query="person writing on a whiteboard",
        search_type=SearchType.semantic,
        index_type=IndexType.scene,
        scene_index_id=scene_index_id,
        score_threshold=0.3,
    )
    shots = results.get_shots()
    stream_url = results.compile()
except InvalidRequestError as e:
    if "No results found" in str(e):
        shots = []
    else:
        raise

Edición de la línea de tiempo

Importante: Comprueba siempre las marcas de tiempo antes de generar una línea de tiempo:

  • start deben ser >= 0 (los valores negativos se aceptan sin aviso, pero producen resultados erróneos)
  • start deben ser < end
  • end deben ser <= video.length
from videodb.timeline import Timeline
from videodb.asset import VideoAsset, TextAsset, TextStyle

timeline = Timeline(conn)
timeline.add_inline(VideoAsset(asset_id=video.id, start=10, end=30))
timeline.add_overlay(0, TextAsset(text="The End", duration=3, style=TextStyle(fontsize=36)))
stream_url = timeline.generate_stream()

Transcodificar vídeo (cambio de resolución o calidad)

from videodb import TranscodeMode, VideoConfig, AudioConfig

# Change resolution, quality, or aspect ratio server-side
job_id = conn.transcode(
    source="https://example.com/video.mp4",
    callback_url="https://example.com/webhook",
    mode=TranscodeMode.economy,
    video_config=VideoConfig(resolution=720, quality=23, aspect_ratio="16:9"),
    audio_config=AudioConfig(mute=False),
)

Reajustar la relación de aspecto (para plataformas sociales)

Advertencia: reframe() es una operación lenta que se realiza en el servidor. En el caso de vídeos largos, puede tardar varios minutos y puede agotarse el tiempo de espera. Prácticas recomendadas:

  • Limítate siempre a un segmento corto utilizando start/end siempre que sea posible
  • Para vídeos completos, utiliza callback_url para el procesamiento asíncrono
  • Recorta primero el vídeo en un Timeline primero y, a continuación, reenmarca el resultado más corto
from videodb import ReframeMode

# Always prefer reframing a short segment:
reframed = video.reframe(start=0, end=60, target="vertical", mode=ReframeMode.smart)

# Async reframe for full-length videos (returns None, result via webhook):
video.reframe(target="vertical", callback_url="https://example.com/webhook")

# Presets: "vertical" (9:16), "square" (1:1), "landscape" (16:9)
reframed = video.reframe(start=0, end=60, target="square")

# Custom dimensions
reframed = video.reframe(start=0, end=60, target={"width": 1280, "height": 720})

Medios generativos

image = coll.generate_image(
    prompt="a sunset over mountains",
    aspect_ratio="16:9",
)

Gestión de errores

from videodb.exceptions import AuthenticationError, InvalidRequestError

try:
    conn = videodb.connect()
except AuthenticationError:
    print("Check your VIDEO_DB_API_KEY")

try:
    video = coll.upload(url="https://example.com/video.mp4")
except InvalidRequestError as e:
    print(f"Upload failed: {e}")

Errores habituales

Escenario Mensaje de error Solución
Indexación de un vídeo ya indexado Spoken word index for video already exists Utiliza video.index_spoken_words(force=True) para omitir si ya está indexado
El índice de la escena ya existe Scene index with id XXXX already exists Extraer la scene_index_id del error con re.search(r"id\s+([a-f0-9]+)", str(e))
La búsqueda no encuentra coincidencias InvalidRequestError: No results found Capturar la excepción y tratarla como resultados vacíos (shots = [])
El reenmarcado agota el tiempo de espera Se bloquea indefinidamente con vídeos largos Utiliza start/end para limitar el segmento, o pasa callback_url para el modo asíncrono
Marcas de tiempo negativas en la línea de tiempo Genera silenciosamente una transmisión interrumpida Valida siempre start >= 0 antes de crear VideoAsset
generate_video() / create_collection() falla Operation not allowed o maximum limit Funciones condicionadas por el plan: informa al usuario sobre los límites del plan

Ejemplos

Mensajes de Canonical

  • «Iniciar la captura del escritorio y avisar cuando aparezca un campo de contraseña».
  • «Graba mi sesión y genera un resumen útil cuando finalice».
  • «Importa este archivo y devuelve un enlace a una transmisión reproducible».
  • «Indexa esta carpeta y busca todas las escenas en las que aparezcan personas; proporciona las marcas de tiempo».
  • «Genera subtítulos, incrústalos y añade música de fondo suave».
  • «Conecta esta URL RTSP y avisa cuando una persona entre en la zona».

Grabación de pantalla (captura de escritorio)

Utiliza ws_listener.py para capturar eventos de WebSocket durante las sesiones de grabación. La captura de escritorio solo es compatible con macOS.

Inicio rápido

  1. Elige el directorio de estado: STATE_DIR="${VIDEODB_EVENTS_DIR:-$HOME/.local/state/videodb}"
  2. Iniciar el listener: VIDEODB_EVENTS_DIR="$STATE_DIR" python scripts/ws_listener.py --clear "$STATE_DIR" &
  3. Obtener el ID de WebSocket: cat "$STATE_DIR/videodb_ws_id"
  4. Ejecutar el código de captura (consulta reference/capture.md para ver el flujo de trabajo completo)
  5. Eventos registrados en: $STATE_DIR/videodb_events.jsonl

Utiliza --clear cada vez que inicies una nueva sesión de captura para que los eventos visuales y las transcripciones obsoletas no se filtren en la nueva sesión.

Consultar eventos

import json
import os
import time
from pathlib import Path

events_dir = Path(os.environ.get("VIDEODB_EVENTS_DIR", Path.home() / ".local" / "state" / "videodb"))
events_file = events_dir / "videodb_events.jsonl"
events = []

if events_file.exists():
    with events_file.open(encoding="utf-8") as handle:
        for line in handle:
            try:
                events.append(json.loads(line))
            except json.JSONDecodeError:
                continue

transcripts = [e["data"]["text"] for e in events if e.get("channel") == "transcript"]
cutoff = time.time() - 300
recent_visual = [
    e for e in events
    if e.get("channel") == "visual_index" and e["unix_ts"] > cutoff
]

Documentación adicional

La documentación de referencia se encuentra en el reference/ directorio contiguo a este archivo SKILL.md. Utiliza la herramienta Glob para localizarlo si es necesario.

  • reference/api-reference.md: referencia completa de la API del SDK de Python de VideoDB
  • reference/search.md: guía detallada sobre la búsqueda de vídeos (por palabras pronunciadas y por escenas)
  • reference/editor.md: edición de la línea de tiempo, recursos y composición
  • reference/streaming.md: transmisión HLS y reproducción instantánea
  • reference/generative.md: generación de contenidos multimedia impulsada por IA (imágenes, vídeo, audio)
  • reference/rtstream.md - Flujo de trabajo de ingesta de transmisiones en directo (RTSP/RTMP)
  • reference/rtstream-reference.md - Métodos del SDK de RTStream y flujos de trabajo de IA
  • reference/capture.md - Flujo de trabajo de captura de escritorio
  • reference/capture-reference.md - SDK de captura y eventos WebSocket
  • reference/use-cases.md - Patrones comunes de procesamiento de vídeo y ejemplos

No utilices ffmpeg, moviepy ni herramientas de codificación locales cuando VideoDB admita la operación. VideoDB gestiona todo lo siguiente del lado del servidor: recorte, combinación de clips, superposición de audio o música, adición de subtítulos, superposiciones de texto o imágenes, transcodificación, cambios de resolución, conversión de relación de aspecto, redimensionamiento según los requisitos de la plataforma, transcripción y generación de contenidos multimedia. Recurre a las herramientas locales únicamente para las operaciones enumeradas en la sección «Limitaciones» del archivo reference/editor.md (transiciones, cambios de velocidad, recorte/zoom, corrección de color, mezcla de volumen).

Cuándo utilizar cada herramienta

Problema VideoDB Solución
La plataforma rechaza la relación de aspecto o la resolución del vídeo video.reframe() o conn.transcode() con VideoConfig
Es necesario cambiar el tamaño del vídeo para Twitter/Instagram/TikTok video.reframe(target="vertical") o target="square"
Es necesario cambiar la resolución (p. ej., de 1080p a 720p) conn.transcode() con VideoConfig(resolution=720)
Necesitas superponer audio o música al vídeo AudioAsset en un Timeline
Necesidad de añadir subtítulos video.add_subtitle() o CaptionAsset
Necesito combinar o recortar clips VideoAsset en un Timeline
Necesitas generar una voz en off, música o efectos de sonido coll.generate_voice(), generate_music(), generate_sound_effect()

Procedencia

El material de referencia para esta habilidad se distribuye localmente en skills/videodb/reference/. Utiliza las copias locales anteriores en lugar de seguir los enlaces a repositorios externos en tiempo de ejecución.

Ver en GitHub
---
name: videodb
description: Ingest, index, search, edit, and generate video and audio content from files, URLs, live streams, or desktop capture.
---

# VideoDB Skill

**Perception + memory + actions for video, live streams, and desktop sessions.**

## When to use

### Desktop Perception
- Start/stop a **desktop session** capturing **screen, mic, and system audio**
- Stream **live context** and store **episodic session memory**
- Run **real-time alerts/triggers** on what's spoken and what's happening on screen
- Produce **session summaries**, a searchable timeline, and **playable evidence links**

### Video ingest + stream
- Ingest a **file or URL** and return a **playable web stream link**
- Transcode/normalize: **codec, bitrate, fps, resolution, aspect ratio**

### Index + search (timestamps + evidence)
- Build **visual**, **spoken**, and **keyword** indexes
- Search and return exact moments with **timestamps** and **playable evidence**
- Auto-create **clips** from search results

### Timeline editing + generation
- Subtitles: **generate**, **translate**, **burn-in**
- Overlays: **text/image/branding**, motion captions
- Audio: **background music**, **voiceover**, **dubbing**
- Programmatic composition and exports via **timeline operations**

### Live streams (RTSP) + monitoring
- Connect **RTSP/live feeds**
- Run **real-time visual and spoken understanding** and emit **events/alerts** for monitoring workflows

## How it works

### Common inputs
- Local **file path**, public **URL**, or **RTSP URL**
- Desktop capture request: **start / stop / summarize session**
- Desired operations: get context for understanding, transcode spec, index spec, search query, clip ranges, timeline edits, alert rules

### Common outputs
- **Stream URL**
- Search results with **timestamps** and **evidence links**
- Generated assets: subtitles, audio, images, clips
- **Event/alert payloads** for live streams
- Desktop **session summaries** and memory entries

### Running Python code

Before running any VideoDB code, change to the project directory and load environment variables:

```python
from dotenv import load_dotenv
load_dotenv(".env")

import videodb
conn = videodb.connect()
```

This reads `VIDEO_DB_API_KEY` from:
1. Environment (if already exported)
2. Project's `.env` file in current directory

If the key is missing, `videodb.connect()` raises `AuthenticationError` automatically.

Do NOT write a script file when a short inline command works.

When writing inline Python (`python -c "..."`), always use properly formatted code — use semicolons to separate statements and keep it readable. For anything longer than ~3 statements, use a heredoc instead:

```bash
python << 'EOF'
from dotenv import load_dotenv
load_dotenv(".env")

import videodb
conn = videodb.connect()
coll = conn.get_collection()
print(f"Videos: {len(coll.get_videos())}")
EOF
```

### Setup

When the user asks to "setup videodb" or similar:

### 1. Install SDK

```bash
pip install "videodb[capture]" python-dotenv
```

If `videodb[capture]` fails on Linux, install without the capture extra:

```bash
pip install videodb python-dotenv
```

### 2. Configure API key

The user must set `VIDEO_DB_API_KEY` using **either** method:

- **Export in terminal** (before starting Claude): `export VIDEO_DB_API_KEY=your-key`
- **Project `.env` file**: Save `VIDEO_DB_API_KEY=your-key` in the project's `.env` file

Get a free API key at [console.videodb.io](https://console.videodb.io) (50 free uploads, no credit card).

**Do NOT** read, write, or handle the API key yourself. Always let the user set it.

### Quick Reference

### Upload media

```python
# URL
video = coll.upload(url="https://example.com/video.mp4")

# YouTube
video = coll.upload(url="https://www.youtube.com/watch?v=VIDEO_ID")

# Local file
video = coll.upload(file_path="/path/to/video.mp4")
```

### Transcript + subtitle

```python
# force=True skips the error if the video is already indexed
video.index_spoken_words(force=True)
text = video.get_transcript_text()
stream_url = video.add_subtitle()
```

### Search inside videos

```python
from videodb.exceptions import InvalidRequestError

video.index_spoken_words(force=True)

# search() raises InvalidRequestError when no results are found.
# Always wrap in try/except and treat "No results found" as empty.
try:
    results = video.search("product demo")
    shots = results.get_shots()
    stream_url = results.compile()
except InvalidRequestError as e:
    if "No results found" in str(e):
        shots = []
    else:
        raise
```

### Scene search

```python
import re
from videodb import SearchType, IndexType, SceneExtractionType
from videodb.exceptions import InvalidRequestError

# index_scenes() has no force parameter — it raises an error if a scene
# index already exists. Extract the existing index ID from the error.
try:
    scene_index_id = video.index_scenes(
        extraction_type=SceneExtractionType.shot_based,
        prompt="Describe the visual content in this scene.",
    )
except Exception as e:
    match = re.search(r"id\s+([a-f0-9]+)", str(e))
    if match:
        scene_index_id = match.group(1)
    else:
        raise

# Use score_threshold to filter low-relevance noise (recommended: 0.3+)
try:
    results = video.search(
        query="person writing on a whiteboard",
        search_type=SearchType.semantic,
        index_type=IndexType.scene,
        scene_index_id=scene_index_id,
        score_threshold=0.3,
    )
    shots = results.get_shots()
    stream_url = results.compile()
except InvalidRequestError as e:
    if "No results found" in str(e):
        shots = []
    else:
        raise
```

### Timeline editing

**Important:** Always validate timestamps before building a timeline:
- `start` must be >= 0 (negative values are silently accepted but produce broken output)
- `start` must be < `end`
- `end` must be <= `video.length`

```python
from videodb.timeline import Timeline
from videodb.asset import VideoAsset, TextAsset, TextStyle

timeline = Timeline(conn)
timeline.add_inline(VideoAsset(asset_id=video.id, start=10, end=30))
timeline.add_overlay(0, TextAsset(text="The End", duration=3, style=TextStyle(fontsize=36)))
stream_url = timeline.generate_stream()
```

### Transcode video (resolution / quality change)

```python
from videodb import TranscodeMode, VideoConfig, AudioConfig

# Change resolution, quality, or aspect ratio server-side
job_id = conn.transcode(
    source="https://example.com/video.mp4",
    callback_url="https://example.com/webhook",
    mode=TranscodeMode.economy,
    video_config=VideoConfig(resolution=720, quality=23, aspect_ratio="16:9"),
    audio_config=AudioConfig(mute=False),
)
```

### Reframe aspect ratio (for social platforms)

**Warning:** `reframe()` is a slow server-side operation. For long videos it can take
several minutes and may time out. Best practices:
- Always limit to a short segment using `start`/`end` when possible
- For full-length videos, use `callback_url` for async processing
- Trim the video on a `Timeline` first, then reframe the shorter result

```python
from videodb import ReframeMode

# Always prefer reframing a short segment:
reframed = video.reframe(start=0, end=60, target="vertical", mode=ReframeMode.smart)

# Async reframe for full-length videos (returns None, result via webhook):
video.reframe(target="vertical", callback_url="https://example.com/webhook")

# Presets: "vertical" (9:16), "square" (1:1), "landscape" (16:9)
reframed = video.reframe(start=0, end=60, target="square")

# Custom dimensions
reframed = video.reframe(start=0, end=60, target={"width": 1280, "height": 720})
```

### Generative media

```python
image = coll.generate_image(
    prompt="a sunset over mountains",
    aspect_ratio="16:9",
)
```

## Error handling

```python
from videodb.exceptions import AuthenticationError, InvalidRequestError

try:
    conn = videodb.connect()
except AuthenticationError:
    print("Check your VIDEO_DB_API_KEY")

try:
    video = coll.upload(url="https://example.com/video.mp4")
except InvalidRequestError as e:
    print(f"Upload failed: {e}")
```

### Common pitfalls

| Scenario | Error message | Solution |
|----------|--------------|----------|
| Indexing an already-indexed video | `Spoken word index for video already exists` | Use `video.index_spoken_words(force=True)` to skip if already indexed |
| Scene index already exists | `Scene index with id XXXX already exists` | Extract the existing `scene_index_id` from the error with `re.search(r"id\s+([a-f0-9]+)", str(e))` |
| Search finds no matches | `InvalidRequestError: No results found` | Catch the exception and treat as empty results (`shots = []`) |
| Reframe times out | Blocks indefinitely on long videos | Use `start`/`end` to limit segment, or pass `callback_url` for async |
| Negative timestamps on Timeline | Silently produces broken stream | Always validate `start >= 0` before creating `VideoAsset` |
| `generate_video()` / `create_collection()` fails | `Operation not allowed` or `maximum limit` | Plan-gated features — inform the user about plan limits |

## Examples

### Canonical prompts
- "Start desktop capture and alert when a password field appears."
- "Record my session and produce an actionable summary when it ends."
- "Ingest this file and return a playable stream link."
- "Index this folder and find every scene with people, return timestamps."
- "Generate subtitles, burn them in, and add light background music."
- "Connect this RTSP URL and alert when a person enters the zone."

### Screen Recording (Desktop Capture)

Use `ws_listener.py` to capture WebSocket events during recording sessions. Desktop capture supports **macOS** only.

#### Quick Start

1. **Choose state dir**: `STATE_DIR="${VIDEODB_EVENTS_DIR:-$HOME/.local/state/videodb}"`
2. **Start listener**: `VIDEODB_EVENTS_DIR="$STATE_DIR" python scripts/ws_listener.py --clear "$STATE_DIR" &`
3. **Get WebSocket ID**: `cat "$STATE_DIR/videodb_ws_id"`
4. **Run capture code** (see reference/capture.md for the full workflow)
5. **Events written to**: `$STATE_DIR/videodb_events.jsonl`

Use `--clear` whenever you start a fresh capture run so stale transcript and visual events do not leak into the new session.

#### Query Events

```python
import json
import os
import time
from pathlib import Path

events_dir = Path(os.environ.get("VIDEODB_EVENTS_DIR", Path.home() / ".local" / "state" / "videodb"))
events_file = events_dir / "videodb_events.jsonl"
events = []

if events_file.exists():
    with events_file.open(encoding="utf-8") as handle:
        for line in handle:
            try:
                events.append(json.loads(line))
            except json.JSONDecodeError:
                continue

transcripts = [e["data"]["text"] for e in events if e.get("channel") == "transcript"]
cutoff = time.time() - 300
recent_visual = [
    e for e in events
    if e.get("channel") == "visual_index" and e["unix_ts"] > cutoff
]
```

## Additional docs

Reference documentation is in the `reference/` directory adjacent to this SKILL.md file. Use the Glob tool to locate it if needed.

- [reference/api-reference.md](reference/api-reference.md) - Complete VideoDB Python SDK API reference
- [reference/search.md](reference/search.md) - In-depth guide to video search (spoken word and scene-based)
- [reference/editor.md](reference/editor.md) - Timeline editing, assets, and composition
- [reference/streaming.md](reference/streaming.md) - HLS streaming and instant playback
- [reference/generative.md](reference/generative.md) - AI-powered media generation (images, video, audio)
- [reference/rtstream.md](reference/rtstream.md) - Live stream ingestion workflow (RTSP/RTMP)
- [reference/rtstream-reference.md](reference/rtstream-reference.md) - RTStream SDK methods and AI pipelines
- [reference/capture.md](reference/capture.md) - Desktop capture workflow
- [reference/capture-reference.md](reference/capture-reference.md) - Capture SDK and WebSocket events
- [reference/use-cases.md](reference/use-cases.md) - Common video processing patterns and examples

**Do not use ffmpeg, moviepy, or local encoding tools** when VideoDB supports the operation. The following are all handled server-side by VideoDB — trimming, combining clips, overlaying audio or music, adding subtitles, text/image overlays, transcoding, resolution changes, aspect-ratio conversion, resizing for platform requirements, transcription, and media generation. Only fall back to local tools for operations listed under Limitations in reference/editor.md (transitions, speed changes, crop/zoom, colour grading, volume mixing).

### When to use what

| Problem | VideoDB solution |
|---------|-----------------|
| Platform rejects video aspect ratio or resolution | `video.reframe()` or `conn.transcode()` with `VideoConfig` |
| Need to resize video for Twitter/Instagram/TikTok | `video.reframe(target="vertical")` or `target="square"` |
| Need to change resolution (e.g. 1080p → 720p) | `conn.transcode()` with `VideoConfig(resolution=720)` |
| Need to overlay audio/music on video | `AudioAsset` on a `Timeline` |
| Need to add subtitles | `video.add_subtitle()` or `CaptionAsset` |
| Need to combine/trim clips | `VideoAsset` on a `Timeline` |
| Need to generate voiceover, music, or SFX | `coll.generate_voice()`, `generate_music()`, `generate_sound_effect()` |

## Provenance

Reference material for this skill is vendored locally under `skills/videodb/reference/`.
Use the local copies above instead of following external repository links at runtime.

Instalar videodb

Descarga y descomprime los archivos de habilidades en tu directorio .claude/skills/.

Descargar ZIP

Clona el repositorio y copia los archivos de la habilidad a tu proyecto.

git clone https://github.com/affaan-m/ECC/tree/main/skills/videodb # Copy SKILL.md to your .claude/skills/ directory

Copiar Copiar
Configuración rápida: Copia la carpeta de la habilidad en .claude/skills/ Claude detectará y utilizará automáticamente la habilidad
Repositorio affaan-m/ECC

Habilidades relacionadas

agentwallet
Tiempo actualizado 7 de julio de 2026
brightdata-cli
Tiempo actualizado 29 de junio de 2026
humanize
Tiempo actualizado 7 de julio de 2026
korean-stock-search
Tiempo actualizado 8 de julio de 2026
OR