mcpField
Z
zoom-rtms

zoom-rtms

github.com/anthropics開発33.6k2.1k 回インストール1 日前に更新
リポジトリ

zoom-rtms について

zoom-rtmsは、Zoomのミーティング、ウェビナー、Video SDKセッション、Contact Center Voiceからライブメディアを受信するバックエンドパイプライン向けの技術リファレンスです。SDKとWebSocket、イベント、実装上の制約を解説します。

主な機能

  1. 01ライブ音声・動画・文字起こし・チャット・画面共有ストリーム
  2. 02Webhookを起点とするストリームライフサイクル
  3. 03SDKと手動WebSocketによる接続方式
  4. 04ミーティング、ウェビナー、Video SDK、Contact Center Voiceに対応
  5. 05接続、ハートビート、再接続のガイダンス

活用シーン

  1. 01分析用のミーティング音声と文字起こしの受信
  2. 02画面共有と動画フレームの取得
  3. 03Zoomセッション向けバックエンドメディアパイプラインの構築

インストール

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

$npx skills add https://github.com/anthropics/knowledge-work-plugins --skill zoom-rtms

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

同梱ファイル

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

RUNBOOK.md
concepts/
connection-architecture.md
lifecycle-flow.md
examples/
ai-integration.md
manual-websocket.md
rtms-bot.md
sdk-quickstart.md
references/
connection.md
data-types.md
environment-variables.md
media-types.md
quickstart.md
webhooks.md
troubleshooting/
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 を初めて使用する場合は、この手順に従ってください:

  1. 接続アーキテクチャ - 2 フェーズの WebSocket 設計
  2. SDK クイックスタート - メディアを受信する最速の方法(推奨)
  3. 手動 WebSocket - SDK を使わずにプロトコルを完全に制御
  4. メディアの種類 - 音声、動画、文字起こし、チャット、画面共有

実装ガイド:

  • RTMS ボット - ボットのエンドツーエンド実装ガイド

リファレンス:

問題が発生していますか?

対応製品

製品Webhook イベントペイロード IDアプリの種類
Meetingsmeeting.rtms_started / meeting.rtms_stoppedmeeting_uuid一般アプリ
Webinarswebinar.rtms_started / webinar.rtms_stoppedmeeting_uuid(同じです!)一般アプリ
Video SDKsession.rtms_started / session.rtms_stoppedsession_idVideo 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 演算子で種類を組み合わせます。

種類値説明
音声1PCM 音声サンプル
動画2H.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)
  1. marketplace.zoom.us にアクセスし、Develop -> Build App の順に選択します
  2. General App -> User-Managed を選択します
  3. Features -> Access -> Enable Event Subscription を選択します
  4. Add Events -> 「rtms」を検索し、次を選択します:
    • meeting.rtms_started
    • meeting.rtms_stopped
    • webinar.rtms_started(ウェビナーを使用する場合)
    • webinar.rtms_stopped(ウェビナーを使用する場合)
  5. Scopes -> Add Scopes -> 「rtms」を検索し、次を追加します:
    • meeting:read:meeting_audio
    • meeting:read:meeting_video
    • meeting:read:meeting_transcript
    • meeting:read:meeting_chat
    • webinar:read:webinar_audio(ウェビナーを使用する場合)
    • webinar:read:webinar_video(ウェビナーを使用する場合)
    • webinar:read:webinar_transcript(ウェビナーを使用する場合)
    • webinar:read:webinar_chat(ウェビナーを使用する場合)
Video SDK の場合(Video SDK App)
  1. marketplace.zoom.us にアクセスし、Develop -> Build App の順に選択します
  2. Video SDK App を選択します
  3. SDK Key と SDK Secret を使用します(OAuth Client ID/Secret ではありません)
  4. 次のイベントを追加します:
    • session.rtms_started
    • session.rtms_stopped

サンプルリポジトリ

公式サンプル
リポジトリ説明
rtms-samplesRTMSManager、ボイラープレート、AI サンプル
rtms-quickstart-jsJavaScript SDK クイックスタート
rtms-quickstart-pyPython SDK クイックスタート
rtms-sdk-cppC++ SDK
zoom-rtmsメインの SDK リポジトリ
AI 統合サンプル
サンプル説明
rtms-meeting-assistant-starter-kit要約機能付き AI ミーティングアシスタント
arlo-meeting-assistantDB を備えた本番環境向けミーティングアシスタント
videosdk-rtms-transcribe-audioWhisper による文字起こし

ドキュメント一覧

概念
例
リファレンス
トラブルシューティング

リソース


お困りですか? 全体を参照するには、以下の「統合インデックス」セクションから始めてください。


統合インデックス

このセクションは SKILL.md から移行されました。

RTMS は、Zoom のミーティング、ウェビナー、Video SDK セッションのライブ音声、動画、文字起こし、チャット、画面共有にリアルタイムでアクセスできます。

重要な位置づけ

RTMS は、メディアストリームを受信して処理するバックエンドサービスとして扱ってください。

  • バックエンドの役割:音声/動画/画面共有/チャット/トランスクリプトを取り込み、AI/分析を実行し、データを保存/転送します。
  • オプションのフロントエンドの役割:バックエンドのトランスポート(WebSocket/SSE/その他)から処理済みのストリームデータを利用する Zoom App SDK またはウェブダッシュボードです。
  • 起動モデル:バックエンドは RTMS 開始の webhook イベントを待機し、その後ストリーム処理を開始します。

RTMS をフロントエンド専用 SDK として扱わないでください。

クイックスタートの手順

RTMS を初めて使う場合は、次の順序で進めてください。

  1. まず事前チェックを実行します -> RUNBOOK.md

  2. アーキテクチャを理解します -> concepts/connection-architecture.md

    • 2 フェーズの WebSocket:シグナリング + メディア
    • RTMS がボットを使用しない理由
  3. アプローチを選択します -> SDK または手動

  4. ライフサイクルを理解します -> concepts/lifecycle-flow.md

    • Webhook -> シグナリング -> メディア -> ストリーミング
  5. メディアの種類を設定します -> references/media-types.md

    • 音声、動画、トランスクリプト、チャット、画面共有
  6. 問題をトラブルシューティングします -> 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

ユースケース別

会議のトランスクリプトを取得したい
  1. SDK クイックスタート - 最も手早い方法
  2. メディアの種類 - トランスクリプトの設定
  3. AI 連携 - Whisper、Deepgram、AssemblyAI
会議を録画したい
  1. メディアの種類 - 音声 + 動画の設定
  2. SDK クイックスタート - メディアの受信
  3. AI 連携 - 欠落を補完した録音
AI 会議アシスタントを構築したい
  1. AI 連携 - 完全なパターン
  2. SDK クイックスタート - メディアの取り込み
  3. ライフサイクルフロー - イベント処理
RTMS ボットを一から構築したい
  1. RTMS ボット - 完全な実装ガイド
  2. ライフサイクルフロー - Webhook からストリーミングまでのフロー
  3. 接続アーキテクチャ - 2 フェーズ設計
プロトコルを完全に制御したい
  1. 手動の WebSocket - ここから開始
  2. 接続アーキテクチャ - 2 フェーズ設計
  3. データ型 - すべてのメッセージ型と列挙値
  4. 接続 - プロトコルの詳細
接続エラーが発生している
  1. よくある問題 - 診断チェックリスト
  2. 接続アーキテクチャ - フローの確認
  3. Webhooks - 検証とタイミング
アーキテクチャを理解したい
  1. 接続アーキテクチャ - 2 フェーズの WebSocket
  2. ライフサイクルフロー - フロー全体の図
  3. データ型 - プロトコル定数

製品別

Zoom Meetings 向けに構築する
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

  1. すぐに 200 を返す - Webhook への応答が遅れると重複が発生します
  2. ストリームごとの接続は 1 つのみ - 新しい接続により既存の接続は切断されます
  3. ハートビートが必須 - 接続を維持するには、キープアライブに応答する必要があります
  4. アクティブなセッションを追跡する - 重複した参加試行を防止します

重要なポイント

重要な発見:
  1. 2 段階の WebSocket 設計

    • シグナリング:制御プレーン(ハンドシェイク、ハートビート、開始/停止)
    • メディア:データプレーン(音声、動画、トランスクリプト、チャット、画面共有)
    • 参照:接続アーキテクチャ
  2. Webhook の応答タイミング

    • 処理を開始する前に、必ず 200 を返してください
    • 応答が遅れる -> Zoom が再試行する -> 接続が重複する
    • 参照:よくある問題
  3. ハートビートは必須

    • シグナリング:msg_type 12 を受信し、msg_type 13 で応答します
    • メディア:同じパターンです
    • 応答しないと接続が閉じられます
    • 参照:接続
  4. 署名の生成

    • 形式:HMAC-SHA256(clientSecret, "clientId,meetingUuid,streamId")
    • Video SDK では、meetingUuid の代わりに session_id を使用します
    • ウェビナーでは引き続き webinar_uuid ではなく meeting_uuid を使用します
    • シグナリングとメディアの両方のハンドシェイクで必要です
    • 参照:手動 WebSocket
  5. メディアタイプはビットマスク

    • Audio=1、Video=2、Share=4、Transcript=8、Chat=16、All=32
    • OR で組み合わせます:Audio+Transcript = 1|8 = 9
    • 参照:メディアタイプ
  6. 画面共有は動画とは別

    • msg_type が異なります(16 と 15)
    • メディアフラグが異なります(4 と 2)
    • 個別にサブスクライブする必要があります
    • 参照:メディアタイプ

クイックリファレンス

「接続に失敗する」

-> よくある問題

「接続が重複する」

-> Webhook のタイミング

「音声/動画データが届かない」

-> メディアタイプ - 設定を確認してください

「手動で実装するには?」

-> 手動 WebSocket

「どのようなメッセージタイプがありますか?」

-> データタイプ

「AI を統合するには?」

-> AI 統合


ドキュメントのバージョン

Zoom RTMS SDK v1.x および 2026 年時点の公式ドキュメントに基づいています。


コーディングを楽しみましょう!

最短で始めるにはSDK クイックスタートから、完全な制御が必要な場合は手動 WebSocketから始めてください。

コメント