videodb
affaan-m/ECC
ファイル、URL、ライブストリーム、またはデスクトップキャプチャから、動画や音声コンテンツを取り込み、インデックスを作成し、検索、編集、生成します。
...すべて拡張しますVideoDB スキル
動画、ライブ配信、デスクトップセッションにおける知覚・記憶・アクション。
使用場面
デスクトップの知覚
- デスクトップセッションの開始・停止、画面・マイク・システムオーディオのキャプチャ
- ライブコンテキストを配信し、セッションの記録を保存
- 画面上で話されている内容や発生している事象に基づいて、リアルタイムのアラートやトリガーを実行
- セッションの要約、検索可能なタイムライン、再生可能な証拠リンクを生成
動画の取り込みとストリーミング
- ファイルまたはURLを取り込み、再生可能なWebストリームリンクを返す
- トランスコード/正規化:コーデック、ビットレート、fps、解像度、アスペクト比
インデックス作成+検索(タイムスタンプ+証拠データ)
- 映像、音声、キーワードのインデックスを構築
- タイムスタンプと再生可能な証拠データ付きで、特定の瞬間を検索・返却
- 検索結果からクリップを自動生成
タイムライン編集+生成
- 字幕:生成、翻訳、焼き込み
- オーバーレイ:テキスト/画像/ブランドロゴ、モーションキャプション
- 音声:BGM、ナレーション、吹き替え
- タイムライン操作によるプログラム的な構成とエクスポート
ライブ配信(RTSP)+モニタリング
- RTSP/ライブフィードの接続
- リアルタイムの視覚および音声理解を実行し、ワークフローのモニタリング用にイベントやアラートを発行
仕組み
一般的な入力
- ローカルファイルパス、公開URL、またはRTSP URL
- デスクトップキャプチャのリクエスト:セッションの開始/停止/要約
- 必要な操作:理解のためのコンテキスト取得、トランスコード仕様、インデックス仕様、検索クエリ、クリップ範囲、タイムライン編集、アラートルール
一般的な出力
- ストリームURL
- タイムスタンプと証拠リンク付きの検索結果
- 生成されたアセット:字幕、音声、画像、クリップ
- ライブストリーム用のイベント/アラートペイロード
- デスクトップセッションの概要およびメモリエントリ
Pythonコードの実行
VideoDBコードを実行する前に、プロジェクトディレクトリに移動し、環境変数を読み込んでください:
from dotenv import load_dotenv
load_dotenv(".env")
import videodb
conn = videodb.connect()
これは次のように読み取られます VIDEO_DB_API_KEY 次の場所から読み込みます:
- 環境変数(すでにエクスポートされている場合)
- プロジェクトの
.envファイル(現在のディレクトリ内)
キーが見つからない場合、 videodb.connect() 自動的に AuthenticationError 。
短いインラインコマンドで済む場合は、スクリプトファイルを作成しないでください。
インラインのPythonを記述する際は(python -c "...")を記述する際は、常に適切な形式のコードを使用してください。文の区切りにはセミコロンを使用し、可読性を保ってください。約3文を超える場合は、代わりにヘレドックを使用してください:
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
セットアップ
ユーザーが「videodb をセットアップする」などと要求した場合は:
1. SDKをインストールする
pip install "videodb[capture]" python-dotenv
もし videodb[capture] Linuxで失敗した場合は、captureオプションを除いてインストールしてください:
pip install videodb python-dotenv
2. APIキーの設定
ユーザーは、 VIDEO_DB_API_KEY 以下のいずれかの方法で設定する必要があります:
- ターミナルでのエクスポート(Claudeを起動する前):
export VIDEO_DB_API_KEY=your-key - プロジェクトの
.envファイル:VIDEO_DB_API_KEY=your-keyプロジェクトの.envファイルに保存
コンソール(videodb.io)で無料のAPIキーを取得してください(50回までの無料アップロード、クレジットカード不要)。
APIキーを自分で読み取ったり、書き込んだり、扱ったりしないでください。必ずユーザーに設定させてください。
クイックリファレンス
メディアのアップロード
# 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")
トランスクリプト + 字幕
# 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()
動画内の検索
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
シーン検索
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
タイムライン編集
重要:タイムラインを構築する前に、必ずタイムスタンプを検証してください:
start0以上である必要があります(負の値は警告なしで受け入れられますが、不正な出力が生成されます)start<でなければならないendend<= である必要があります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()
動画のトランスコード(解像度/画質の変更)
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() これはサーバーサイドでの処理に時間がかかる操作です。動画が長い場合、
数分かかることがあり、タイムアウトする可能性があります。推奨事項:
- 可能な限り
start/end可能な限り、短いセグメントに制限してください - フルレングスの動画の場合は、
callback_urlを使用して非同期処理を行ってください - まず
Timelineまず動画をトリミングし、その結果として得られた短い動画を再フレーミングしてください
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})
生成型メディア
image = coll.generate_image(
prompt="a sunset over mountains",
aspect_ratio="16:9",
)
エラー処理
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}")
よくある落とし穴
| シナリオ | エラーメッセージ | 解決策 |
|---|---|---|
| すでにインデックスが作成済みの動画のインデックス作成 | Spoken word index for video already exists |
使用方法 video.index_spoken_words(force=True) すでにインデックスが作成されている場合はスキップする |
| シーンインデックスがすでに存在します | Scene index with id XXXX already exists |
既存の scene_index_id を re.search(r"id\s+([a-f0-9]+)", str(e)) |
| 検索に一致する結果が見つかりません | InvalidRequestError: No results found |
例外をキャッチし、結果が空であるものとして扱う(shots = []) |
| リフレームのタイムアウトが発生しました | 長い動画では無限にブロックされる | start/end を使用してセグメントを制限するか、 callback_url を非同期処理用に渡す |
| タイムライン上の負のタイムスタンプ | 破損したストリームを黙って生成する | 常に検証を行う start >= 0 作成前に VideoAsset |
generate_video() / create_collection() 失敗する |
Operation not allowed 、または maximum limit |
プラン制限のある機能 — ユーザーにプランの制限について通知する |
例
標準的なプロンプト
- 「デスクトップのキャプチャを開始し、パスワード入力欄が表示されたら通知する。」
- 「セッションを録画し、終了時に実用的な要約を生成する。」
- 「このファイルを取り込み、再生可能なストリームのリンクを返す。」
- 「このフォルダをインデックス化し、人物が写っているすべてのシーンを検索して、タイムスタンプを返す。」
- 「字幕を生成し、映像に焼き付け、軽やかなBGMを追加してください。」
- 「このRTSP URLに接続し、人がゾーンに入った際に通知する。」
画面録画(デスクトップキャプチャ)
録画セッション中にWebSocketイベントをキャプチャするには、 ws_listener.py を使用して、録画セッション中のWebSocketイベントをキャプチャします。デスクトップキャプチャはmacOSのみ対応しています。
クイックスタート
- 状態ディレクトリを選択:
STATE_DIR="${VIDEODB_EVENTS_DIR:-$HOME/.local/state/videodb}" - リスナーの開始:
VIDEODB_EVENTS_DIR="$STATE_DIR" python scripts/ws_listener.py --clear "$STATE_DIR" & - WebSocket IDの取得:
cat "$STATE_DIR/videodb_ws_id" - キャプチャコードを実行(ワークフローの詳細については reference/capture.md を参照)
- イベントの書き込み先:
$STATE_DIR/videodb_events.jsonl
新しいキャプチャ実行を開始するたびに --clear を使用してください。これにより、古いトランスクリプトやビジュアルイベントが新しいセッションに持ち込まれるのを防ぎます。
イベントのクエリ
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
]
追加のドキュメント
リファレンスドキュメントは、 reference/ この SKILL.md ファイルの隣接するディレクトリにあります。必要に応じて、Glob ツールを使用してその場所を特定してください。
- reference/api-reference.md - VideoDB Python SDK API リファレンスの完全版
- reference/search.md - 動画検索(音声およびシーンベース)に関する詳細ガイド
- reference/editor.md - タイムライン編集、アセット、およびコンポジション
- reference/streaming.md - HLS ストリーミングとインスタント再生
- reference/generative.md - AIを活用したメディア生成(画像、動画、音声)
- reference/rtstream.md - ライブストリームの取り込みワークフロー(RTSP/RTMP)
- reference/rtstream-reference.md - RTStream SDK のメソッドと AI パイプライン
- reference/capture.md - デスクトップキャプチャのワークフロー
- reference/capture-reference.md - キャプチャ SDK および WebSocket イベント
- reference/use-cases.md - 一般的な動画処理パターンと例
VideoDBで対応している操作については、ffmpeg、moviepy、またはローカルのエンコードツールを使用しないでください。 トリミング、クリップの結合、音声や音楽のオーバーレイ、字幕の追加、テキスト/画像のオーバーレイ、トランスコーディング、解像度の変更、アスペクト比の変換、プラットフォームの要件に合わせたサイズ変更、文字起こし、メディア生成など、これらはすべて VideoDB によってサーバー側で処理されます。 reference/editor.mdの「制限事項」に記載されている操作(トランジション、速度変更、トリミング/ズーム、カラーグレーディング、音量ミキシング)の場合にのみ、ローカルツールにフォールバックしてください。
いつ何をすべきか
| 問題 | VideoDB 解決策 |
|---|---|
| プラットフォームが動画のアスペクト比または解像度を受け付けない | video.reframe() または conn.transcode() 以下の場合に VideoConfig |
| Twitter/Instagram/TikTok用に動画のサイズ変更が必要 | video.reframe(target="vertical") または target="square" |
| 解像度を変更する必要がある(例:1080p → 720p) | conn.transcode() および VideoConfig(resolution=720) |
| 動画に音声や音楽を重ねたい | AudioAsset を Timeline |
| 字幕を追加する必要がある | video.add_subtitle() または CaptionAsset |
| クリップを結合・トリミングしたい | VideoAsset に Timeline |
| ナレーション、音楽、または効果音(SFX)を作成する必要がある | coll.generate_voice(), generate_music(), generate_sound_effect() |
出典
このスキル用の参照資料は、ローカルで以下の場所に配置されています skills/videodb/reference/でローカルに提供されています。
実行時に外部リポジトリへのリンクをたどるのではなく、上記のローカルコピーを使用してください。
---
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.
すべてのファイル
12件のファイルvideodbをインストール
スキルファイルをダウンロードし、.claude/skills/ ディレクトリに解凍してください。
ZIPをダウンロードリポジトリをクローンし、スキルファイルをプロジェクトにコピーしてください。
git clone https://github.com/affaan-m/ECC/tree/main/skills/videodb # Copy SKILL.md to your .claude/skills/ directory
コピー





家
