WebRTCと電話とのカンファレンス通話
Webアプリ上でWebRTCや電話網(PSTN)などの異なる通信タイプのユーザー同士が、1つのカンファレンスルームにて音声通話を実現するための実装手順を解説します。
2026/08/31
目的
「Web アプリと電話ユーザーを接続した複数名での音声通話」や、「共通の電話番号への着信を複数オペレーターで応答する」といった機能を実装するには WebRTC と PSTN(電話網)間の複雑な連携が必要となりますが、NTTCPaaS がそれらをサポートすることで容易に実現可能です。
本記事では、NTTCPaaS の Voice チャネルを活用した「電話と WebRTC をつなぐカンファレンス通話」の実装手順を解説します。SDK の導入から通話の確立、イベント処理まで、WebRTC SDK による会議の作成や Calls API を用いた電話ユーザーの参加フローをステップバイステップで説明します。
事前準備
WebRTC 通話を開始する前に、ポータルサイトで以下の準備を完了させてください。
なお、本シナリオでは電話着信イベントを受信・処理するための Webhook 環境が別途必要となります。あらかじめ Webhook エンドポイントをご用意ください。
1.APIキーの発行
管理画面の [デベロッパーツール] > [APIキー] セクションから作成します。
APIキーを作成画面にて下記の通り設定します。
- 名前:【任意のAPIキー名】
- 有効期限:【任意の有効期限】
- 許可されたIPアドレス(オプション):(必要に応じて設定)
- APIスコープ:
チャネル
・webrtc:identity:manage
・calls:traffic:send
・calls:traffic:receive
・calls:logs:read
※その他必要に応じて設定
2.電話番号の購入・準備
WebRTC と電話との発着信に使用する電話番号をマイページより購入します。
3.通話設定の作成
管理画面の [Channels と Numbers] > [チャネル] > [Voice および WebRTC] > [コールAPI]>[通話設定] セクションから、新しい通話設定を作成します。
「通話設定を作成」の画面から下記の設定にて作成します。
- 通話設定ID:【任意のルート名】
- 通話設定名:(必要に応じて設定)
4.通知プロファイルの作成
管理画面の [デベロッパーツール] > [サブスクリプション管理] >[通知プロファイル] セクションから、新しい通知プロファイルを作成します。
「通知プロファイルの作成」の画面から下記の設定にて作成します。
- 通知プロファイル
・通知プロファイルの名前:【任意の通知プロファイル名】
・Webhook URL:【あらかじめ用意したWebhook URL】 - セキュリティ設定(オプション):(必要に応じて設定)
- 証明書(オプション):(必要に応じて設定)
- 詳細設定(オプション):(必要に応じて設定)
5.サブスクリプションの作成
管理画面の [デベロッパーツール] > [サブスクリプション管理] >[配信登録] セクションから、新しいサブスクリプション(配信登録)を作成します。
「配信登録を作成」の画面から下記の設定にて作成します。
- カテゴリー
・チャネル:VoiceおよびWebRTC - イベント
・通話受信
・通話失敗 - フィルタリング
・ユーザー(オプション):(必要に応じて設定)
・エンティティ(オプション):(必要に応じて設定)
・アプリケーション(オプション):(必要に応じて設定)
・通話構成:【先ほど作成した通話設定】
・リソース(オプション):(必要に応じて設定) - 通知プロファイル
・通知プロファイル:【先ほど作成した通知プロファイル】
・セキュリティ設定(オプション):(必要に応じて設定)
・証明書(オプション):(必要に応じて設定)
・詳細設定(オプション):(必要に応じて設定)
6.通話ルーティングの設定
管理画面の [Channels と Numbers] > [番号] > [音声] セクションから、利用する電話番号のインバウンド構成を設定します。
電話番号のインバウンド構成を以下の通り設定します。
- 転送アクション:サブスクリプションに転送
- 通話設定:【先ほど作成した通話設定】
7.通話イベント確認
購入した電話番号に電話を発信し、Webhookに登録した通話イベントが通知されることを確認します。今回設定した「通話受信」「通話失敗」は以下のようなメッセージを取得します。
【通話受信(登録した電話番号への着信を検知)】
{
"callId":"aj7l1046nhcs2p47e9cg3po5l1e0nilcibbs6qhefirk-3",
"timestamp":"2025-11-30T14:19:17.465Z",
"callsConfigurationId":"CALLS_CONFIGURATION_TEST",
"platform":{
"applicationId":"webrtc-test-app"
},
"properties":{
"call":{
"id":"aj7l1046nhcs2p47e9cg3po5l1e0nilcibbs6qhefirk-3",
"endpoint":{
"phoneNumber":"818011111111",
"type":"PHONE"
},
"from":"818011111111",
"to":"815022222222",
"direction":"INBOUND",
"state":"CALLING",
"media":{
"audio":{
"muted":false,
"userMuted":false,
"deaf":false
},
"video":{
"camera":false,
"screenShare":false,
"blind":false
}
},
"startTime":"2025-11-30T14:19:17.482Z",
"ringDuration":0,
"callsConfigurationId":"CALLS_CONFIGURATION_TEST",
"platform":{
"applicationId":"webrtc-test-app"
},
"customData":{}
},
"apiBaseUrl":"https://ibapi.nttcpaas.com"
},
"type":"CALL_RECEIVED"
}
【通話失敗(電話ユーザーが発信を終了する等、通話の失敗を検知)】
{
"callId": "bvmr1046nhcs2p47e9cg3po5l1e0nilcibbs6qher2r9100",
"timestamp": "2025-12-03T01:18:39.623Z",
"callsConfigurationId": "CALLS_CONFIGURATION_TEST",
"platform": {
"applicationId": "webrtc-test-app"
},
"properties": {
"callLog": {
"callId": "bvmr1046nhcs2p47e9cg3po5l1e0nilcibbs6qher2r9100",
"endpoint": {
"phoneNumber": "818011111111",
"type": "PHONE"
},
"from": "818011111111",
"to": "815022222222",
"direction": "INBOUND",
"state": "CANCELLED",
"startTime": "2025-12-03T01:18:32.176Z",
"endTime": "2025-12-03T01:18:39.623Z",
"ringDuration": 0,
"callsConfigurationIds": [],
"platform": {
"applicationId": "webrtc-test-app"
},
"conferenceIds": [],
"duration": 0,
"hasCameraVideo": false,
"hasScreenshareVideo": false,
"errorCode": {
"id": 10202,
"name": "CANCELLED",
"description": "The user cancelled the call"
},
"customData": {},
"hangupSource": "ENDPOINT"
}
},
"type": "CALL_FAILED"
}本記事ではイベント通知情報から、通話のCallIdを利用します。
WebRTC SDKを利用したカンファレンスルームの作成
電話ユーザーとWebRTCユーザーのカンファレンス通話を実現させるため、カンファレンスルームを作成します。本章ではWebRTC SDKを用いてカンファレンスルームを作成し、WebRTCユーザーを入室させる処理までを実装します。
1.SDKのインポート
JavaScript プロジェクトに SDK を組み込みます。
NPMの依存関係として追加したい場合は、以下のコマンドを実行してください。
npm install infobip-rtc --saveまたは、CDN から配布ファイルを JavaScript に直接含めることもできます。
<script src="//rtc.cdn.infobip.com/2.7.0/infobip.rtc.js"></script>最新のタグも利用可能です。
<script src="//rtc.cdn.infobip.com/2/latest/infobip.rtc.js"></script>2.WebRTC トークンの発行
NTTCPaaS WebRTC プラットフォームに WebRTC クライアントを接続させるため、トークン生成 API にて接続トークンを発行します。なお、API の実行にはベースURLとAPIキーが必要になります。NTT CPaaS のポータルサイトよりご確認ください。
- 重要
- APIキーをフロントエンドにハードコードすると流出リスクがあります。トークン発行処理はバックエンドサーバー側で行い、クライアントへトークンのみを返却する構成を推奨します。
エンドポイント:POST /webrtc/1/token
curlサンプル:
curl -L -g -X POST 'https://{baseUrl}/webrtc/1/token' \
-H 'Authorization: {authorization}' \
-H 'Content-Type: application/json' \
-H 'Accept: application/json' \
-d '{
"identity": "Alice",
"displayName": "Alice in Wonderland",
"timeToLive": 43200
}'
APIパラメーター:
| 項目 | 型 | 必須 | 概要 |
|---|---|---|---|
| baseUrl | String | 〇 | NTT CPaaS のテナントごとに割り当てられた固有のサブドメイン。 (例)XXXXXX.ibapi.nttcpaas.com |
| authorization | String | 〇 | NTT CPaaS の API を利用する際の認証キー。 Authorization ヘッダーに付与し、下記のようにAPIキーを含む文字列を設定する必要があります。 (例)Authorization: App YOUR_API_KEY_HERE |
| identity | String | 〇 | NTTCPaaS WebRTC プラットフォーム上でWebRTCクライアントを表示するために使用される ID。一意である必要があります。「-」、「_」、「.」を含む Unicode 文字を 3 文字以上 64 文字以下で構成する必要があります。 |
| displayName | String | WebRTCクライアントに紐づく人間が読みやすい名称。一意である必要はありません。設定すると、識別されたユーザーと通信する他のすべてのユーザーに、IDとともに表示されます。5文字以上50文字以下である必要があります。 | |
| timeToLive | Int64 | トークンの有効期限が切れるまでの秒数。設定しない場合、トークンの有効期間は8時間です。最大値は24時間です。 |
成功すると下記のようなレスポンスが来ます。
- token:SDK で利用する WebRTC プラットフォーム接続のためのトークン
- expirationTime:トークンの有効期限
{
"token": "eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpZGVudGl0eSI6IkFsaWNlIiwibmFtZSI6IkFsaWNlIGluIFdvbmRlcmxhbmQiLCJleHAiOjE1NzkyOTA2MzgsImNhcHMiOlsyXX0.QyCMqjH8DsftChibW2Rw4EByH-eEviUp3-kHVKuJpKg",
"expirationTime": "2020-01-17T19:50:38.488589Z"
}3.WebRTC プラットフォームへの接続
先ほど取得したトークンを利用して InfobipRTC インスタンスを作成し、connect() により WebRTC プラットフォームに接続します。
let infobipRTC = createInfobipRtc(token);
infobipRTC.connect();もし WebRTC プラットフォームから切断する場合は、disconnect() を利用します。
infobipRTC.disconnect();4.カンファレンスルームの作成および入退室
WebRTCユーザーをConferenceルームへ入室させるには、joinRoom() を利用します。入室する場合はルーム名を指定します。下記ではルーム名を ”test_room” として利用しています。指定のルーム名を持つカンファレンスルームが存在しない場合、新しくカンファレンスルームが作成されます。
let infobipRTC = createInfobipRtc(token);
infobipRTC.connect();
let roomCall = infobipRTC.joinRoom('test_room', RoomCallOptions.builder().build());カンファレンスルームから退出する場合は、leave() を利用します。
roomCall.leave();5.通話イベントの設定
カンファレンス通話ではいくつかのイベントが用意されています。今回は自身のルーム入室時(ROOM_JOINED)とルーム退出時(ROOM_LEFT)、他の参加者のルーム入室時(PARTICIPANT_JOINED)とルーム退出時(PARTICIPANT_LEFT)のイベントを解説します。
- ROOM_JOINED
自身がルームに入室すると発火するイベントです。通話における受信音声メディアを表す MediaStream オブジェクトがイベントオブジェクトに受信されます。この MediaStream を HTML の audio 要素に紐づけることで通話先の音声を再生できます。その他のidとnameはそれぞれカンファレンスルームのIDとルーム名となります。
event = { id: string, name: string, participants: Participant[], stream: MediaStream } - ROOM_LEFT
自身がルームから退出すると発火するイベントです。受信したイベントオブジェクトには、通話が切断された理由の詳細を示す ErrorCode オブジェクトと、通話の音声統計の包括的な概要を提供する TotalMediaStats オブジェクトが含まれています。
event = { errorCode: ErrorCode, totalMediaStats: TotalMediaStats } - PARTICIPANT_JOINED
他の参加者がルームに入室すると発火するイベントです。participantには入室した参加者の情報が含まれています。
event = { participant: Participant } - PARTICIPANT_LEFT
他の参加者がルームから退出すると発火するイベントです。participantには退出した参加者の情報が含まれています。
event = { participant: Participant }
実装サンプルは以下の通りです。
なお、HTML 上には id に”callAudio”を持つ audio 要素が含まれる前提となります。
let roomCall = infobipRTC.joinRoom('test_room', RoomCallOptions.builder().build());
roomCall.on(CallsApiEvent.ROOM_JOINED, (event) => {
$('#callAudio').srcObject = event.stream;
});
roomCall.on(CallsApiEvent.ROOM_LEFT, (event) => {
console.log(`Call finished. Status: ${event.errorCode.name}`);
$('#callAudio').srcObject = null;
});
roomCall.on(CallsApiEvent.PARTICIPANT_JOINED, function (event) {
console.log(`${event.participant.endpoint.identifier} joined the room call.`);
});
roomCall.on(CallsApiEvent.PARTICIPANT_LEFT, function (event) {
console.log(`${event.participant.endpoint.identifier} left the room call.`);
});次章では作成したカンファレンスルームに電話ユーザーを入室させることで、WebRTCユーザーと電話ユーザーとの通話を実現させます。
電話から発信してカンファレンスルームに参加させる(インバウンド)
電話から特定の電話番号へ発信し、特定のカンファレンスルームへ入室させるためのフローです。電話をカンファレンスルームに入室させるために、下記の3つのCalls APIを利用します。
- 電話端末に発信音を再生させる
- 電話からの着信に応答する
- 電話をカンファレンスルームに入室させる
電話ユーザーが登録した電話番号へ発信することで、Webhook で通話受信イベント情報(事前準備「1.7 通話イベント確認」を参照)が通知されます。この情報のうち、通話者の識別IDとなる callId を利用します。
1.電話に発信音を再生させる
電話をかけただけでは電話端末側で無音状態となっているため、電話の発信音を再生させます。
エンドポイント:POST /calls/1/calls/{callId}/send-ringing
curlサンプル:
curl -L -g -X POST 'https://{baseUrl}/calls/1/calls/{callId}/send-ringing' \
-H 'Authorization: {authorization}' \
-H 'Content-Type: application/json' \
-H 'Accept: application/json'
APIパラメーター:
| 項目 | 型 | 必須 | 概要 |
|---|---|---|---|
| baseUrl | String | 〇 | NTT CPaaS のテナントごとに割り当てられた固有のサブドメイン。 (例)XXXXXX.ibapi.nttcpaas.com |
| authorization | String | 〇 | NTT CPaaS の API を利用する際の認証キー。 Authorization ヘッダーに付与し、下記のようにAPIキーを含む文字列を設定する必要があります。 (例)Authorization: App YOUR_API_KEY_HERE |
| callId | String | 〇 | 通話者の識別ID。 |
成功すると下記のようなレスポンスが来ます。
{
"status": "PENDING"
}2.電話からの着信に応答する
電話からの着信に応答します。これにより電話側では発信状態から通話状態に移行します。ただし、この時点ではカンファレンスルームに入室していないため、通話相手の音声が聞こえることはありません。
エンドポイント:POST /calls/1/calls/{callId}/answer
curlサンプル:
curl -L -g -X POST 'https://{baseUrl}/calls/1/calls/{callId}/answer' \
-H 'Authorization: {authorization}' \
-H 'Content-Type: application/json' \
-H 'Accept: application/json' \
-d '{
}'
APIパラメーター:
| 項目 | 型 | 必須 | 概要 |
|---|---|---|---|
| baseUrl | String | 〇 | NTT CPaaS のテナントごとに割り当てられた固有のサブドメイン。 (例)XXXXXX.ibapi.nttcpaas.com |
| authorization | String | 〇 | NTT CPaaS の API を利用する際の認証キー。 Authorization ヘッダーに付与し、下記のようにAPIキーを含む文字列を設定する必要があります。 (例)Authorization: App YOUR_API_KEY_HERE |
| callId | String | 〇 | 通話者の識別ID。 |
成功すると下記のようなレスポンスが来ます。
{
"status": "PENDING"
}参考:https://docs.nttcpaas.com/api/voice.html#tag/calls-operations/POST/calls/1/calls/{callId}/answer
3.電話をカンファレンスルームに入室させる
通話状態の電話を特定のカンファレンスルームへ入室させます。これには通話者の識別IDである Call IDに加え、入室させたいカンファレンスルームの Conference ID も必要になります。
エンドポイント:PUT /calls/1/conferences/{conferenceId}/call/{callId}
curlサンプル:
curl -L -g -X PUT 'https://{baseUrl}/calls/1/conferences/{conferenceId}/call' \
-H 'Authorization: {authorization}' \
-H 'Content-Type: application/json' \
-H 'Accept: application/json'
APIパラメーター:
| 項目 | 型 | 必須 | 概要 |
|---|---|---|---|
| baseUrl | String | 〇 | NTT CPaaS のテナントごとに割り当てられた固有のサブドメイン。 (例)XXXXXX.ibapi.nttcpaas.com |
| authorization | String | 〇 | NTT CPaaS の API を利用する際の認証キー。 Authorization ヘッダーに付与し、下記のようにAPIキーを含む文字列を設定する必要があります。 (例)Authorization: App YOUR_API_KEY_HERE |
| conferenceId | String | 〇 | カンファレンスルームの識別ID |
| callId | String | 〇 | 通話者の識別ID。 |
成功すると下記のようなレスポンスが来ます。
{
"id": "034e622a-cc7e-456d-8a10-0ba43b11aa5e",
"name": "test_room",
"participants": [
{
"callId": "string",
"endpoint": {
"phoneNumber": "818011111111",
"type": "PHONE"
},
"state": "JOINING",
"joinTime": "2019-08-24T14:15:22Z",
"leaveTime": "2019-08-24T14:15:22Z",
"media": {
"audio": {
"muted": true,
"userMuted": true,
"deaf": true
},
"video": {
"camera": true,
"screenShare": true,
"blind": true
}
},
"role": {
"type": "DEFAULT"
}
}
],
"callsConfigurationId": "dc5942707c704551a00cd2ea",
"platform": {
"entityId": "string",
"applicationId": "string"
}
}電話へ発信してカンファレンスルームに参加させる(アウトバウンド)
Calls API を用いて電話ユーザーの電話番号へ発信し、特定のカンファレンスルームへ入室させるためのフローです。電話をカンファレンスルームに入室させるために、下記のCalls APIを利用します。
1.電話をカンファレンスルームに入室させる
通話状態の電話を特定のカンファレンスルームへ入室させます。これには通話者の識別IDである Call IDに加え、入室させたいカンファレンスルームの Conference ID も必要になります。
エンドポイント:POST /calls/1/conferences/{conferenceId}/call
curlサンプル:
curl -L -g -X POST 'https://{baseUrl}/calls/1/conferences/{conferenceId}/call' \
-H 'Authorization: {authorization}' \
-H 'Content-Type: application/json' \
-H 'Accept: application/json' \
-d '{
'callRequest': {
'endpoint': {
'type': 'PHONE',
'phoneNumber': '{phoneNumber}'
},
'from': '{fromNumber}'
}
}'
APIパラメーター:
| 項目 | 型 | 必須 | 概要 |
|---|---|---|---|
| baseUrl | String | 〇 | NTT CPaaS のテナントごとに割り当てられた固有のサブドメイン。 (例)XXXXXX.ibapi.nttcpaas.com |
| authorization | String | 〇 | NTT CPaaS の API を利用する際の認証キー。 Authorization ヘッダーに付与し、下記のようにAPIキーを含む文字列を設定する必要があります。 (例)Authorization: App YOUR_API_KEY_HERE |
| conferenceId | String | 〇 | カンファレンスルームの識別ID |
| phoneNumber | String | 〇 | 電話をかける宛先の電話番号。E.164形式で取り扱う必要があります。 (例)080-1111-1111の場合、818011111111 ※先頭の「0」を「81(日本の国番号)」に変換する |
| fromNumber | String | 電話ユーザーに通知する発信元電話番号。E.164形式で取り扱う必要があります。 NTTCPaaSに登録した電話番号を設定することで、発信先の電話端末の画面上に設定した電話番号が表示されます。 設定しない場合、電話端末上で非通知設定として表示されます。 |
成功すると下記のようなレスポンスが来ます。
{
"conference": {
"id": "0c38b792-8949-4dd9-9a33-ce02014f7bd3",
"name": "test_room",
"participants": [
{
"callId": "2fbf5875-362d-4936-8a1b-11845384299d",
"endpoint": {
"type": "WEBRTC",
"identity": "webrtc-caller",
"displayName": "webrtc-user"
},
"state": "JOINED",
"joinTime": "2026-07-27T19:47:05.342+0000",
"media": {
"audio": {
"muted": false,
"userMuted": false,
"deaf": false
},
"video": {
"camera": false,
"screenShare": false,
"blind": false
}
},
"role": {
"type": "DEFAULT"
}
},
{
"callId": "b2cae37b-2833-48d8-aafc-c0ecc0decba7",
"endpoint": {
"type": "PHONE",
"phoneNumber": "818011111111"
},
"state": "JOINING",
"media": {
"audio": {
"muted": false,
"userMuted": false,
"deaf": false
},
"video": {
"camera": false,
"screenShare": false,
"blind": false
}
},
"role": {
"type": "DEFAULT"
}
}
],
"callsConfigurationId": "WEBRTC"
},
"call": {
"id": "b2cae37b-2833-48d8-aafc-c0ecc0decba7",
"endpoint": {
"type": "PHONE",
"phoneNumber": "818011111111"
},
"from": "815022222222",
"to": "818011111111",
"direction": "OUTBOUND",
"state": "CALLING",
"media": {
"audio": {
"muted": false,
"userMuted": false,
"deaf": false
},
"video": {
"camera": false,
"screenShare": false,
"blind": false
}
},
"startTime": "2026-07-27T19:47:29.325+0000",
"ringDuration": 0,
"callsConfigurationId": "WEBRTC"
}
}【付録】通話アプリのサンプルプログラム
【ご利用方法】
index.html と app.js を同じディレクトリに入れてご利用ください。また、本記事にて解説したCalls APIは下記のサンプルプログラムには含まれておりません。必要に応じてアプリに追加してください。
【動作確認環境】
・Windows 11
・Chrome:149.0.7827.197
・JavaScript SDK:2.7.36
JavaScript SDKの仕様の詳細はこちらをご参照ください。
index.html
<!DOCTYPE html>
<html lang="ja">
<head>
<meta charset="UTF-8">
<title>NTTCPaaS WebRTC</title>
<script src="//rtc.cdn.infobip.com/2.7.36/infobip.rtc.js"></script>
</head>
<body>
<div id="connect-field">
<p>WebRTCトークン</p>
<input type="text" id="token-input" placeholder="WebRTCトークンを入力" style="width: 300px;">
<button onclick="connectRTC()">接続</button>
</div>
<div id="call-field" style="display: none;">
<p>ルーム名</p>
<input type="text" id="room-name-input" placeholder="ルーム名を入力" style="width: 300px;">
<button id="start-call-btn" onclick="startCall()">発信</button>
<button id="end-call-btn" onclick="endCall()">通話終了</button>
<button id="end-call-btn" onclick="deleteLog()">ログ削除</button>
<div id="call-event-area"></div>
</div>
<audio id="audio-elm" playsinline autoplay loop muted></audio>
<script src="./app.js"></script>
</body>
</html>app.js
let infobipRTC = null;
let activeCall = null;
const connectField = document.getElementById('connect-field');
const callField = document.getElementById('call-field');
const startCallBtn = document.getElementById('start-call-btn');
const endCallBtn = document.getElementById('end-call-btn');
const roomNameInput = document.getElementById("room-name-input");
const callEventArea = document.getElementById('call-event-area');
const audioElm = document.getElementById("audio-elm");
// アプリの初期化
async function connectRTC(){
// マイク権限取得
try {
await navigator.mediaDevices.getUserMedia({ audio: true });
} catch (e) {
return;
}
audioElm.muted = false;
// SDKの初期化と接続
const token = document.getElementById('token-input').value;
if (!token) return;
infobipRTC = createInfobipRtc(token);
infobipRTC.connect();
infobipRTC.on('connected', (e) => {
connectField.querySelectorAll('input, button').forEach(element => {
element.disabled = true;
});
callField.style.display = "block";
});
}
// 電話に発信
function startCall() {
if(activeCall || !roomNameInput.value) return;
activeCall = infobipRTC.joinRoom(roomNameInput.value, RoomCallOptions.builder().build());
setupCall(activeCall);
}
// 通話を終了
function endCall() {
if (!activeCall) return;
activeCall.leave();
resetCallState();
}
// 通話開始時の共通処理
function setupCall(call) {
// UIを「通話中」の状態にする(ボタンや入力を無効化)
startCallBtn.disabled = true;
roomNameInput.disabled = true;
// ルーム入室時のイベント
call.on(CallsApiEvent.ROOM_JOINED, (e) => {
console.log(call);
audioElm.srcObject = e.stream;
logCallEvent(`ルーム「${roomNameInput.value}」に参加しました。`);
logCallEvent(`ConferenceID: ${e.id}`);
});
// ルーム退出時のイベント
call.on(CallsApiEvent.ROOM_LEFT, (e) => {
resetCallState();
logCallEvent(`ルーム「${roomNameInput.value}」を退出しました。`);
});
// 他の参加者のルーム入室時のイベント
call.on(CallsApiEvent.PARTICIPANT_JOINED, (e) => {
const endpoint = e.participant.endpoint;
const endpointName = endpoint.identifier || endpoint.phoneNumber || '匿名ユーザー';
logCallEvent(`${endpointName} が参加しました。`);
});
// 他の参加者のルーム退出時のイベント
call.on(CallsApiEvent.PARTICIPANT_LEFT, (e) => {
const endpoint = e.participant.endpoint;
const endpointName = endpoint.identifier || endpoint.phoneNumber || '匿名ユーザー';
logCallEvent(`${endpointName} が退出しました。`);
});
}
// 通話終了時の状態リセット処理
function resetCallState() {
activeCall = null;
startCallBtn.disabled = false;
roomNameInput.disabled = false;
audioElm.srcObject = null;
}
// 通話ログを記録
function logCallEvent(message) {
if (!callEventArea) return;
const timestamp = new Date().toLocaleTimeString();
const p = document.createElement('p');
p.style.margin = '4px 0';
p.textContent = `[${timestamp}] ${message}`;
callEventArea.appendChild(p);
}
// 通話ログをリセット
function deleteLog(){
if (!callEventArea) return;
callEventArea.innerHTML = '';
}
NTT CPaaSを、
60日間無料でお試しください
・SMS・Voice・メールを本番同様に無料で検証
・全API機能に即日アクセス / 有料プランと同一環境
・国内開発者向けに最適化された日本語ガイド
2026.08.31