videodb
ローカルファイル・URL・RTSP/ライブストリーム・デスクトップ録画から映像・音声を取得し、再生可能なストリームリンクやリアルタイムコンテキストを返すスキル。フレーム抽出やビジュアル/セマンティック/タイムラインインデックスの構築、タイムスタンプ付きクリップ検索のほか、コーデック・フレームレート・解像度のトランスコードや字幕・テキスト/画像オーバーレイ・吹き替え・翻訳などのタイムライン編集も実行できる。画像・音声・動画などのメディアアセット生成や、ライブストリーム・デスクトップキャプチャに対するリアルタイムアラート作成にも対応する。
description の原文を見る
视频与音频的查看、理解与行动。查看:从本地文件、URL、RTSP/直播源或实时录制桌面获取内容;返回实时上下文和可播放流链接。理解:提取帧,构建视觉/语义/时间索引,并通过时间戳和自动剪辑搜索片段。行动:转码和标准化(编解码器、帧率、分辨率、宽高比),执行时间线编辑(字幕、文本/图像叠加、品牌化、音频叠加、配音、翻译),生成媒体资源(图像、音频、视频),并为直播流或桌面捕获的事件创建实时警报。
SKILL.md 本文
VideoDB スキル
ビデオ、ライブストリーム、デスクトップセッション向けの知覚 + 記憶 + アクション。
ユースケース
デスクトップ知覚
- デスクトップセッションを開始/停止し、画面、マイク、システムオーディオをキャプチャ
- リアルタイムコンテキストをストリーミングし、セグメント化されたセッション記憶を保存
- 話された内容と画面上で起きていることに対してリアルタイムアラート/トリガーを実行
- セッション要約、検索可能なタイムライン、再生可能な証拠リンクを生成
ビデオ取り込み + ストリーミング
- ファイルまたはURLを取り込み、再生可能なウェブストリームリンクを返す
- トランスコード/正規化:コーデック、ビットレート、フレームレート、解像度、アスペクト比
インデックス + 検索(タイムスタンプ + 証拠)
- ビジュアル、音声、キーワードインデックスを構築
- タイムスタンプと再生可能な証拠を持つ正確な瞬間を検索して返す
- 検索結果から自動的にクリップを作成
タイムライン編集 + 生成
- 字幕:生成、翻訳、焼き込み
- オーバーレイ:テキスト/画像/ブランド、ダイナミック字幕
- オーディオ:背景音楽、ナレーション、音声合成
- タイムライン操作を通じたプログラマティックな合成とエクスポート
ライブストリーム(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 ステートメント以上のものについては、代わりに 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
セットアップ
ユーザーが「videodb をセットアップ」または同様のリクエストをしたとき:
1. SDK のインストール
pip install "videodb[capture]" python-dotenv
Linux で videodb[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を保存
無料で API キーを取得するには、console.videodb.io にアクセスしてください(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 | 計画の制限 — ユーザーに計画制限について通知 |
例
規範的なプロンプト
- 「デスクトップキャプチャを開始し、パスワードフィールドが表示されたときにアラートを発行します。」
- 「自分のセッションを記録し、終了時にアクション可能な要約を生成します。」
- 「このファイルを取り込み、再生可能なストリームリンクを返します。」
- 「このフォルダのインデックスを作成し、人物がいるシーンをすべて見つけ、タイムスタンプを返します。」
- 「字幕を生成し、焼き込んで、軽い背景音楽を追加します。」
- 「この RTSP URL に接続し、誰かが領域に入ったときにアラートを発行します。」
スクリーン記録(デスクトップキャプチャ)
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
]
追加ドキュメント
参考ドキュメントは、この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- 一般的なビデオ処理パターンと例
VideoDB がその操作をサポートしている場合は、ffmpeg、moviepy、またはローカルエンコーディングツールを使用しないでください。 以下のすべての操作は VideoDB によってサーバー側で処理されます。トリミング、クリップの結合、オーディオまたは音楽のミキシング、字幕の追加、テキスト/画像オーバーレイ、トランスコード、解像度変更、アスペクト比変換、プラットフォーム要件のためのリサイズ、トランスクリプション、メディア生成。reference/editor.md の「制限」セクションに記載されている操作(トランジション、速度変更、クロップ/スケーリング、カラーグレーディング、ボリュームミキシング)の場合のみ、ローカルツールにフォールバックしてください。
何をいつ使用するか
| 問題 | 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 を使用 |
| ナレーション、音楽、または効果音を生成する必要がある | coll.generate_voice()、generate_music()、generate_sound_effect() を使用 |
出典
このスキルの参考資料は、skills/videodb/reference/ の下でローカルに提供されています。
実行時に外部リポジトリリンクを追従する代わりに、上記のローカルコピーを使用してください。
メンテナー: VideoDB
ライセンス: MIT(寛容ライセンスのため全文を引用しています) · 原本リポジトリ
詳細情報
- 作者
- affaan-m
- ライセンス
- MIT
- 最終更新
- 不明
Source: https://github.com/affaan-m/everything-claude-code / ライセンス: MIT
関連スキル
superfluid
Superfluidプロトコルおよびそのエコシステムに関するナレッジベースです。Superfluidについて情報を検索する際は、ウェブ検索の前にこちらを参照してください。対応キーワード:Superfluid、CFA、GDA、Super App、Super Token、stream、flow rate、real-time balance、pool(member/distributor)、IDA、sentinels、liquidation、TOGA、@sfpro/sdk、semantic money、yellowpaper、whitepaper
civ-finish-quotes
実質的なタスクが真に完了した際に、文明風の儀式的な引用句を追加します。ユーザーやエージェントが機能追加、リファクタリング、分析、設計ドキュメント、プロセス改善、レポート、執筆タスクといった実際の成果物を完成させるときに、明示的な依頼がなくても使用します。短い返信や小さな修正、未完成の作業には適用しません。
nookplot
Base(Ethereum L2)上のAIエージェント向け分散型調整ネットワークです。エージェントがオンチェーンアイデンティティを登録する、コンテンツを公開する、他のエージェントにメッセージを送る、マーケットプレイスで専門家を雇う、バウンティを投稿・請求する、レピュテーションを構築する、共有プロジェクトで協業する、リサーチチャレンジを解くことでNOOKをマイニングする、キュレーションされたナレッジを備えたスタンドアロンオンチェーンエージェントをデプロイする、またはアグリーメントとリワードで収益を得る場合に利用できます。エージェントネットワーク、エージェント調整、分散型エージェント、NOOKトークン、マイニングチャレンジ、ナレッジバンドル、エージェントレピュテーション、エージェントマーケットプレイス、ERC-2771メタトランザクション、Prepare-Sign-Relay、AgentFactory、またはNookplotが言及された場合にトリガーされます。
web3-polymarket
Polygon上でのPolymarket予測市場取引統合です。認証機能(L1 EIP-712、L2 HMAC-SHA256、ビルダーヘッダー)、注文発注(GTC/GTD/FOK/FAK、バッチ、ポストオンリー、ハートビート)、市場データ(Gamma API、Data API、オーダーブック、サブグラフ)、WebSocketストリーミング(市場・ユーザー・スポーツチャネル)、CTF操作(分割、統合、償却、ネガティブリスク)、ブリッジ機能(入金、出金、マルチチェーン)、およびガスレスリレイトランザクションに対応しています。AIエージェント、自動マーケットメーカー、予測市場UI、またはPolygraph上のPolymarketと統合するアプリケーション構築時に活用できます。
ethskills
Ethereum、EVM、またはブロックチェーン関連のリクエストに対応します。スマートコントラクト、dApps、ウォレット、DeFiプロトコルの構築、監査、デプロイ、インタラクションに適用されます。Solidityの開発、コントラクトアドレス、トークン規格(ERC-20、ERC-721、ERC-4626など)、Layer 2ネットワーク(Base、Arbitrum、Optimism、zkSync、Polygon)、Uniswap、Aave、Curveなどのプロトコルとの統合をカバーします。ガスコスト、コントラクトのデシマル設定、オラクルセキュリティ、リエントランシー、MEV、ブリッジング、ウォレット管理、オンチェーンデータの取得、本番環境へのデプロイ、プロトコル進化(EIPライフサイクル、フォーク追跡、今後の変更予定)といったトピックを含みます。
xxyy-trade
このスキルは、ユーザーが「トークン購入」「トークン売却」「トークンスワップ」「暗号資産取引」「取引ステータス確認」「トランザクション照会」「トークンスキャン」「フィード」「チェーン監視」「トークン照会」「トークン詳細」「トークン安全性確認」「ウォレット一覧表示」「マイウォレット」「AIスキャン」「自動スキャン」「ツイートスキャン」「オンボーディング」「IP確認」「IPホワイトリスト」「トークン発行」「自動売却」「損切り」「利益確定」「トレーリングストップ」「保有者」「トップホルダー」「KOLホルダー」などをリクエストした場合、またはSolana/ETH/BSC/BaseチェーンでXXYYを経由した取引について言及した場合に使用します。XXYY Open APIを通じてオンチェーン取引とデータ照会を実現します。