次の方法で共有


ブレークアウト ルーム

この記事では、Azure Communication Services を使用して Microsoft Teams のブレークアウト ルームを実装する方法について説明します。 この機能により、Teams 会議の Azure Communication Services ユーザーはブレークアウト ルームに参加できます。 Teams 管理者は、Teams 会議ポリシーを使用して Teams 会議でブレークアウト ルームを誰がどのように利用できるかを制御します。 ブレークアウト ルームに関する追加情報については、Teams のドキュメントを参照してください。

前提条件

ブレークアウト ルームを管理できるのは、会議の開催者、共同開催者、またはブレークアウト ルーム マネージャーのロールを持つ Microsoft 365 ユーザーのみです。

サポート

次の表では、Azure Communication Services でのブレークアウト ルームのサポートを定義します。

ID と通話の種類

次の表は、特定のコールの種類と ID に対するブレークアウト ルームのサポートを示しています。

ID Teams 会議 ルーム 1 対 1 の通話 グループ通話 1:1 Teams 相互運用機能通話 グループ チームの相互運用機能通話
Communication Services ユーザー ✔️
Microsoft 365 ユーザー ✔️

操作

次の表は、個々の ID の種類に関連する Calling SDK における個々の API のサポートを示しています。

操作 Communication Services ユーザー Microsoft 365 ユーザー
割り当てられたブレークアウト ルームを取得する ✔️ ✔️
すべてのブレークアウト ルームを取得する ✔️[1]
ブレークアウト ルームに参加する ✔️ ✔️
ブレイクアウト ルームを管理する
ブレークアウト ルーム チャットに参加する ✔️[2]
ブレークアウト ルームの設定を取得する ✔️ ✔️

[1] 会議の開催者、共同開催者、またはブレークアウト ルーム マネージャーのロールを持つ Microsoft 365 ユーザーのみ。

[2] Microsoft 365 ユーザーは Graph API を使用してブレークアウト ルーム チャットに参加できます。 チャットのスレッド ID は、割り当てられたブレークアウト ルーム オブジェクトで提供されます。

SDK

次の表は、個々の Azure Communication Services SDK でのブレークアウト ルーム機能のサポートを示しています。

サポートの状態 Web Web UI iOS iOS UI Android Android UI Windows
サポートの有無 ✔️

SDK のインストール

npm install コマンドを使用して、JavaScript 用の Azure Communication Services の Common SDK と Calling SDK をインストールします。

npm install @azure/communication-common --save
npm install @azure/communication-calling --save

必要なオブジェクトを初期化する

CallClient インスタンスは、ほとんどの通話操作に必要です。 新しい CallClient インスタンスを作成する際に、Logger インスタンスなどのカスタム オプションを使用してこれを構成できます。

CallClient インスタンスでは、createCallAgent を呼び出すことで CallAgent インスタンスを作成できます。 このメソッドでは、非同期的に CallAgent インスタンス オブジェクトが返されます。

createCallAgent メソッドでは、CommunicationTokenCredential が引数として使用されます。 これは、ユーザー アクセス トークンを受け取ります。

CallClient インスタンスで getDeviceManager メソッドを使用して、deviceManager にアクセスできます。

const { CallClient } = require('@azure/communication-calling');
const { AzureCommunicationTokenCredential} = require('@azure/communication-common');
const { AzureLogger, setLogLevel } = require("@azure/logger");

// Set the logger's log level
setLogLevel('verbose');

// Redirect log output to console, file, buffer, REST API, or whatever location you want
AzureLogger.log = (...args) => {
    console.log(...args); // Redirect log output to console
};

const userToken = '<USER_TOKEN>';
callClient = new CallClient(options);
const tokenCredential = new AzureCommunicationTokenCredential(userToken);
const callAgent = await callClient.createCallAgent(tokenCredential, {displayName: 'optional Azure Communication Services user name'});
const deviceManager = await callClient.getDeviceManager()

Microsoft インフラストラクチャへの SDK 接続を最適に管理する方法

Call Agent インスタンスは、(呼び出しを結合または開始するために) 呼び出しを管理するのに役立ちます。 呼び出しの SDK を機能させるには、Microsoft インフラストラクチャに接続して着信呼び出しの通知を取得し、他の呼び出しの詳細を調整する必要があります。 Call Agent には、次の 2 つの状態があります。

接続済み - ConnectedCall Agent connectionStatue 値は、クライアント SDK が接続されており、Microsoft インフラストラクチャから通知を受信できることを意味します。

切断済み - DisconnectedCall Agent connectionStatue 値は、SDK の正常な接続を妨げる問題があることを示します。 Call Agent を再作成する必要があります。

  • invalidToken: トークンが有効期限切れであるか、無効な場合、Call Agent インスタンスがこのエラーで切断されます。
  • connectionIssue: クライアントの Microsoft インフラストラクチャへの接続で問題が発生した場合、何度も再試行した後に、Call AgentconnectionIssue エラーを提示します。

connectionState プロパティの現在の値を調べて、ローカル Call Agent が Microsoft インフラストラクチャに接続されているかどうかを確認できます。 アクティブな呼び出し中に、connectionStateChanged イベントをリッスンして、Call Agent の状態が接続済みから切断済みに変化したかどうかを判断できます。

const connectionState = callAgentInstance.connectionState;
console.log(connectionState); // it may return either of 'Connected' | 'Disconnected'

const connectionStateCallback = (args) => {
    console.log(args); // it will return an object with oldState and newState, each of having a value of either of 'Connected' | 'Disconnected'
    // it will also return reason, either of 'invalidToken' | 'connectionIssue'
}
callAgentInstance.on('connectionStateChanged', connectionStateCallback);

ブレークアウト ルームを実装する

BreakoutRooms はクラス Callfeature です。 まず、Calling SDK からパッケージ Features をインポートする必要があります。

import { Features} from "@azure/communication-calling";

breakoutRoom 機能を作成する

その後、呼び出しインスタンスからその機能 API オブジェクトを取得します。

const breakoutRoomsFeature = mainMeetingCall.feature(Features.BreakoutRooms);

breakoutRoom イベントをサブスクライブする

BreakoutRooms API を使用すると、BreakoutRooms イベントにサブスクライブできます。 breakoutRoomsUpdated イベントは、BreakoutRoomsCallFeature インスタンスから取得します。これには、作成、更新、割り当てられたブレークアウト ルームに関する情報が含まれます。

ブレークアウト ルームの詳細を受信するには、breakoutRoomsUpdated イベントをサブスクライブします。

breakoutRoomsFeature.on('breakoutRoomsUpdated', breakoutRoomsUpdatedListener);

breakoutRoom イベントを処理する

イベント breakoutRoomsUpdated は、次のいずれかのクラスのインスタンスを入力パラメーターとして提供します。 プロパティ type を使用して、個々のイベントの種類を区別できます。

  • クラス BreakoutRoomsEvent: このイベントは、会議の開催者、共同開催者、またはブレークアウト ルーム マネージャーのロールを持つユーザーがブレークアウト ルームを作成または更新したときにトリガーされます。 会議の開催者、共同開催者、またはブレークアウト ルーム マネージャーのロールを持つ Microsoft 365 ユーザーは、この種類のイベントを受信できます。 開発者は、プロパティ data のブレークアウト ルームを使用して、すべてのブレークアウト ルームに関する詳細をレンダリングできます。 このクラスには、"breakoutRooms" と等しいプロパティ type があります。

      export interface BreakoutRoomsEvent {
        /**
         * Breakout room event type
        */
        type: "breakoutRooms",
        /**
         * list of Breakout rooms
        */
        data: BreakoutRoom[] | undefined;
      }
    
  • クラス BreakoutRoomsSettingsEvent: 会議の開催者、共同開催者、またはブレークアウト ルーム マネージャーのロールを持つユーザーがブレークアウト ルームの設定を更新したときに、このイベントがトリガーされます。 開発者はこの情報を使用して、ブレークアウト ルームが終了する時刻を表示したり、メイン ルームに参加するためのボタンを表示するかどうかを決定したりできます。 このクラスには、"breakoutRoomSettings" と等しいプロパティ type があります。

      export interface BreakoutRoomSettingsEvent {
        /**
        * Breakout room event type
        */
        type: "breakoutRoomSettings",
        /**
        * Breakout Room setting details
        */
        data: BreakoutRoomSettings | undefined;
      }
    
  • クラス AssignedBreakoutRoomsEvent: このイベントは、ユーザーがブレークアウト ルームに割り当てられた場合、または割り当てられたブレークアウト ルームが更新されたときにトリガーされます。 ユーザーは、プロパティ stateopen に設定されているときにブレークアウト ルームに参加したり、プロパティ stateclosed に設定されているときにブレークアウト ルームから退室したり、ブレークアウト ルームの詳細を表示したりできます。 このクラスには、"assignedBreakoutRoom" と等しいプロパティ type があります。

      export interface AssignedBreakoutRoomEvent {
        /**
         * Breakout room event type
         */
        type: "assignedBreakoutRoom";
        /**
         * Assigned breakout room details
         */
        data: BreakoutRoom | undefined;
      }
    
  • クラス JoinBreakoutRoomsEvent: このイベントは、参加者がブレークアウト ルーム コールに参加しているときにトリガーされます。 このイベントは、ユーザーがブレークアウト ルームに自動的に移動された場合 (つまり、assignedBreakoutRoom のプロパティ stateopen に設定されていて、autoMoveParticipantToBreakoutRoomtrue に設定されている場合)、またはユーザーがブレークアウト ルームに明示的に参加したとき (つまり、autoMoveParticipantToBreakoutRoomfalse に設定されているときにインスタンス assignedBreakoutRoom のメソッド join を呼び出す) ときに発生します。 プロパティ data には、開発者がブレークアウト ルーム コールを制御するために使用できるブレークアウト ルーム call インスタンスが含まれています。 このクラスには、"join" と等しいプロパティ type があります。

      export interface JoinBreakoutRoomEvent {
        /**
         * Breakout room event type
         */
        type: "join";
        /**
         * Breakoutroom call object
         */
        data: Call | TeamsCall;
      }
    

次のコードは、ブレークアウト ルーム イベントで受け取った重要な情報が示されています。

    const breakoutRoomsUpdatedListener = (event) => {
    switch(event.type) {
        case "breakoutRooms":
          const breakoutRooms = event.data;
          console.log(`Breakout rooms are created or updated. There are ${breakoutRooms.length} breakout rooms in total.`);
          breakoutRooms.forEach((room)=>{
          console.log(`- ${room.displayName}`);
          });    
          break;
        case "assignedBreakoutRooms":
          const assignedRoom = event.data;
          console.log(`You are assigned to breakout room named: ${assignedRoom.displayName}`);      
          console.log(`Assigned breakout room thread Id: ${assignedRoom.threadId}`);
          console.log(`Automatically move participants to breakout room: ${assignedRoom.autoMoveParticipantToBreakoutRoom}`);
          console.log(`Assigned breakout room state : ${assignedRoom.state }`);      
          break;
        case "breakoutRoomsSettings":
          const breakoutRoomSettings = event.data;
          console.log(`Breakout room ends at: ${breakoutRoomSettings.roomEndTime}`);          
          console.log(`Disable the user to return to main meeting from breakout room call : ${breakoutRoomSettings.disableReturnToMainMeeting}`);         
          break;
        case "join":
          const breakoutRoomCall = event.data;
          console.log(`You have joined breakout room with call ID: ${breakoutRoomCall.id}`);      
          break;      
      }
    }
breakoutRoomsFeature.on('breakoutRoomsUpdated', breakoutRoomsUpdatedListener);

利用可能なブレークアウト ルームを一覧表示する

会議の開催者、共同開催者、またはブレークアウト ルーム マネージャーのロールを持つ Microsoft 365 ユーザーは、すべてのブレークアウト ルームにアクセスできます。

const breakoutRooms = breakoutRoomsFeature.breakoutRooms;
breakoutRooms.forEach((room)=>{
      console.log(`- ${room.displayName}`);
       }); 

招待者を一覧表示する

会議の開催者、共同開催者、またはブレークアウト ルーム マネージャーのロールを持つ Microsoft 365 ユーザーは、個々のブレークアウト ルームに割り当てられた参加者を管理できます。

breakoutRooms.forEach((room)=>{
      console.log(`${room.displayName}`);
      room.invitees.forEach((invitee) => {
          console.log(`- ${invitee.id}`);         
          })
      })

ブレークアウト ルームに参加する

assignedBreakoutRoom のプロパティ autoMoveParticipantToBreakoutRoomtrue に設定されているときに、プロパティ stateopen に設定されると、ユーザーは自動的にブレークアウト ルームに移動されます。 autoMoveParticipantToBreakoutRoomfalse に設定されている場合は、次のコードを使用してブレークアウト ルームに参加します。

これにより、プロパティ typejoin として設定されたクラス JoinBreakoutRoomsEventbreakoutRoomsUpdated イベントがトリガーされます。 プロパティ data 内のクラス call のインスタンスを使用して、ブレークアウト ルーム コールを管理できます。

const breakoutRoom = breakoutRoomsFeature.assignedBreakoutRoom;
if(breakoutRoom.state == 'open' && !breakoutRoom.autoMoveParticipantToBreakoutRoom) {
  const breakoutRoomCall = await breakoutRoom.join();
}

ユーザーがブレークアウト ルームにいて、会議の開催者が新しいブレークアウト ルームをユーザーに割り当てると、ユーザーは assignedBreakoutRooms の種類 breakoutRoomsUpdated イベントを受け取ります。 このイベントには、最新のブレークアウト ルームの詳細が含まれています。 ユーザーは、前のブレークアウト ルーム呼び出しを hangUp() する必要があります。 autoMoveParticipantToBreakoutRoomtrue に設定されている場合、ユーザーは自動的に移動されます。それ以外の場合、ユーザーは新しいブレークアウト ルームで join メソッドを明示的に呼び出す必要があります。

//Breakout room which is assigned initially.
const breakoutRoom = breakoutRoomsFeature.assignedBreakoutRoom;
if(breakoutRoom.state == 'open' && !breakoutRoom.autoMoveParticipantToBreakoutRoom) {
  const breakoutRoomCall = await breakoutRoom.join();
}

// `breakoutRoomsUpdated` event which contains the details of the new breakout room
let assignedRoom = undefined;
const breakoutRoomsUpdatedListener = (event) => {
     switch(event.type) {
          case "assignedBreakoutRooms":
          const assignedRoom = event.data;
          break;
     }
}

if(assignedRoom.threadId != breakoutRoom.threadId && breakoutRooms != null)
{
    await breakoutRoom.hangUp();
}
if(assignedRoom.state == 'open' && !assignedRoom.autoMoveParticipantToBreakoutRoom) {
  const breakoutRoomCall = await assignedRoom.join();
}

会議の開催者、共同開催者、またはブレークアウト ルーム マネージャーのロールを持つ Microsoft 365 ユーザーは、ブレークアウト ルーム マネージャーまたはメイン会議の開催者によって作成されたブレークアウト ルームの一覧を取得します。 この場合、この動作が若干異なります。 このユーザーは、ブレークアウト ルームに参加するために、join() メソッドを明示的に呼び出す必要があります。 ユーザーは最初はメイン会議で保留中になり、最終的にはメイン会議から削除されます。 ユーザーは、ブレークアウト ルームで更新プログラムを受け取るために、breakoutRoomCall の breakoutRooms 機能を初期化する必要があります。

ユーザーがブレークアウト ルームのいずれかに参加する場合、ユーザーは明示的に join メソッドを呼び出します。

const breakoutRoom = breakoutRoomsFeature.breakoutRooms[0];
if(breakoutRoom.state == 'open') {
  const breakoutRoomCall = await breakoutRoom.join();
}

ブレークアウト ルームを終了するには、ユーザーはブレークアウト ルーム呼び出しで hangUp() 関数を実行する必要があります。 ユーザーは、メイン会議の通話を再開するために ReturnToMainMeeting を呼び出します。

breakoutRoomCall.hangUp();
const mainMeetingCall = breakoutRoomCall.returnToMainMeeting();

ブレークアウト ルームから退出する

ブレークアウト ルームの状態が closed の場合、ユーザーはクラス AssignedBreakoutRoomsEvent を持つイベント breakoutRoomsUpdated や、assignedBreakoutRoom のプロパティ stateclosed に設定されたことを示す assignedBreakoutRooms と等しいプロパティ type を受け取ることで、ブレークアウト ルームの終了について通知されます。 ユーザーはブレークアウト ルームを自動的に退出し、上に示すように returnToMainMeeting() を呼び出すことでメイン会議に戻ることができます。

ユーザーがルームを閉じる前にブレークアウト ルームから退出するときに、ブレークアウト ルームの設定 breakoutRoomsFeature.breakoutRoomsSettings のプロパティ disableReturnToMainMeetingfalse に設定されている場合、ユーザーは次のコードを使用してメイン会議の通話に戻れます。

breakoutRoomCall.hangUp();
const mainMeetingCall = breakoutRoomCall.returnToMainMeeting();

ブレークアウト ルームの参加者を取得する

ブレークアウト ルームに参加しているときに、次のコードを使用して、ブレークアウト ルームのリモート参加者の一覧を取得できます。

const breakoutRoomParticipants = [breakoutRoomCall.remoteParticipants.values()].map((p: SDK.RemoteParticipant) => { p.displayName || p.identifier });
console.log(`Participants of the breakoutRoom : <br/>" + breakoutRoomParticipants.join("<br/>")`);

ブレークアウト ルーム イベントの受信を停止する

breakoutRooms イベントの受信を停止するには、次のコードを使用します。

breakoutRoomsFeature.off('breakoutRoomsUpdated', breakoutRoomsUpdatedListener);

ブレークアウト ルームのプロパティ

ブレークアウト ルームには次のプロパティがあります。

Note

次のサンプル コードは、すべてのブレークアウト ルーム プロパティを効率的に表示します。 表示されたとおりに再利用するためのものではありません。 実際には、ブレイクアウト ルームのシナリオに必要なプロパティのみを使用します。

const displayName : string = breakoutRoom.displayName;
const threadId : string = breakoutRoom.threadId;
const state : BreakoutRoomState = breakoutRoom.state;
const autoMoveParticipantToBreakoutRoom : boolean = breakoutRoom.autoMoveParticipantToBreakoutRoom; 
const call : Call | TeamsCall = breakoutRoom.call;
const invitees : Invitee[] = breakoutRoom.invitees;
ブレークアウト ルームのプロパティ 説明
displayName ブレークアウト ルームの名前。 このプロパティは読み取り専用です。
threadId チャット スレッド ID を使用して、ブレークアウト ルームのチャットに参加します。 このプロパティは読み取り専用です。
state ブレークアウト ルームの状態。 これは openclosed のいずれかにできます。 ユーザーは、状態が open の場合にのみブレークアウト ルームに参加できます。 このプロパティは読み取り専用です。
autoMoveParticipantToBreakoutRoom assignedBreakoutRoomstateopen に設定されているときに、ユーザーがブレークアウト ルームに自動的に移動されるかどうかを示すブール値。 このプロパティは読み取り専用です。 ブレークアウト ルームの Teams UI 設定では、開催者、共同開催者、またはブレークアウト ルーム マネージャーがこの特定の設定を調整できます。 このオプションを true に設定すると、参加者は自動的に指定されたブレイクアウト ルームに転送されます。 逆に、このプロパティを false に設定する場合は、join メソッドを手動で呼び出して参加者をブレークアウト ルームに移動させる必要があります。
call ブレークアウト ルーム コールのオブジェクト。 このオブジェクトは、ユーザーがブレークアウト ルーム コールに自動的に参加したとき、または assignedBreakoutRoom オブジェクトで join メソッドを呼び出すことによって返されます。 このプロパティは読み取り専用です。
invitees ブレークアウト ルームに割り当てられている招待者の一覧。 このプロパティは読み取り専用です。

ブレークアウト ルームの設定

ブレークアウト ルームは、次のプロパティを持つ設定を共有します。

const disableReturnToMainMeeting : boolean = breakoutRoomsSettings.disableReturnToMainMeeting;
const roomEndTime : TimestampInfo = breakoutRoomsSettings.roomEndTime;
ブレークアウト ルームのプロパティ 説明
disableReturnToMainMeeting 参加者がブレークアウト ルーム コールからメイン会議に戻れないようにします。 このプロパティは読み取り専用です。 ブレークアウト ルームの Teams UI 設定では、開催者、共同開催者、またはブレークアウト ルーム マネージャーは、この特定の設定を調整して、ブレークアウト ルームの参加者がメイン会議に戻ることができるタイミングを制御できます。
roomEndTime 会議の開催者、共同開催者、またはメイン会議のブレークアウト ルーム マネージャーのロールを持つ Microsoft 365 ユーザーによって設定されたブレークアウト ルームの終了時間。 このプロパティは読み取り専用です。

トラブルシューティング

エラー コード サブコード 結果カテゴリ 理由 解決方法
400 46250 ExpectedError ブレークアウト ルーム機能は、Teams 会議でのみ使用できます。 独自のブレークアウト ルーム メカニズムを実装するか、Teams 会議を使用します。
405 46251 ExpectedError Azure Communication Services では、この機能は現在使用できません。 数日後に API を試してください。
500 46254 UnexpectedServerError 予期しないエラーが発生したため、ブレークアウト ルームに参加できません。 assignedBreakoutRoomstateopen で、breakoutRoomsFeature.assignedBreakoutRoom.join() メソッドが明示的に呼び出されることを確認してください。 問題が解決しない場合は、ブラウザー コンソール ログを収集し、Azure Communication Services サポートにお問い合わせください。
500 46255 UnexpectedServerError メイン会議を開催できません。 assignedBreakoutRoomstateopen で、breakoutRoomsFeature.assignedBreakoutRoom.join() メソッドが明示的に呼び出されることを確認してください。 問題が解決しない場合は、ブラウザー コンソール ログを収集し、Azure Communication Services サポートにお問い合わせください。
412 46256 ExpectedError ルームが終了したため、ブレークアウトルームに参加できません。 assignedBreakoutRoomstateopen で、breakoutRoomsFeature.assignedBreakoutRoom.join() メソッドが明示的に呼び出されることを確認してください。
412 46257 UnexpectedServerError メイン会議を再開できません。 ブレークアウト ルームから手動で退出する場合は、セクション Leave breakout room で定義されている手順に従います。 問題が解決しない場合は、ブラウザー コンソール ログを収集し、Azure Communication Services サポートにお問い合わせください。
412 46258 UnexpectedClientError ブレークアウト ルームの詳細を読み取ることができません。 ブラウザー コンソール ログを収集し、Azure Communication Services サポートにお問い合わせください。
500 46259 UnexpectedServerError ブレークアウト ルーム コールを切断できませんでした。 ブレークアウト ルームから手動で退出する場合は、セクション Leave breakout room で定義されている手順に従います。
412 46260 UnexpectedClientError ブレークアウト ルームはまだ割り当てられていないため、参加できません。 割り当てられたブレークアウト ルームの詳細が breakoutRoomsFeature.assignedBreakoutRoom にあることを確認してください。 assignedBreakoutRoomstateopen で、breakoutRoomsFeature.assignedBreakoutRoom.join() メソッドが明示的に呼び出されることを確認してください。
412 46261 UnexpectedClientError メイン会議に参加できません。 breakoutRoomsFeature.assignedBreakoutRoom.returnToMainMeeting() メソッドを呼び出して、もう一度やり直してください。 問題が解決しない場合は、ブラウザー コンソール ログを収集し、Azure Communication Services サポートにお問い合わせください。
412 46262 ExpectedError メイン会議に既に含まれています。 このメソッドは、参加者がブレークアウト ルームにいてメイン会議から削除された場合にのみ呼び出してください。
412 46263 UnexpectedClientError 既存のブレークアウト ルームの通話の切断に失敗しました。 もう一度 hangup() メソッドを呼び出して、呼び出しを切断してみてください。 join() メソッドを呼び出して、ブレークアウト ルームにもう一度参加します。

次のステップ