コーディングエージェント(Claude Code、Aider、Codexなど)のカスタムタスクによる直接比較。合格率、コスト、時間、一貫性メトリクスを測定
한국어 요약은 준비 중입니다. 원문 설명을 표시하고 있습니다.
動画と音声の認識・理解・操作。認識 - ローカルファイル、URL、RTSP/ライブフィード、またはデスクトップのライブ録画からの取り込み; リアルタイムコンテキストと再生可能なストリームリンクを返す。理解 - フレームを抽出し、視覚的/意味的/時間的インデックスを構築し、タイムスタンプとオートクリップで瞬間を検索。
操作 - トランスコードと正規化(コーデック、fps、解像度、アスペクト比)、タイムライン編集(字幕、テキスト/画像オーバーレイ、ブランディング、オーディオオーバーレイ、吹き替え、翻訳)、メディアアセット生成(画像、音声、動画)、ライブストリームまたはデスクトップキャプチャからのイベントのリアルタイムアラートの作成。
한국어 요약은 준비 중입니다. 원문 설명을 표시하고 있습니다.
설치하기 전에 에이전트에게 전달되는 지시 내용을 확인할 수 있습니다.
動画、ライブストリーム、デスクトップセッションのための認識 + 記憶 + アクション。
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
ユーザーが「setup videodb」または同様のリクエストをした場合:
pip install "videodb[capture]" python-dotenv
Linuxでvideodb[capture]が失敗する場合、captureエクストラなしでインストール:
pip install videodb python-dotenv
ユーザーはいずれかの方法でVIDEO_DB_API_KEYを設定する必要があります:
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 | プランゲートされた機能 — プラン制限についてユーザーに通知 |
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" &cat "$STATE_DIR/videodb_ws_id"$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ツールで場所を特定してください。
VideoDBが操作をサポートしている場合、ffmpeg、moviepy、またはローカルエンコーディングツールを使用しないでください。以下はすべてVideoDBによりサーバーサイドで処理されます — トリミング、クリップの結合、オーディオまたはミュージックのオーバーレイ、字幕の追加、テキスト/画像オーバーレイ、トランスコード、解像度変更、アスペクト比変換、プラットフォーム要件に合わせたリサイズ、書き起こし、メディア生成。reference/editor.mdのLimitationsに記載されている操作(トランジション、速度変更、クロップ/ズーム、カラーグレーディング、ボリュームミキシング)のみローカルツールにフォールバックしてください。
| 問題 | VideoDBソリューション |
|---|---|
| プラットフォームが動画のアスペクト比や解像度を拒否 | video.reframe()またはconn.transcode()とVideoConfig |
| Twitter/Instagram/TikTok向けに動画をリサイズ | video.reframe(target="vertical")またはtarget="square" |
| 解像度の変更(例: 1080p → 720p) | conn.transcode()とVideoConfig(resolution=720) |
| 動画にオーディオ/ミュージックをオーバーレイ | Timeline上のAudioAsset |
| 字幕の追加 | video.add_subtitle()またはCaptionAsset |
| クリップの結合/トリミング | Timeline上のVideoAsset |
| ナレーション、ミュージック、SFXの生成 | coll.generate_voice()、generate_music()、generate_sound_effect() |
このスキルのリファレンス資料はskills/videodb/reference/にローカルにベンダリングされています。
実行時に外部リポジトリリンクを辿るのではなく、上記のローカルコピーを使用してください。
아직 리뷰가 없습니다. 사용해 본 소감을 남겨 주세요.
로그인 없이 쓸 수 있습니다. 사용 후기, 질문, 작동하지 않은 환경 등을 편하게 남겨 주세요.
아직 댓글이 없습니다. 첫 댓글을 남겨 보세요.
コーディングエージェント(Claude Code、Aider、Codexなど)のカスタムタスクによる直接比較。合格率、コスト、時間、一貫性メトリクスを測定
한국어 요약은 준비 중입니다. 원문 설명을 표시하고 있습니다.
AIエージェントのアクションスペース、ツール定義、オブザベーションフォーマットを設計・最適化し、タスク完了率を向上させる
한국어 요약은 준비 중입니다. 원문 설명을 표시하고 있습니다.
評価ファーストの実行、分解、コスト考慮型モデルルーティングによるエージェンティックエンジニアとしての運用
한국어 요약은 준비 중입니다. 원문 설명을 표시하고 있습니다.
AIエージェントが実装出力の大部分を生成するチームのためのエンジニアリング運用モデル
한국어 요약은 준비 중입니다. 원문 설명을 표시하고 있습니다.
AI支援開発のためのリグレッションテスト戦略。データベース依存なしのサンドボックスモードAPIテスト、自動バグチェックワークフロー、同一モデルがコードの作成とレビューを行う際のAIの盲点を検出するパターン。
한국어 요약은 준비 중입니다. 원문 설명을 표시하고 있습니다.
AndroidおよびKotlin Multiplatformプロジェクトのためのクリーンアーキテクチャパターン — モジュール構成、依存関係ルール、UseCase、Repository、データレイヤーパターン
한국어 요약은 준비 중입니다. 원문 설명을 표시하고 있습니다.