build-zoom-video-sdk-app について
Zoom Video SDKで独自のビデオ体験を構築する開発者向けのリファレンススキルです。プラットフォーム別の実装、セッションのライフサイクル、映像表示、ストレージを扱い、Meeting SDKとの違いも説明します。
主な機能
- 01カスタムビデオセッションのガイド
- 02Web UI Toolkitと独自UI
- 03クロスプラットフォームSDK資料
- 04セッションのライフサイクルとイベント処理
- 05BYOS録画ストレージガイド
活用シーン
- 01ブランドに合わせたビデオセッション画面の計画
- 02Webやモバイルでのセッション参加とメディア表示の実装
- 03クラウド録画のAmazon S3への直接保存
インストール
コマンドをコピーしてターミナルで実行します。
npx skills add https:/ / github.com/ anthropics/ knowledge-work-plugins --skill build-zoom-video-sdk-appインストール後、Claude Code で/build-zoom-video-sdk-appを入力して読み込まれたか確認します。
同梱ファイル
SKILL.md と一緒にインストールされる参考資料やスクリプト。
android/android.mdRUNBOOK.mdandroid/concepts/architecture.mdlifecycle-workflow.mdandroid/examples/session-join-pattern.mdandroid/references/android-reference-map.mdenvironment-variables.mdversioning-and-compatibility.mdandroid/scenarios/high-level-scenarios.mdandroid/troubleshooting/common-issues.mdflutter/RUNBOOK.mdflutter/concepts/high-level-scenarios.mdlifecycle-workflow.mdsdk-architecture-pattern.mdflutter/examples/event-handling-pattern.mdsession-join-pattern.mdsetup-guide.mdflutter/references/flutter-reference.mdmodule-map.mdofficial-sources.mdflutter/troubleshooting/common-issues.mddeprecated-and-contradictions.mdversion-drift.mdios/ios.mdios/concepts/architecture.mdlifecycle-workflow.mdios/examples/session-join-pattern.mdios/references/environment-variables.mdios-reference-map.mdversioning-and-compatibility.md詳細
/build-zoom-video-sdk-app
カスタムビデオセッション製品を完全に独自開発するための背景資料です。Meeting SDK と Video SDK のどちらを使うかまだ明確でない場合は、先に plan-zoom-product を使用してください。
Zoom のインフラストラクチャを活用して、カスタムビデオ体験を構築します。
厳格なルーティングガードレール(最初にお読みください)
- カスタムのリアルタイムビデオアプリの動作(トピック/セッションへの参加、カスタムレンダリング、アタッチ/デタッチ)を求められた場合は、Video SDK に振り分けてください。
- Video SDK の参加フローに REST ミーティングエンドポイントを使用しないでください。
- Video SDK では、Meeting ID、
join_url、Meeting SDK の参加ペイロードフィールド(meetingNumber、passWord)は使用しません。
Meeting SDK と Video SDK の比較
| 機能 | Meeting SDK | Video SDK |
|---|---|---|
| UI | Zoom のデフォルト UI またはカスタム UI | 完全なカスタム UI(自分で構築) |
| エクスペリエンス | Zoom ミーティング | ビデオセッション |
| ブランディング | カスタマイズに制限あり | ブランディングを完全に制御 |
| 機能 | Zoom の全機能 | コアビデオ機能 |
UI オプション(Web)
Video SDK では、UI を完全に制御できます。
| オプション | 説明 |
|---|---|
| UI Toolkit | 事前構築済みの React コンポーネント(ローコード) |
| カスタム UI | SDK API を使って独自の UI を構築 |
前提条件
- Marketplace で取得した Zoom Video SDK の認証情報
- SDK Key と Secret
- Web 開発環境
OAuth や署名についてサポートが必要ですか? 認証フローについては、zoom-oauth スキルを参照してください。
Web で参加前の診断が必要ですか? 最初の 1 分間に発生する障害を減らすため、Video SDK の
join()の前に probe-sdk を使用してください。
すばやくトラブルシューティングを開始: 詳細なデバッグに入る前に、5 分間のランブック を使用してください。
クイックスタート(Web)
NPM の使用(Vite/Webpack などのバンドラー)
import ZoomVideo from '@zoom/videosdk';
const client = ZoomVideo.createClient();
await client.init('en-US', 'Global', { patchJsMedia: true });
await client.join(topic, signature, userName, password);
// IMPORTANT: getMediaStream() ONLY works AFTER join()
const stream = client.getMediaStream();
await stream.startVideo();
await stream.startAudio();
CDN の使用(バンドラーなし)
警告:広告ブロッカーは
source.zoom.usをブロックします。問題を避けるには、SDK をセルフホストしてください。
# Download SDK locally
curl "https://source.zoom.us/videosdk/zoom-video-1.12.0.min.js" -o js/zoom-video-sdk.min.js
<script src="js/zoom-video-sdk.min.js"></script>
// CDN exports as WebVideoSDK, NOT ZoomVideo
// Must use .default property
const ZoomVideo = WebVideoSDK.default;
const client = ZoomVideo.createClient();
await client.init('en-US', 'Global', { patchJsMedia: true });
await client.join(topic, signature, userName, password);
// IMPORTANT: getMediaStream() ONLY works AFTER join()
const stream = client.getMediaStream();
await stream.startVideo();
await stream.startAudio();
CDN を使った ES Module(競合状態の修正)
CDN と <script type="module"> を使用する場合、SDK がまだ読み込まれていないことがあります。
// Wait for SDK to load before using
function waitForSDK(timeout = 10000) {
return new Promise((resolve, reject) => {
if (typeof WebVideoSDK !== 'undefined') {
resolve();
return;
}
const start = Date.now();
const check = setInterval(() => {
if (typeof WebVideoSDK !== 'undefined') {
clearInterval(check);
resolve();
} else if (Date.now() - start > timeout) {
clearInterval(check);
reject(new Error('SDK failed to load'));
}
}, 100);
});
}
// Usage
await waitForSDK();
const ZoomVideo = WebVideoSDK.default;
const client = ZoomVideo.createClient();
SDK のライフサイクル(順序が非常に重要)
SDK には厳密なライフサイクルがあります。順序に違反すると、エラーが表示されないまま失敗します。
1. Create client: client = ZoomVideo.createClient()
2. Initialize: await client.init('en-US', 'Global', options)
3. Join session: await client.join(topic, signature, userName, password)
4. Get stream: stream = client.getMediaStream() ← ONLY AFTER JOIN
5. Start media: await stream.startVideo() / await stream.startAudio()
よくある間違い(エラーが表示されない失敗):
// ❌ WRONG: Getting stream before joining
const client = ZoomVideo.createClient();
await client.init('en-US', 'Global');
const stream = client.getMediaStream(); // Returns undefined!
await client.join(...);
// ✅ CORRECT: Get stream after joining
const client = ZoomVideo.createClient();
await client.init('en-US', 'Global');
await client.join(...);
const stream = client.getMediaStream(); // Works!
ビデオのレンダリング(イベント駆動型)
SDK はイベント駆動型です。 イベントをリッスンし、それに応じてビデオをレンダリングする必要があります。
renderVideo() ではなく attachVideo() を使用
import { VideoQuality } from '@zoom/videosdk';
// Start your camera
await stream.startVideo();
// Attach video - returns element to append to DOM
const element = await stream.attachVideo(userId, VideoQuality.Video_360P);
container.appendChild(element);
// Detach when done
await stream.detachVideo(userId);
必須イベント
// When other participant's video turns on/off
client.on('peer-video-state-change', async (payload) => {
const { action, userId } = payload;
if (action === 'Start') {
const el = await stream.attachVideo(userId, VideoQuality.Video_360P);
container.appendChild(el);
} else {
await stream.detachVideo(userId);
}
});
// When participants join/leave
client.on('user-added', (payload) => { /* check bVideoOn */ });
client.on('user-removed', (payload) => { stream.detachVideo(payload.userId); });
イベント処理のパターンについて詳しくは、web/references/web.md を参照してください。
主な概念
| 概念 | 説明 |
|---|---|
| セッション | ビデオセッション(ミーティングではありません) |
| トピック | セッション識別子(任意の文字列を指定) |
| 署名 | 認証用 JWT |
| MediaStream | 音声/ビデオストリームの制御 |
セッション作成モデル
重要: Video SDK のセッションは、事前ではなく必要な時点で作成されます。
| 項目 | Video SDK | Meeting SDK |
|---|---|---|
| 事前作成 | 不要 | 先に API でミーティングを作成 |
| セッション開始 | 最初の参加者がトピックを指定して参加 | 既存の Meeting ID に参加 |
| トピック | 任意の文字列(自分で定義) | API から取得した Meeting ID |
| スケジュール設定 | 該当なし — セッションは随時開催 | ミーティングはスケジュール設定可能 |
セッションの仕組み
- 事前作成は不要: 誰かが参加するまでセッションは存在しません
- トピック = セッション ID: 同じ
topic文字列を指定して参加する参加者は、同じセッションに参加します - 最初の参加で作成: 最初の参加者が参加した時点でセッションが作成されます
- Meeting ID はありません: Zoom Meetings のような数値の Meeting ID はありません
// Session is created on-the-fly when first user joins
// Any string can be the topic - it becomes the session identifier
await client.join('my-custom-session-123', signature, 'User Name');
// Other participants join the SAME session by using the SAME topic
await client.join('my-custom-session-123', signature, 'Another User');
署名エンドポイントの設定
署名エンドポイントには、CORS の問題なくフロントエンドからアクセスできる必要があります。
オプション 1:同一オリジンのプロキシ(推奨)
# Nginx config
location /api/ {
proxy_pass http://YOUR_BACKEND_HOST:3005/api/;
proxy_http_version 1.1;
proxy_set_header Host $host;
}
// Frontend uses relative URL (same origin)
const response = await fetch('/api/signature', { ... });
オプション 2:CORS の設定
// Express.js backend
const cors = require('cors');
app.use(cors({
origin: ['https://your-domain.com'],
credentials: true
}));
警告: 混在コンテンツ(HTTPS ページ → HTTP API)はブラウザーによってブロックされます。
ユースケース
| ユースケース | 説明 |
|---|---|
| Video SDK BYOS(ストレージの持ち込み) | 録画を S3 バケットに直接保存します |
BYOS(ストレージの持ち込み)
Video SDK の機能です。Zoom がクラウド録画を 直接 Amazon S3 バケットに保存します。ダウンロードは不要です。
前提条件:
- Cloud Recording アドオン付きの Video SDK アカウント(Universal Credit に含まれています)
- AWS S3 バケット
認証オプション:
- AWS Access Key - 設定が簡単です
- Cross Account Access - より安全です(IAM ロールの引き受け)
S3 パスの構造:
Buckets/{bucketName}/cmr/byos/{YYYY}/{MM}/{DD}/{GUID}/cmr_byos/
主なメリット:
- ダウンロード時の帯域幅コストがゼロです
- 録画中に直接ストレージへ保存します
- 設定のみで導入できます(Webhook やダウンロード用コードは不要です)
設定場所: Developer Portal → Account Settings → General → Communications Content Storage Location
完全なセットアップガイドについては、../general/use-cases/video-sdk-bring-your-own-storage.md を参照してください。
詳細リファレンス
UI とコンポーネント
- references/ui-toolkit.md - 事前構築済みの UI コンポーネント(Web)
- references/triage-intake.md - 最初に確認する内容(曖昧な報告を回答に変える)
- references/session-lifecycle.md - 正しい API 呼び出し順序とイベント駆動型のレンダリング
- references/licensing-and-entitlements.md - ライセンスと管理者の前提条件
- references/token-contract-test-spec.md - 共通のバックエンドトークン契約とクロスプラットフォームのスモークテスト
プラットフォームガイド
- references/authorization.md - Video SDK の JWT 生成
- web/SKILL.md - Web Video SDK(JavaScript/TypeScript)
- web/SKILL.md - ドキュメント全体のナビゲーション
- web/examples/react-hooks.md - 公式 React フックライブラリ
- web/examples/framework-integrations.md - Next.js、Vue/Nuxt のパターン
- react-native/SKILL.md - React Native Video SDK(モバイルラッパー、ヘルパー/イベントアーキテクチャ)
- react-native/SKILL.md - React Native ドキュメントのナビゲーション
- react-native/examples/session-join-pattern.md - トークンを使用したセッション参加フロー
- flutter/SKILL.md - Flutter Video SDK(モバイルラッパー、イベント駆動型アーキテクチャ)
- flutter/SKILL.md - Flutter ドキュメントのナビゲーション
- flutter/examples/session-join-pattern.md - トークンを使用したセッション参加フロー
- android/SKILL.md - Android Video SDK(ネイティブモバイルのカスタム UI、トークンを使用したセッション)
- ios/SKILL.md - iOS Video SDK(ネイティブモバイルのカスタム UI、デリゲート駆動型ライフサイクル)
- macos/SKILL.md - macOS Video SDK(デスクトップネイティブアプリ、カスタムセッションウィンドウ)
- unity/SKILL.md - Unity Video SDK ラッパー(ゲームエンジン統合、シーン駆動型 UX)
- linux/SKILL.md - Linux Video SDK の概要(C++ ヘッドレスボット)
- linux/linux.md - Linux C++ SDK(ヘッドレスボット、未加工メディアのキャプチャ/注入)
- linux/references/linux-reference.md - Linux API リファレンス
- windows/SKILL.md - Windows C++ SDK(デスクトップアプリケーション、未加工メディアのキャプチャ/注入)
- windows/references/windows-reference.md - Windows API リファレンス
- references/troubleshooting.md - よくある問題と解決策
- references/forum-top-questions.md - よくあるフォーラム質問のパターン(取り上げる内容)
サンプルリポジトリ
公式(Zoom 提供)
| 種類 | リポジトリ | スター数 |
|---|---|---|
| Web | videosdk-web-sample | 137 |
| Web NPM | videosdk-web | 56 |
| 認証 | videosdk-auth-endpoint-sample | 23 |
| UI Toolkit Web | videosdk-zoom-ui-toolkit-web | 17 |
| UI Toolkit React | videosdk-zoom-ui-toolkit-react-sample | 17 |
| Next.js | videosdk-nextjs-quickstart | 16 |
| 遠隔医療 | VideoSDK-Web-Telehealth | 11 |
| Linux | videosdk-linux-raw-recording-sample | - |
全一覧: general/references/community-repos.md を参照してください。
リソース
- 公式ドキュメント: https://developers.zoom.us/docs/video-sdk/
- 開発者フォーラム: https://devforum.zoom.us/
環境変数
- 標準化された
.envキーと各値の確認場所については、references/environment-variables.md を参照してください。
Linux の運用
- linux/RUNBOOK.md - Linux プラットフォームの事前確認とデバッグのチェックリスト。