mcpField
V
videodb

videodb

github.com/sickn33クリエイティブ・メディア48.7k52 回インストール今日更新
リポジトリ

videodb について

VideoDB Skill は、VideoDB を使って動画、音声、ライブストリーム、デスクトップセッションを処理する方法をエージェントに案内します。検索可能な証拠の抽出やメディア制作を含むワークフローに適しています。

主な機能

  1. 01デスクトップ、マイク、システム音声のキャプチャ
  2. 02ファイルや URL の取り込みと再生ストリーム生成
  3. 03映像、音声、キーワードのインデックス作成
  4. 04タイムスタンプ検索とクリップ作成
  5. 05タイムライン、字幕、オーバーレイ、音声の編集
  6. 06RTSP ストリームの監視とアラート発行

活用シーン

  1. 01特定のシーンや発話がある箇所を検索
  2. 02デスクトップセッションを記録し要約と証拠リンクを作成
  3. 03動画に字幕、ナレーション、BGM を追加
  4. 04ライブ映像を監視し指定イベントを通知

インストール

コマンドをコピーしてターミナルで実行します。

$npx skills add https://github.com/sickn33/agentic-awesome-skills --skill videodb

インストール後、Claude Code で/videodbを入力して読み込まれたか確認します。

同梱ファイル

SKILL.md と一緒にインストールされる参考資料やスクリプト。

reference/
rtstream.md
capture.md
use-cases.md
search.md
streaming.md
generative.md
capture-reference.md
rtstream-reference.md
editor.md
api-reference.md
scripts/
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 を以下から読み取ります:

  1. 環境 (すでにエクスポートされている場合)
  2. カレントディレクトリにあるプロジェクトの .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 existsre.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 ツールを使用して場所を特定してください。

画面録画 (デスクトップキャプチャ)

録画セッション中に WebSocket イベントをキャプチャするには ws_listener.py を使用します。デスクトップキャプチャは macOS のみをサポートします。

クイックスタート
  1. リスナーを起動: python scripts/ws_listener.py &
  2. WebSocket ID を取得: cat /tmp/videodb_ws_id
  3. キャプチャコードを実行 (完全なワークフローについては reference/capture.md を参照)
  4. イベントの書き込み先: /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]
ユーティリティスクリプト

完全なキャプチャワークフローについては、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

制限事項

  • このスキルは、タスクが上記の範囲に明確に一致する場合にのみ使用してください。
  • 出力を、環境固有の検証、テスト、または専門家によるレビューの代替として扱わないでください。
  • 必要な入力、権限、安全上の境界、または成功基準が欠けている場合は、作業を停止して確認を求めてください。

コメント