Communitygithub.com

VideoDB

Sieh, verstehe und bearbeite Video- und Audioinhalte. Erfasse von lokalen Dateien, URLs, RTSP/Live-Feeds oder Desktop-Aufnahmen; erhalte Echtzeit-Kontext und abspielbare Stream-Links. Durchsuche, transkodiere, editiere und erstelle Alarme für Video- und Audioereignisse.

Was ist VideoDB?

VideoDB ist ein KI-Agenten-Skill, der Wahrnehmung, Speicher und Aktionen für Video-, Live-Stream- und Desktop-Sitzungen vereint. Er ermöglicht die Aufnahme von Desktop-Bildschirm, Mikrofon und Systemaudio, die Indizierung von visuellen, gesprochenen und semantischen Inhalten, die Suche nach genauen Zeitstempeln mit Nachweisen, die Erstellung von Untertiteln, Überlagerungen, Dubbing und Übersetzungen, das Transkodieren und Formatieren von Videos sowie die Echtzeit-Überwachung von Live-Streams mit Alarmen. Der Skill unterstützt die Plattformen Claude Code, Cursor und Codex und wird über ein Python-SDK (`videodb`) gesteuert. Er bietet eine umfassende Schnittstelle für Desktop-Aufnahmen, Video-Upload, Indizierung, Timeline-Editierung und generative Medien (Bild, Audio, Video). Fehlerbehandlung für Authentifizierung, fehlende Suchergebnisse und bereits indizierte Videos ist integriert. Verwendungsbeispiele umfassen das Starten einer Desktop-Aufnahme mit Alarmen, das Durchsuchen von Videos nach Szenen mit Personen, das Hinzufügen von Untertiteln mit Hintergrundmusik und das Anschließen eines RTSP-Streams mit Echtzeit-Alarmen.

Funktioniert mit✓Claude Code~Codex CLI~Cursor
npx skills add https://github.com/affaan-m/ECC/tree/main/skills/videodb

In Ihrer bevorzugten KI fragen

Öffnet einen neuen Chat, in dem dieser Agent-Skill bereits geladen ist.

Dokumentation

VideoDB Skill

Wahrnehmung + Speicher + Aktionen für Video, Live-Streams und Desktop-Sitzungen.

Wann verwenden

Desktop-Wahrnehmung

  • Starte/Stoppe eine Desktop-Sitzung und erfasse Bildschirm, Mikrofon und Systemaudio
  • Streame Live-Kontext und speichere episodisches Sitzungsgedächtnis
  • Führe Echtzeit-Alarme/Trigger basierend auf Gesprochenem und dem Bildschirmgeschehen aus
  • Erstelle Sitzungszusammenfassungen, eine durchsuchbare Zeitleiste und abspielbare Beweislinks

Videoerfassung + Stream

  • Erfasse eine Datei oder URL und gib einen abspielbaren Web-Stream-Link zurück
  • Transkodiere/normalisiere: Codec, Bitrate, fps, Auflösung, Seitenverhältnis

Indizieren + Suchen (Zeitstempel + Nachweise)

  • Erstelle visuelle, gesprochene und Schlüsselwort-Indizes
  • Durchsuche und gib genaue Momente mit Zeitstempeln und abspielbaren Nachweisen zurück
  • Erstelle automatisch Clips aus Suchergebnissen

Timeline-Editierung + Generierung

  • Untertitel: generieren, übersetzen, einbrennen
  • Überlagerungen: Text/Bild/Marken, Bewegungsuntertitel
  • Audio: Hintergrundmusik, Voiceover, Synchronisation
  • Programmgesteuerte Komposition und Exporte über Timeline-Operationen

Live-Streams (RTSP) + Überwachung

  • Verbinde RTSP/Live-Feeds
  • Führe visuelles und gesprochenes Echtzeitverständnis aus und sende Ereignisse/Alarme für Überwachungsworkflows

Wie es funktioniert

Häufige Eingaben

  • Lokaler Dateipfad, öffentliche URL oder RTSP-URL
  • Desktop-Aufnahmeanforderung: Sitzung starten / stoppen / zusammenfassen
  • Gewünschte Operationen: Kontext für Verständnis, Transkodierungsspezifikation, Indizierungsspezifikation, Suchanfrage, Clip-Bereiche, Timeline-Änderungen, Alarmregeln

Häufige Ausgaben

  • Stream-URL
  • Suchergebnisse mit Zeitstempeln und Beweislinks
  • Generierte Assets: Untertitel, Audio, Bilder, Clips
  • Ereignis-/Alarm-Payloads für Live-Streams
  • Sitzungszusammenfassungen und Speichereinträge

Python-Code ausführen

Bevor du VideoDB-Code ausführst, wechsle in das Projektverzeichnis und lade Umgebungsvariablen:

from dotenv import load_dotenv
load_dotenv(".env")

import videodb
conn = videodb.connect()

Dies liest VIDEO_DB_API_KEY aus:

  1. Umgebung (falls bereits exportiert)
  2. .env-Datei des Projekts im aktuellen Verzeichnis

Fehlt der Schlüssel, löst videodb.connect() automatisch AuthenticationError aus.

Schreibe KEINE Skriptdatei, wenn ein kurzer Inline-Befehl ausreicht.

Wenn du Python inline schreibst (python -c "..."), verwende immer korrekt formatierten Code – trenne Anweisungen mit Semikolons und halte es lesbar. Für mehr als ~3 Anweisungen verwende stattdessen einen 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

Einrichtung

Wenn der Benutzer „videodb einrichten“ oder ähnliches sagt:

1. SDK installieren

pip install "videodb[capture]" python-dotenv

Falls videodb[capture] unter Linux fehlschlägt, installiere ohne das Capture-Extra:

pip install videodb python-dotenv

2. API-Schlüssel konfigurieren

Der Benutzer muss VIDEO_DB_API_KEY über eine der folgenden Methoden setzen:

  • Im Terminal exportieren (vor dem Start von Claude): export VIDEO_DB_API_KEY=dein-schluessel
  • Projekt-.env-Datei: Speichere VIDEO_DB_API_KEY=dein-schluessel in der .env-Datei des Projekts

Hole einen kostenlosen API-Schlüssel unter console.videodb.io (50 kostenlose Uploads, keine Kreditkarte erforderlich).

Lese, schreibe oder verarbeite den API-Schlüssel NICHT selbst. Überlasse es immer dem Benutzer, ihn zu setzen.

Kurzreferenz

Medien hochladen

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

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

# Lokale Datei
video = coll.upload(file_path="/pfad/zu/video.mp4")

Transkript + Untertitel

# force=True überspringt den Fehler, wenn das Video bereits indiziert ist
video.index_spoken_words(force=True)
text = video.get_transcript_text()
stream_url = video.add_subtitle()

In Videos suchen

from videodb.exceptions import InvalidRequestError

video.index_spoken_words(force=True)

# search() löst InvalidRequestError aus, wenn keine Ergebnisse gefunden werden.
# Immer in try/except packen und „No results found“ als leer behandeln.
try:
    results = video.search("Produktdemo")
    shots = results.get_shots()
    stream_url = results.compile()
except InvalidRequestError as e:
    if "No results found" in str(e):
        shots = []
    else:
        raise

Szenensuche

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

# index_scenes() hat keinen force-Parameter – es löst einen Fehler aus, wenn ein Szenenindex
# bereits existiert. Extrahiere die vorhandene Index-ID aus dem Fehler.
try:
    scene_index_id = video.index_scenes(
        extraction_type=SceneExtractionType.shot_based,
        prompt="Beschreibe den visuellen Inhalt dieser Szene.",
    )
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

# Verwende score_threshold, um Rauschen mit niedriger Relevanz zu filtern (empfohlen: 0.3+)
try:
    results = video.search(
        query="Person schreibt auf 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-Editierung

Wichtig: Überprüfe immer Zeitstempel, bevor du eine Timeline erstellst:

  • start muss >= 0 sein (negative Werte werden stillschweigend akzeptiert, erzeugen aber defekte Ausgaben)
  • start muss < end sein
  • end muss <= video.length sein
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="Das Ende", duration=3, style=TextStyle(fontsize=36)))
stream_url = timeline.generate_stream()

Video transkodieren (Auflösungs-/Qualitätsänderung)

from videodb import TranscodeMode, VideoConfig, AudioConfig

# Ändere Auflösung, Qualität oder Seitenverhältnis serverseitig
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),
)

Seitenverhältnis anpassen (für soziale Plattformen)

Warnung: reframe() ist eine langsame serverseitige Operation. Bei langen Videos kann dies mehrere Minuten dauern und einen Timeout verursachen. Best Practices:

  • Beschränke die Operation immer auf ein kurzes Segment mit start/end, wenn möglich
  • Verwende bei vollständigen Videos callback_url für die asynchrone Verarbeitung
  • Schneide das Video zuerst auf einer Timeline zu und passe dann das kürzere Ergebnis an
from videodb import ReframeMode

# Bevorzuge immer das Anpassen eines kurzen Segments:
reframed = video.reframe(start=0, end=60, target="vertical", mode=ReframeMode.smart)

# Asynchrones Reframing für vollständige Videos (gibt None zurück, Ergebnis über Webhook):
video.reframe(target="vertical", callback_url="https://example.com/webhook")

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

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

Generative Medien

image = coll.generate_image(
    prompt="Sonnenuntergang über Bergen",
    aspect_ratio="16:9",
)

Fehlerbehandlung

from videodb.exceptions import AuthenticationError, InvalidRequestError

try:
    conn = videodb.connect()
except AuthenticationError:
    print("Überprüfe deinen VIDEO_DB_API_KEY")

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

Häufige Fallstricke

SzenarioFehlermeldungLösung
Indizieren eines bereits indizierten VideosSpoken word index for video already existsVerwende video.index_spoken_words(force=True), um bei bereits indiziertem zu überspringen
Szenenindex existiert bereitsScene index with id XXXX already existsExtrahiere die vorhandene scene_index_id aus dem Fehler mit re.search(r"id\s+([a-f0-9]+)", str(e))
Suche findet keine TrefferInvalidRequestError: No results foundFange die Ausnahme und behandle sie als leere Ergebnisse (shots = [])
Reframing-ZeitüberschreitungBlockiert unbegrenzt bei langen VideosVerwende start/end, um das Segment zu begrenzen, oder übergib callback_url für asynchrone Verarbeitung
Negative Zeitstempel in TimelineErzeugt stillschweigend defekten StreamÜberprüfe immer start >= 0 vor dem Erstellen von VideoAsset
generate_video() / create_collection() schlägt fehlOperation not allowed oder maximum limitFunktionen abhängig vom Tarif – informiere den Benutzer über Tarifgrenzen

Beispiele

Kanonische Eingabeaufforderungen

  • „Starte Desktop-Aufnahme und alarmiere, wenn ein Passwortfeld erscheint.“
  • „Zeichne meine Sitzung auf und erstelle eine umsetzbare Zusammenfassung, wenn sie endet.“
  • „Erfasse diese Datei und gib einen abspielbaren Stream-Link zurück.“
  • „Indiziere diesen Ordner und finde jede Szene mit Personen, gib Zeitstempel zurück.“
  • „Generiere Untertitel, brenne sie ein und füge leichte Hintergrundmusik hinzu.“
  • „Verbinde diese RTSP-URL und alarmiere, wenn eine Person die Zone betritt.“

Bildschirmaufnahme (Desktop-Aufnahme)

Verwende ws_listener.py, um WebSocket-Ereignisse während Aufnahmesitzungen zu erfassen. Desktop-Aufnahme wird nur unter macOS unterstützt.

Schnellstart

  1. Wähle ein Zustandsverzeichnis: STATE_DIR="${VIDEODB_EVENTS_DIR:-$HOME/.local/state/videodb}"
  2. Starte den Listener: VIDEODB_EVENTS_DIR="$STATE_DIR" python scripts/ws_listener.py --clear "$STATE_DIR" &
  3. Hole die WebSocket-ID: cat "$STATE_DIR/videodb_ws_id"
  4. Führe den Aufnahmecode aus (siehe reference/capture.md für den vollständigen Workflow)
  5. Ereignisse werden geschrieben nach: $STATE_DIR/videodb_events.jsonl

Verwende --clear, wenn du eine neue Aufnahme startest, damit veraltete Transkript- und visuelle Ereignisse nicht in die neue Sitzung einfließen.

Ereignisse abfragen

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
]

Zusätzliche Dokumentation

Die Referenzdokumentation befindet sich im Verzeichnis reference/ neben dieser SKILL.md-Datei. Verwende das Glob-Tool, um sie bei Bedarf zu finden.

Verwende keine ffmpeg, moviepy oder lokale Kodierungswerkzeuge, wenn VideoDB die Operation unterstützt. Die folgenden Operationen werden alle serverseitig von VideoDB durchgeführt: Trimmen, Kombinieren von Clips, Überlagern von Audio oder Musik, Hinzufügen von Untertiteln, Text-/Bildüberlagerungen, Transkodierung, Auflösungsänderungen, Seitenverhältniskonvertierung, Größenänderung für Plattformanforderungen, Transkription und Mediengenerierung. Greife nur dann auf lokale Werkzeuge zurück, wenn die Operation unter den Einschränkungen in reference/editor.md aufgeführt ist (Übergänge, Geschwindigkeitsänderungen, Zuschneiden/Zoomen, Farbkorrektur, Lautstärkemischung).

Wann was verwenden

ProblemVideoDB-Lösung
Plattform lehnt Seitenverhältnis oder Auflösung abvideo.reframe() oder conn.transcode() mit VideoConfig
Video für Twitter/Instagram/TikTok zuschneiden müssenvideo.reframe(target="vertical") oder target="square"
Auflösung ändern müssen (z.B. 1080p → 720p)conn.transcode() mit VideoConfig(resolution=720)
Audio/Musik auf Video überlagern müssenAudioAsset auf einer Timeline
Untertitel hinzufügen müssenvideo.add_subtitle() oder CaptionAsset
Clips kombinieren/trimmen müssenVideoAsset auf einer Timeline
Voiceover, Musik oder SFX generieren müssencoll.generate_voice(), generate_music(), generate_sound_effect()

Herkunft

Referenzmaterial für diesen Skill wird lokal unter skills/videodb/reference/ bereitgestellt. Verwende die lokalen Kopien oben anstelle von externen Repository-Links zur Laufzeit.

Individual skills in this repo

This repo contains 20 individual skills — each has its own dedicated page.

accessibility

Design, implement, and audit inclusive digital products using WCAG 2.2 Level AA. Use when building or auditing UI that must meet WCAG 2.2 Level AA, or when reviewing a change for keyboard, contrast, or screen-reader support.

affaan-m/content-engine

Create platform-native content systems for X, LinkedIn, TikTok, YouTube, newsletters, and repurposed multi-platform campaigns. Use when the user wants social posts, threads, scripts, content calendars, or one source asset adapted cleanly across platforms.

affaan-m/ECC

Multi-platform content distribution across X, LinkedIn, Threads, and Bluesky. Adapts content per platform using content-engine patterns. Never posts identical content cross-platform. Use when the user wants to distribute content across social platforms.

affaan-m/fal-ai-media

Unified media generation via fal.ai MCP — image, video, and audio. Covers text-to-image (Nano Banana), text/image-to-video (Seedance, Kling, Veo 3), text-to-speech (CSM-1B), and video-to-audio (ThinkSound). Use when the user wants to generate images, videos, or audio with AI.

affaan-m/manim-video

日本語翻訳:このファイルは manim-video 用の日本語翻訳が必要です

affaan-m/remotion-video-creation

Remotion のベストプラクティス - React で動画を作成する。3D、アニメーション、音声、字幕、チャート、トランジションなどをカバーするドメイン固有の29のルール。

affaan-m/video-editing

AI-assisted video editing workflows for cutting, structuring, and augmenting real footage. Covers the full pipeline from raw capture through FFmpeg, Remotion, ElevenLabs, fal.ai, and final polish in Descript or CapCut. Use when the user wants to edit video, cut footage, create vlogs, or build video content.

agent-architecture-audit

Full-stack diagnostic for agent and LLM applications. Audits the 12-layer agent stack for wrapper regression, memory pollution, tool discipline failures, hidden repair loops, and rendering corruption. Produces severity-ranked findings with code-first fixes. Essential for developers building agent applications, autonomous loops, or any LLM-powered feature. Use when an agent or LLM feature misbehaves and the failing layer is unknown, or before shipping an agent stack.

agent-eval

Head-to-head comparison of coding agents (Claude Code, Aider, Codex, etc.) on custom tasks with pass rate, cost, time, and consistency metrics. Use when choosing between coding agents, or when a change to an agent setup needs measured pass rate, cost, and time rather than an impression.

agent-harness-construction

Design and optimize AI agent action spaces, tool definitions, and observation formatting for higher completion rates. Use when defining or revising an agent

agentic-engineering

Operate as an agentic engineer using eval-first execution, decomposition, and cost-aware model routing. Use when planning or executing engineering work that agents will carry out end to end.

agentic-os

Build persistent multi-agent operating systems on Claude Code. Covers kernel architecture, specialist agents, slash commands, file-based memory, scheduled automation, and state management without external databases. Use when building a persistent multi-agent system on Claude Code with its own memory, commands, and scheduling.

agent-introspection-debugging

Structured self-debugging workflow for AI agent failures using capture, diagnosis, contained recovery, and introspection reports. Use when an agent run fails and you need a reproducible diagnosis instead of a retry.

agent-payment-x402

Add x402 payment execution to AI agents with per-task budgets, spending controls, and non-custodial wallets. Supports Base through agentwallet-sdk and X Layer through OKX Payments / OKX Agent Payments Protocol. Use when an agent must pay for something itself and needs per-task budgets, spending controls, and a non-custodial wallet.

agent-self-evaluation

Use after completing any non-trivial task. The agent self-rates its output on 5 axes — accuracy, completeness, clarity, actionability, conciseness — with concrete evidence per criterion. Produces a structured 1-5 scorecard with specific improvement suggestions.

agent-sort

Build an evidence-backed ECC install plan for a specific repo by sorting skills, commands, rules, hooks, and extras into DAILY vs LIBRARY buckets using parallel repo-aware review passes. Use when ECC should be trimmed to what a project actually needs instead of loading the full bundle.

ai-first-engineering

Engineering operating model for teams where AI agents generate a large share of implementation output. Use when setting team process, review gates, or ownership rules for a codebase largely written by agents.

ai-regression-testing

Regression testing strategies for AI-assisted development. Sandbox-mode API testing without database dependencies, automated bug-check workflows, and patterns to catch AI blind spots where the same model writes and reviews code. Use when adding regression coverage to AI-assisted code, or when the same model both wrote and reviewed a change.

android-clean-architecture

Clean Architecture patterns for Android and Kotlin Multiplatform projects — module structure, dependency rules, UseCases, Repositories, and data layer patterns. Use when structuring modules, layers, or data flow in an Android or KMP project.

angular-developer

Generates Angular code and provides architectural guidance. Trigger when creating projects, components, or services, or for best practices on reactivity (signals, linkedSignal, resource), forms, dependency injection, routing, SSR, accessibility (ARIA), animations, styling (component styles, Tailwind CSS), testing, or CLI tooling.

Verwandte Skills