videodb について
VideoDB Skill は、VideoDB を使って動画、音声、ライブストリーム、デスクトップセッションを処理する方法をエージェントに案内します。検索可能な証拠の抽出やメディア制作を含むワークフローに適しています。
主な機能
- 01デスクトップ、マイク、システム音声のキャプチャ
- 02ファイルや URL の取り込みと再生ストリーム生成
- 03映像、音声、キーワードのインデックス作成
- 04タイムスタンプ検索とクリップ作成
- 05タイムライン、字幕、オーバーレイ、音声の編集
- 06RTSP ストリームの監視とアラート発行
活用シーン
- 01特定のシーンや発話がある箇所を検索
- 02デスクトップセッションを記録し要約と証拠リンクを作成
- 03動画に字幕、ナレーション、BGM を追加
- 04ライブ映像を監視し指定イベントを通知
インストール
コマンドをコピーしてターミナルで実行します。
npx skills add https:/ / github.com/ sickn33/ agentic-awesome-skills --skill videodbインストール後、Claude Code で/videodbを入力して読み込まれたか確認します。
同梱ファイル
SKILL.md と一緒にインストールされる参考資料やスクリプト。
reference/rtstream.mdcapture.mduse-cases.mdsearch.mdstreaming.mdgenerative.mdcapture-reference.mdrtstream-reference.mdeditor.mdapi-reference.mdscripts/ws_listener.py詳細
VideoDB スキル
動画、ライブストリーム、デスクトップセッションのための知覚 + メモリ + アクション。
以下のような場合にこのスキルを使用します:
使用する場面
- ファイル、URL、デスクトップセッション、またはライブストリームから、動画や音声の知覚、インデックス作成、検索、タイムライン編集が必要な場合。
- タスクにタイムスタンプ、検索可能なエビデンス、字幕、クリップ、オーバーレイ、またはリアルタイム監視アラートが含まれる場合。
- 取り込み、理解、検索、メディア操作を組み合わせた1つのワークフローが必要な場合。
1) デスクトップ知覚
- 画面、マイク、システム音声をキャプチャするデスクトップセッションを開始/停止する
- ライブコンテキストをストリーミングし、エピソード的なセッションメモリを保存する
- 話された内容と画面上で起きていることに対してリアルタイムアラート/トリガーを実行する
- セッションサマリー、検索可能なタイムライン、再生可能なエビデンスリンクを生成する
2) 動画の取り込み + ストリーム
- ファイルまたはURLを取り込み、再生可能なWebストリームリンクを返す
- トランスコード/正規化: コーデック、ビットレート、fps、解像度、アスペクト比
3) インデックス + 検索 (タイムスタンプ + エビデンス)
- 視覚、音声、キーワードのインデックスを構築する
- 検索して、タイムスタンプと再生可能なエビデンスとともに正確な瞬間を返す
- 検索結果からクリップを自動作成する
4) タイムライン編集 + 生成
- 字幕: 生成、翻訳、焼き込み
- オーバーレイ: テキスト/画像/ブランディング、モーションキャプション
- 音声: BGM、ナレーション、吹き替え
- タイムライン操作によるプログラム的なコンポジションとエクスポート
5) ライブストリーム (RTSP) + 監視
- RTSP/ライブフィードに接続する
- リアルタイムの視覚および音声理解を実行し、監視ワークフロー向けにイベント/アラートを発行する
一般的な入力
- ローカルのファイルパス、公開URL、またはRTSP URL
- デスクトップキャプチャ要求: セッションの開始 / 停止 / 要約
- 目的の操作: 理解のためのコンテキスト取得、トランスコード仕様、インデックス仕様、検索クエリ、クリップ範囲、タイムライン編集、アラートルール
一般的な出力
- ストリーム URL
- タイムスタンプとエビデンスリンクを含む検索結果
- 生成されたアセット: 字幕、音声、画像、クリップ
- ライブストリーム用のイベント/アラートペイロード
- デスクトップのセッションサマリーとメモリエントリ
標準的なプロンプト (例)
- 「デスクトップキャプチャを開始し、パスワードフィールドが表示されたらアラートを出して。」
- 「私のセッションを記録し、終了時に実行可能なサマリーを生成して。」
- 「このファイルを取り込み、再生可能なストリームリンクを返して。」
- 「このフォルダをインデックス化し、人物がいるすべてのシーンを検索してタイムスタンプを返して。」
- 「字幕を生成して焼き込み、軽いBGMを追加して。」
- 「このRTSP 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
Linux で videodb[capture] が失敗する場合は、capture エクストラなしでインストールします:
pip install videodb python-dotenv
2. API キーの設定
ユーザーはいずれかの方法で VIDEO_DB_API_KEY を設定する必要があります:
- ターミナルでエクスポート (Claude を起動する前に):
export VIDEO_DB_API_KEY=your-key - プロジェクトの
.envファイル: プロジェクトの.envファイルにVIDEO_DB_API_KEY=your-keyを保存する
https://console.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
タイムライン編集
重要: タイムラインを構築する前に、必ずタイムスタンプを検証してください:
startは 0 以上でなければなりません (負の値は通知なく受け入れられますが、壊れた出力を生成します)startはendより小さくなければなりませんendは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 | re.search(r"id\s+([a-f0-9]+)", str(e)) でエラーから既存の scene_index_id を抽出してください |
| 検索で一致するものが見つからない | InvalidRequestError: No results found | 例外をキャッチして空の結果として扱ってください (shots = []) |
| リフレームがタイムアウトする | 長い動画で無期限にブロックされる | start/end を使用してセグメントを限定するか、非同期処理のために callback_url を渡してください |
| Timeline 上の負のタイムスタンプ | 通知なく壊れたストリームを生成する | VideoAsset を作成する前に必ず start >= 0 を検証してください |
generate_video() / create_collection() が失敗する | Operation not allowed または maximum limit | プラン制限された機能 — プランの制限についてユーザーに知らせてください |
追加ドキュメント
リファレンスドキュメントは、この SKILL.md ファイルに隣接する reference/ ディレクトリにあります。必要に応じて 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 - Capture SDK と WebSocket イベント
- reference/use-cases.md - 一般的な動画処理パターンと例
画面録画 (デスクトップキャプチャ)
録画セッション中に WebSocket イベントをキャプチャするには ws_listener.py を使用します。デスクトップキャプチャは macOS のみをサポートします。
クイックスタート
- リスナーを起動:
python scripts/ws_listener.py & - WebSocket ID を取得:
cat /tmp/videodb_ws_id - キャプチャコードを実行 (完全なワークフローについては reference/capture.md を参照)
- イベントの書き込み先:
/tmp/videodb_events.jsonl
イベントのクエリ
import json
events = [json.loads(l) for l in open("/tmp/videodb_events.jsonl")]
# Get all transcripts
transcripts = [e["data"]["text"] for e in events if e.get("channel") == "transcript"]
# Get visual descriptions from last 5 minutes
import time
cutoff = time.time() - 300
recent_visual = [e for e in events
if e.get("channel") == "visual_index" and e["unix_ts"] > cutoff]
ユーティリティスクリプト
- scripts/ws_listener.py - WebSocket イベントリスナー(JSONL にダンプ)
完全なキャプチャワークフローについては、reference/capture.md を参照してください。
VideoDB がその操作をサポートしている場合、ffmpeg、moviepy、またはローカルのエンコードツールを使用しないでください。以下はすべて VideoDB によってサーバー側で処理されます — トリミング、クリップの結合、音声または音楽のオーバーレイ、字幕の追加、テキスト/画像のオーバーレイ、トランスコード、解像度の変更、アスペクト比の変換、プラットフォーム要件に合わせたリサイズ、文字起こし、メディア生成。reference/editor.md の「Limitations」に記載されている操作(トランジション、速度変更、クロップ/ズーム、カラーグレーディング、ボリュームミキシング)に限り、ローカルツールにフォールバックしてください。
どれをいつ使うか
| 問題 | VideoDB の解決策 |
|---|---|
| プラットフォームが動画のアスペクト比や解像度を拒否する | VideoConfig を指定した video.reframe() または conn.transcode() |
| Twitter/Instagram/TikTok 用に動画をリサイズする必要がある | video.reframe(target="vertical") または target="square" |
| 解像度を変更する必要がある(例: 1080p → 720p) | VideoConfig(resolution=720) を指定した conn.transcode() |
| 動画に音声/音楽をオーバーレイする必要がある | Timeline 上の AudioAsset |
| 字幕を追加する必要がある | video.add_subtitle() または CaptionAsset |
| クリップを結合/トリミングする必要がある | Timeline 上の VideoAsset |
| ナレーション、音楽、または SFX を生成する必要がある | coll.generate_voice()、generate_music()、generate_sound_effect() |
リポジトリ
https://github.com/video-db/skills
メンテナンス担当: VideoDB
制限事項
- このスキルは、タスクが上記の範囲に明確に一致する場合にのみ使用してください。
- 出力を、環境固有の検証、テスト、または専門家によるレビューの代替として扱わないでください。
- 必要な入力、権限、安全上の境界、または成功基準が欠けている場合は、作業を停止して確認を求めてください。