zoom-rtms について
zoom-rtmsは、Zoomのミーティング、ウェビナー、Video SDKセッション、Contact Center Voiceからライブメディアを受信するバックエンドパイプライン向けの技術リファレンスです。SDKとWebSocket、イベント、実装上の制約を解説します。
主な機能
- 01ライブ音声・動画・文字起こし・チャット・画面共有ストリーム
- 02Webhookを起点とするストリームライフサイクル
- 03SDKと手動WebSocketによる接続方式
- 04ミーティング、ウェビナー、Video SDK、Contact Center Voiceに対応
- 05接続、ハートビート、再接続のガイダンス
活用シーン
- 01分析用のミーティング音声と文字起こしの受信
- 02画面共有と動画フレームの取得
- 03Zoomセッション向けバックエンドメディアパイプラインの構築
インストール
コマンドをコピーしてターミナルで実行します。
npx skills add https:/ / github.com/ anthropics/ knowledge-work-plugins --skill zoom-rtmsインストール後、Claude Code で/zoom-rtmsを入力して読み込まれたか確認します。
同梱ファイル
SKILL.md と一緒にインストールされる参考資料やスクリプト。
RUNBOOK.mdconcepts/connection-architecture.mdlifecycle-flow.mdexamples/ai-integration.mdmanual-websocket.mdrtms-bot.mdsdk-quickstart.mdreferences/connection.mddata-types.mdenvironment-variables.mdmedia-types.mdquickstart.mdwebhooks.mdtroubleshooting/common-issues.md詳細
Zoom Realtime Media Streams (RTMS)
Zoom のライブメディアパイプラインに関する背景情報です。まず build-zoom-bot を使用し、その後、このスキルでストリームの種類、機能、RTMS 固有の実装上の制約を確認してください。
Zoom Realtime Media Streams (RTMS)
Zoom ミーティング、ウェビナー、Video SDK セッション、Zoom Contact Center Voice から、ライブ音声、動画、文字起こし、チャット、画面共有データにリアルタイムでアクセスするための専門的なガイダンスです。RTMS はオープンスタンダードを用いた WebSocket ベースのプロトコルで、メディアプレーンを取り込むためのミーティングボットは不要です。
まずお読みください(重要)
RTMS は主にバックエンドのメディア取り込みサービスです。
- バックエンドがライブメディアを受信して処理します:音声、動画、画面共有、チャット、文字起こし。
- RTMS 自体はフロントエンド UI SDK ではありません。
- 処理はイベントによってトリガーされます。バックエンドは、RTMS の開始 webhook イベントを待ってからストリームの処理を開始します。
任意のアーキテクチャ(一般的な構成):
- クライアント内 UI/コントロール用に、フロントエンドへZoom App SDKを追加します。
- バックエンドの RTMS 出力を、WebSocket(または SSE、gRPC、キューワーカーなど)経由でフロントエンドにストリーミングします。
メディア/データプレーンには RTMS を使用し、プレゼンテーションとユーザー操作にはフロントエンドフレームワーク/Zoom Apps を使用してください。
公式ドキュメント: https://developers.zoom.us/docs/rtms/ SDK リファレンス(JS): https://zoom.github.io/rtms/js/ SDK リファレンス(Python): https://zoom.github.io/rtms/py/ サンプルリポジトリ: https://github.com/zoom/rtms-samples
クイックリンク
RTMS を初めて使用する場合は、この手順に従ってください:
- 接続アーキテクチャ - 2 フェーズの WebSocket 設計
- SDK クイックスタート - メディアを受信する最速の方法(推奨)
- 手動 WebSocket - SDK を使わずにプロトコルを完全に制御
- メディアの種類 - 音声、動画、文字起こし、チャット、画面共有
実装ガイド:
- RTMS ボット - ボットのエンドツーエンド実装ガイド
リファレンス:
- ライフサイクルフロー - webhook からストリーミングまでの完全なフロー
- データ型 - すべての列挙型と定数
- Webhooks - イベントサブスクリプションの詳細
- 環境変数 - 認証情報モードとランタイム設定
- クイックスタートのメモ - 追加のクイックスタートガイド
- 統合インデックス - このファイルの以下のセクションを参照してください
問題が発生していますか?
- 接続に失敗する → よくある問題
- 接続が重複する → Webhook の注意点
- 音声/動画がない → メディア設定
- 事前確認から始める → 5 分間のランブック
対応製品
| 製品 | Webhook イベント | ペイロード ID | アプリの種類 |
|---|---|---|---|
| Meetings | meeting.rtms_started / meeting.rtms_stopped | meeting_uuid | 一般アプリ |
| Webinars | webinar.rtms_started / webinar.rtms_stopped | meeting_uuid(同じです!) | 一般アプリ |
| Video SDK | session.rtms_started / session.rtms_stopped | session_id | Video SDK アプリ |
| Zoom Contact Center Voice | 製品固有の RTMS/ZCC Voice イベント | 製品固有のストリーム/セッション識別子 | Contact Center/承認済み RTMS 統合 |
接続後は、コアとなるシグナリング/メディアソケットのモデルが製品間で共通です。Meetings、Webinars、Video SDK セッションでは、一般的な開始/停止 webhook を使用します。Zoom Contact Center Voice には独自の RTMS/ZCC Voice イベント群があるため、製品固有のイベントペイロードを持つ同じトランスポートモデルとして扱ってください。
RTMS の概要
RTMS は、参加者ボットを使わずに、Zoom ミーティング、ウェビナー、Video SDK セッションのライブメディアにアプリからアクセスできるデータパイプラインです。自動化されたクライアントをミーティングに参加させる代わりに、RTMS を使用して Zoom のインフラストラクチャから直接メディアデータを収集します。
RTMS が提供するもの
| メディアの種類 | 形式 | 用途 |
|---|---|---|
| 音声 | PCM(L16)、G.711、G.722、Opus | 文字起こし、音声分析、録音 |
| 動画 | H.264、JPG、PNG | 録画、AI ビジョン、サムネイル、アクティブな参加者の選択 |
| 画面共有 | H.264、JPG、PNG | コンテンツのキャプチャ、スライドの抽出 |
| トランスクリプト | JSON テキスト | ミーティングの議事録、検索、コンプライアンス |
| チャット | JSON テキスト | アーカイブ、感情分析 |
2026 年 3 月のプロトコル変更
- Zoom Contact Center Voice のサポート:RTMS で Contact Center Voice の音声およびトランスクリプトのシナリオが利用できるようになりました。
- トランスクリプトの言語識別制御:トランスクリプトメディアのハンドシェイクで
src_languageとenable_lidがサポートされるようになりました。デフォルトでは LID が有効です。固定言語を強制するには、enable_lid: falseを設定します。 - 単一参加者の動画ストリーム購読:
data_optにVIDEO_SINGLE_INDIVIDUAL_STREAMを設定すると、一度に 1 人の参加者のカメラ映像をストリーミングできるようになりました。 - クライアントからの正常なシャットダウン:バックエンドはシグナリングソケット経由で
STREAM_CLOSE_REQを送信し、STREAM_CLOSE_RESPを待機できます。 - メディアのキープアライブ許容時間の延長:メディアソケットのキープアライブタイムアウトが 35 秒から 65 秒 になりました。
2 つの方法
| 方法 | 最適な用途 | 複雑さ |
|---|---|---|
SDK(@zoom/rtms) | ほとんどの用途 | 低 - WebSocket の複雑さを処理します |
| 手動 WebSocket | カスタムプロトコル、その他の言語 | 高 - プロトコル全体を実装します |
前提条件
- JavaScript SDK 用の Node.js 20.3.0+(24 LTS を推奨)
- Python SDK 用の Python 3.10+
- RTMS 機能を有効にした Zoom General App(ミーティング/ウェビナー用)または Video SDK App(Video SDK 用)
- RTMS イベント用の Webhook エンドポイント
- WebSocket ストリームを受信するサーバー
RTMS へのアクセスが必要ですか? Zoom Developer Forum に、ユースケースを添えて RTMS へのアクセスをリクエストしてください。
クイックスタート(SDK - 推奨)
import rtms from "@zoom/rtms";
// All RTMS start/stop events across products
const RTMS_EVENTS = ["meeting.rtms_started", "webinar.rtms_started", "session.rtms_started"];
// Handle webhook events
rtms.onWebhookEvent(({ event, payload }) => {
if (!RTMS_EVENTS.includes(event)) return;
const client = new rtms.Client();
client.onAudioData((data, timestamp, metadata) => {
console.log(`Audio from ${metadata.userName}: ${data.length} bytes`);
});
client.onTranscriptData((data, timestamp, metadata) => {
const text = data.toString('utf8');
console.log(`${metadata.userName}: ${text}`);
});
client.onJoinConfirm((reason) => {
console.log(`Joined session: ${reason}`);
});
// SDK handles all WebSocket connections automatically
// Accepts both meeting_uuid and session_id transparently
client.join(payload);
});
クイックスタート(手動 WebSocket)
完全な制御が必要な場合や SDK を利用できない言語の場合は、次の 2 段階の WebSocket プロトコルを実装してください。
const WebSocket = require('ws');
const crypto = require('crypto');
const RTMS_EVENTS = ['meeting.rtms_started', 'webinar.rtms_started', 'session.rtms_started'];
// 1. Generate signature
// For meetings/webinars: uses meeting_uuid. For Video SDK: uses session_id.
function generateSignature(clientId, idValue, streamId, clientSecret) {
const message = `${clientId},${idValue},${streamId}`;
return crypto.createHmac('sha256', clientSecret).update(message).digest('hex');
}
// 2. Handle webhook
app.post('/webhook', (req, res) => {
res.status(200).send(); // CRITICAL: Respond immediately!
const { event, payload } = req.body;
if (RTMS_EVENTS.includes(event)) {
connectToRTMS(payload);
}
});
// 3. Connect to signaling WebSocket
function connectToRTMS(payload) {
const { server_urls, rtms_stream_id } = payload;
// meeting_uuid for meetings/webinars, session_id for Video SDK
const idValue = payload.meeting_uuid || payload.session_id;
const signature = generateSignature(CLIENT_ID, idValue, rtms_stream_id, CLIENT_SECRET);
const signalingWs = new WebSocket(server_urls);
signalingWs.on('open', () => {
signalingWs.send(JSON.stringify({
msg_type: 1, // Handshake request
protocol_version: 1,
meeting_uuid: idValue,
rtms_stream_id,
signature,
media_type: 9 // AUDIO(1) | TRANSCRIPT(8)
}));
});
// ... handle responses, connect to media WebSocket
}
参照:手動 WebSocket ガイドで完全な実装を確認できます。
メディアタイプのビットマスク
ビット単位の OR 演算子で種類を組み合わせます。
| 種類 | 値 | 説明 |
|---|---|---|
| 音声 | 1 | PCM 音声サンプル |
| 動画 | 2 | H.264/JPG 動画フレーム |
| 画面共有 | 4 | 動画とは別です! |
| トランスクリプト | 8 | リアルタイム音声テキスト変換 |
| チャット | 16 | ミーティング中のチャットメッセージ |
| すべて | 32 | すべてのメディアタイプ |
例:音声 + トランスクリプト = 1 | 8 = 9
重要な注意点
| 問題 | 解決策 |
|---|---|
| 接続は 1 つのみ許可 | 新しい接続を開始すると、既存の接続が切断されます。アクティブなセッションを追跡してください! |
| すぐに 200 を返す | Webhook の応答が遅れると、Zoom が再試行して重複した接続を作成します |
| ハートビートは必須 | msg_type 12 に対して msg_type 13 を返さないと、接続が切断されます |
| 再接続は利用者側の責任です | RTMS は自動再接続しません。メディアのキープアライブ許容時間は約 65 秒 になりました。シグナリングは引き続き約 60 秒 です |
| トランスクリプトの言語が変わる | 自動的な言語切り替えではなく固定言語で文字起こしする場合は、src_language と enable_lid: false を使用してください |
| 動画は単一参加者のみ | VIDEO_SINGLE_INDIVIDUAL_STREAM がサポートするのは一度に 1 人の参加者です。新しい VIDEO_SUBSCRIPTION_REQ を送信すると、以前の選択が上書きされます |
| 正常な切断が明示的になりました | バックエンドでストリームを正常に終了する場合は、STREAM_CLOSE_REQ/STREAM_CLOSE_RESP を使用してください |
環境変数
SDK 環境変数
# Required - Authentication
ZM_RTMS_CLIENT=your_client_id # Zoom OAuth Client ID
ZM_RTMS_SECRET=your_client_secret # Zoom OAuth Client Secret
# Optional - Webhook server
ZM_RTMS_PORT=8080 # Default: 8080
ZM_RTMS_PATH=/webhook # Default: /
# Optional - Logging
ZM_RTMS_LOG_LEVEL=info # error, warn, info, debug, trace
ZM_RTMS_LOG_FORMAT=progressive # progressive or json
ZM_RTMS_LOG_ENABLED=true
手動実装の変数
ZOOM_CLIENT_ID=your_client_id
ZOOM_CLIENT_SECRET=your_client_secret
ZOOM_SECRET_TOKEN=your_webhook_token # For webhook validation
Zoom アプリのセットアップ
ミーティングとウェビナーの場合(General App)
- marketplace.zoom.us にアクセスし、Develop -> Build App の順に選択します
- General App -> User-Managed を選択します
- Features -> Access -> Enable Event Subscription を選択します
- Add Events -> 「rtms」を検索し、次を選択します:
meeting.rtms_startedmeeting.rtms_stoppedwebinar.rtms_started(ウェビナーを使用する場合)webinar.rtms_stopped(ウェビナーを使用する場合)
- Scopes -> Add Scopes -> 「rtms」を検索し、次を追加します:
meeting:read:meeting_audiomeeting:read:meeting_videomeeting:read:meeting_transcriptmeeting:read:meeting_chatwebinar:read:webinar_audio(ウェビナーを使用する場合)webinar:read:webinar_video(ウェビナーを使用する場合)webinar:read:webinar_transcript(ウェビナーを使用する場合)webinar:read:webinar_chat(ウェビナーを使用する場合)
Video SDK の場合(Video SDK App)
- marketplace.zoom.us にアクセスし、Develop -> Build App の順に選択します
- Video SDK App を選択します
- SDK Key と SDK Secret を使用します(OAuth Client ID/Secret ではありません)
- 次のイベントを追加します:
session.rtms_startedsession.rtms_stopped
サンプルリポジトリ
公式サンプル
| リポジトリ | 説明 |
|---|---|
| rtms-samples | RTMSManager、ボイラープレート、AI サンプル |
| rtms-quickstart-js | JavaScript SDK クイックスタート |
| rtms-quickstart-py | Python SDK クイックスタート |
| rtms-sdk-cpp | C++ SDK |
| zoom-rtms | メインの SDK リポジトリ |
AI 統合サンプル
| サンプル | 説明 |
|---|---|
| rtms-meeting-assistant-starter-kit | 要約機能付き AI ミーティングアシスタント |
| arlo-meeting-assistant | DB を備えた本番環境向けミーティングアシスタント |
| videosdk-rtms-transcribe-audio | Whisper による文字起こし |
ドキュメント一覧
概念
- 接続アーキテクチャ - 2 段階の WebSocket 設計
- ライフサイクルフロー - Webhook からストリーミングまでのフロー
例
- SDK クイックスタート - @zoom/rtms SDK の使用方法
- 手動 WebSocket - 生のプロトコル実装
- RTMS ボット - ボット実装の完全ガイド
- AI 統合 - 文字起こしと分析のパターン
リファレンス
- メディアの種類 - 音声、動画、文字起こし、チャット、画面共有
- データの種類 - すべての列挙型と定数
- 接続 - WebSocket プロトコルの詳細
- Webhook - イベントのサブスクリプション
トラブルシューティング
- よくある問題 - FAQ と解決策
リソース
- 公式ドキュメント: https://developers.zoom.us/docs/rtms/
- データの種類: https://developers.zoom.us/docs/rtms/data-types/
- メディアパラメーター: https://developers.zoom.us/docs/rtms/media-parameter-definition/
- 開発者フォーラム: https://devforum.zoom.us/
お困りですか? 全体を参照するには、以下の「統合インデックス」セクションから始めてください。
統合インデックス
このセクションは SKILL.md から移行されました。
RTMS は、Zoom のミーティング、ウェビナー、Video SDK セッションのライブ音声、動画、文字起こし、チャット、画面共有にリアルタイムでアクセスできます。
重要な位置づけ
RTMS は、メディアストリームを受信して処理するバックエンドサービスとして扱ってください。
- バックエンドの役割:音声/動画/画面共有/チャット/トランスクリプトを取り込み、AI/分析を実行し、データを保存/転送します。
- オプションのフロントエンドの役割:バックエンドのトランスポート(WebSocket/SSE/その他)から処理済みのストリームデータを利用する Zoom App SDK またはウェブダッシュボードです。
- 起動モデル:バックエンドは RTMS 開始の webhook イベントを待機し、その後ストリーム処理を開始します。
RTMS をフロントエンド専用 SDK として扱わないでください。
クイックスタートの手順
RTMS を初めて使う場合は、次の順序で進めてください。
-
まず事前チェックを実行します -> RUNBOOK.md
-
アーキテクチャを理解します -> concepts/connection-architecture.md
- 2 フェーズの WebSocket:シグナリング + メディア
- RTMS がボットを使用しない理由
-
アプローチを選択します -> SDK または手動
- SDK(推奨):examples/sdk-quickstart.md
- 手動の WebSocket:examples/manual-websocket.md
-
ライフサイクルを理解します -> concepts/lifecycle-flow.md
- Webhook -> シグナリング -> メディア -> ストリーミング
-
メディアの種類を設定します -> references/media-types.md
- 音声、動画、トランスクリプト、チャット、画面共有
-
問題をトラブルシューティングします -> troubleshooting/common-issues.md
- 接続の問題、webhook の重複、データの欠落
ドキュメントの構成
rtms/
├── SKILL.md # Main skill overview
├── SKILL.md # This file - navigation guide
│
├── concepts/ # Core architectural patterns
│ ├── connection-architecture.md # Two-phase WebSocket design
│ └── lifecycle-flow.md # Webhook to streaming flow
│
├── examples/ # Complete working code
│ ├── sdk-quickstart.md # Using @zoom/rtms SDK
│ ├── manual-websocket.md # Raw protocol implementation
│ ├── rtms-bot.md # Complete RTMS bot implementation
│ └── ai-integration.md # Transcription and analysis
│
├── references/ # Reference documentation
│ ├── media-types.md # Audio, video, transcript, chat, share
│ ├── data-types.md # All enums and constants
│ ├── connection.md # WebSocket protocol details
│ └── webhooks.md # Event subscription
│
└── troubleshooting/ # Problem solving guides
└── common-issues.md # FAQ and solutions
ユースケース別
会議のトランスクリプトを取得したい
- SDK クイックスタート - 最も手早い方法
- メディアの種類 - トランスクリプトの設定
- AI 連携 - Whisper、Deepgram、AssemblyAI
会議を録画したい
- メディアの種類 - 音声 + 動画の設定
- SDK クイックスタート - メディアの受信
- AI 連携 - 欠落を補完した録音
AI 会議アシスタントを構築したい
- AI 連携 - 完全なパターン
- SDK クイックスタート - メディアの取り込み
- ライフサイクルフロー - イベント処理
RTMS ボットを一から構築したい
- RTMS ボット - 完全な実装ガイド
- ライフサイクルフロー - Webhook からストリーミングまでのフロー
- 接続アーキテクチャ - 2 フェーズ設計
プロトコルを完全に制御したい
- 手動の WebSocket - ここから開始
- 接続アーキテクチャ - 2 フェーズ設計
- データ型 - すべてのメッセージ型と列挙値
- 接続 - プロトコルの詳細
接続エラーが発生している
アーキテクチャを理解したい
- 接続アーキテクチャ - 2 フェーズの WebSocket
- ライフサイクルフロー - フロー全体の図
- データ型 - プロトコル定数
製品別
Zoom Meetings 向けに構築する
- 標準的な RTMS の設定です。Webhook イベント:
meeting.rtms_started。OAuth を使用する General App を使います。 - SDK クイックスタートまたは手動の WebSocketから始めてください。
Zoom Webinars 向けに構築する
- 会議の場合と同じですが、webhook イベントは
webinar.rtms_startedです。ペイロードでは引き続きmeeting_uuidが使用されます(webinar_uuidではありません)。 - ウェビナーのスコープとイベントのサブスクリプションを追加してください。Webhooksを参照してください。
- 利用可能であることが確認されているのはパネリストのストリームのみです。参加者のストリームは個別ではない場合があります。
Zoom Video SDK 向けに開発する場合
- Webhook イベント:
session.rtms_started。ペイロードではmeeting_uuidではなくsession_idを使用します。 - SDK Key/Secret を持つ Video SDK App が必要です(OAuth Client ID/Secret ではありません)。
- 接続後のプロトコルは、ミーティングの場合と同じです。
- ペイロードの詳細については、Webhooks を参照してください。
主要ドキュメント
1. 接続アーキテクチャ(最重要)
concepts/connection-architecture.md
RTMS では、2 つの独立した WebSocket 接続を使用します。
- シグナリング WebSocket:認証、制御、ハートビート
- メディア WebSocket:実際の音声/動画/トランスクリプトデータ
2. SDK と手動実装(判断ポイント)
examples/sdk-quickstart.md と examples/manual-websocket.md
| SDK | 手動実装 |
|---|---|
| WebSocket の複雑さを処理します | プロトコルを完全に制御できます |
| 自動再接続 | 再接続は自分で実装します |
| コード量が少ない | コード量が多い |
| ほとんどのユースケースに最適 | カスタム要件に最適 |
3. 注意すべき重要事項(最もよくある問題)
troubleshooting/common-issues.md
- すぐに 200 を返す - Webhook への応答が遅れると重複が発生します
- ストリームごとの接続は 1 つのみ - 新しい接続により既存の接続は切断されます
- ハートビートが必須 - 接続を維持するには、キープアライブに応答する必要があります
- アクティブなセッションを追跡する - 重複した参加試行を防止します
重要なポイント
重要な発見:
-
2 段階の WebSocket 設計
- シグナリング:制御プレーン(ハンドシェイク、ハートビート、開始/停止)
- メディア:データプレーン(音声、動画、トランスクリプト、チャット、画面共有)
- 参照:接続アーキテクチャ
-
Webhook の応答タイミング
- 処理を開始する前に、必ず 200 を返してください
- 応答が遅れる -> Zoom が再試行する -> 接続が重複する
- 参照:よくある問題
-
ハートビートは必須
- シグナリング:msg_type 12 を受信し、msg_type 13 で応答します
- メディア:同じパターンです
- 応答しないと接続が閉じられます
- 参照:接続
-
署名の生成
- 形式:
HMAC-SHA256(clientSecret, "clientId,meetingUuid,streamId") - Video SDK では、
meetingUuidの代わりにsession_idを使用します - ウェビナーでは引き続き
webinar_uuidではなくmeeting_uuidを使用します - シグナリングとメディアの両方のハンドシェイクで必要です
- 参照:手動 WebSocket
- 形式:
-
メディアタイプはビットマスク
- Audio=1、Video=2、Share=4、Transcript=8、Chat=16、All=32
- OR で組み合わせます:Audio+Transcript = 1|8 = 9
- 参照:メディアタイプ
-
画面共有は動画とは別
- msg_type が異なります(16 と 15)
- メディアフラグが異なります(4 と 2)
- 個別にサブスクライブする必要があります
- 参照:メディアタイプ
クイックリファレンス
「接続に失敗する」
-> よくある問題
「接続が重複する」
「音声/動画データが届かない」
-> メディアタイプ - 設定を確認してください
「手動で実装するには?」
-> 手動 WebSocket
「どのようなメッセージタイプがありますか?」
-> データタイプ
「AI を統合するには?」
-> AI 統合
ドキュメントのバージョン
Zoom RTMS SDK v1.x および 2026 年時点の公式ドキュメントに基づいています。
コーディングを楽しみましょう!
最短で始めるにはSDK クイックスタートから、完全な制御が必要な場合は手動 WebSocketから始めてください。