tencent cloud

Game Multimedia Engine

製品アップデート情報
製品紹介
製品概要
優位性のある特徴
製品機能
ユースケース
セキュリティコンプライアンス認証
初心者ガイド
SDKダウンロードガイド
製品機能体験
基本機能Demo
シーン化体験
コンソールガイド
使用量の表示
サービスの有効化
クイックスタート
Quick Integration of SDK
Quick Integration of Sample Project
基本機能開発ガイド
Authentication Key
リアルタイム音声ロール設定
音質設定
拡張機能開発ガイド
サーバー側のレコーディング
レンジボイス
3Dサウンド
効果音と伴奏
ネットワークオーディオストリーム転送ルーティング
カスタムメッセージチャネル
社内ファイアーフォール制限への対応について
Language Parameter Reference List
GMEルーム管理機能の導入
クライアントAPI
SDK for Unity
SDK for Unreal Engine
Cocos2D SDK
SDK for Windows
SDK for iOS
SDK for Android
SDK for macOS
H5 SDK
Electron SDK
SDK for Flutter
SDK Version Upgrade Guide
エラーコード
Toolchain
Server APIs
History
Introduction
API Category
Usage APIs
Recording APIs
Making API Requests
Voice Chat APIs
Application APIs
Data Types
Error Codes
よくある質問
製品機能質問
問題解決ガイド
課金について
Sample Projectの使用上の問題
一般的な質問
認証について
リアルタイム音声ルーム参加失敗について
リアルタイム音声利用時に音声が聞こえない問題とオーディオ関連について
ネットワークについて
ボイス・ツー・テキスト変換について
プロジェクトエクスポートについて
Service Agreement
Service Level Agreement
お問い合わせ
用語集
GME ポリシー
データ処理とセキュリティ契約
プライバシーポリシー

GMEルーム管理機能の導入

PDF
フォーカスモード
フォントサイズ
最終更新日: 2024-01-18 15:47:47
ご注意:
GME 3.xバージョンは現在、ルーム管理機能をサポートしていません。
ここでは、開発者がルーム管理サービスに素早くアクセスできるように、ルーム管理サービスのユースケースとアクセスの流れについて紹介します。

機能の説明

クライアントルーム管理インターフェースにより、ルームメンバーの管理、ルームメンバーのマイクのオン・オフ管理を簡単に実現することができます。

シナリオ

例えば、人狼ゲームのシナリオでは、ホストとしてEnableMicで他のプレイヤーのマイクオンをコントロールできます。あるプレイヤーが「死亡」し、ルームの音声を聞いたりマイクを操作して話す必要がない場合、ForbidUserOperationインターフェースを介してそのプレイヤーのデバイス操作を禁止します。

前提条件

リアルタイム音声サービスが有効になっていること音声サービス有効化ガイドをご参照ください。
GME SDK導入済み:コアインターフェースとリアルタイム音声インターフェースの導入を含みます。詳細については、Native SDKクイックスタートUnity SDKクイックスタートUnreal SDKクイックスタートをご参照ください。
説明:
この機能はH5 SDKではサポートされていません。

導入プロセス

クラス名:ITMGRoomManager

GMEルーム管理機能は、ルームに入ってから呼び出し、ルーム内のメンバーの状態のみを変更できます。 すべてのインターフェースの結果はITMG_MAIN_EVNET_TYPE_ROOM_MANAGEMENT_OPERATORによってコールバックされます。コールバックの詳細については、コールバック処理をご参照ください。

インターフェースリスト

タイプ
インターフェース
収集制御
EnableMic、EnableAudioCaptureDevice、EnableAudioSend
再生制御
EnableSpeaker、EnableAudioPlayDevice、EnableAudioRecv
機器状態の取得
GetMicState、GetSpeakerState
敏感なインターフェース
ForbidUserOperation

収集管理の関連インターフェース

収集管理インターフェースには、マイク管理オーディオアップリンク管理および収集ハードウェアデバイス管理が含まれます。その中で、マイク管理は、オーディオアップリンク管理と収集ハードウェアデバイス管理に相当します。

収集管理

このインターフェースを呼び出して、ルームにいるユーザーのマイクをオンまたはオフにします。呼び出しが成功すると、そのユーザーのマイクはオフまたはオンになります。
EnableMicはEnableAudioSendとEnableAudioCaptureDeviceを同時に呼び出すことに相当します。

関数のプロトタイプ

Android
iOS
public abstract int EnableMic(boolean isEnabled,String receiverID);
-(QAVResult)EnableMic:(BOOL)enable Receiver:(NSString *)receiverID;
パラメータ
タイプ
意味
enable
BOOL
YES:特定のユーザーのマイクをオンにします。NO:特定のユーザーのマイクをオフにします
receiverID
NSString*
ターゲットユーザーOpenIdを入力します

コールバック

コールバックパラメータはITMG_ROOM_MANAGEMENT_MIC_OP。

オーディオストリーム送信管理

このインターフェースを呼び出して、ルーム内のユーザーのオーディオ上りをオンまたはオフにします。呼び出しが成功すると、そのユーザーのオーディオ上りはオフまたはオンになりますが、マイクの収集には影響しません。

関数のプロトタイプ

Android
iOS
public abstract int EnableAudioSend(boolean isEnabled,String receiverID);
-(QAVResult)EnableAudioSend:(BOOL)enable Receiver:(NSString *)receiverID;
パラメータ
タイプ
意味
enable
BOOL
YES:特定のユーザーのアップリンクをオンにします。NO:特定のユーザーのアップリンクをオフにします
receiverID
NSString*
ターゲットユーザーOpenIdを入力します

コールバック

コールバックパラメータはITMG_ROOM_MANAGEMENT_AUDIO_SEND_OP。

オーディオ収集ハードウェア管理

このインターフェースを呼び出して、ルーム内のユーザーのオーディオ収集ハードウェアデバイスをオンまたはオフにします。呼び出しが成功すると、そのユーザーのオーディオ収集ハードウェアデバイスはオフまたはオンになりますが、上りには影響しません。

関数のプロトタイプ

Android
iOS
public abstract int EnableAudioCaptureDevice(boolean isEnabled,String receiverID);
-(QAVResult)EnableAudioCaptureDevice:(BOOL)enabled Receiver:(NSString *)receiverID;
パラメータ
タイプ
意味
enable
BOOL
YES:特定のユーザーのオーディオ収集ハードウェアデバイスをオンにします。NO:特定のユーザーのオーディオ収集ハードウェアデバイスをオフにします
receiverID
NSString*
ターゲットユーザーOpenIdを入力します

コールバック

コールバックパラメータはITMG_ROOM_MANAGEMENT_CAPTURE_OP。

再生管理の関連インターフェース

再生管理インターフェイスには、スピーカー管理オーディオダウンストリーム管理および再生ハードウェアデバイス管理が含まれます。その中で、スピーカー管理は、オーディオダウンリンク管理と再生ハードウェアデバイス管理に相当します。

再生管理

このインターフェースを呼び出して、ルーム内のユーザーのスピーカーをオンまたはオフにします。呼び出しが成功すると、そのユーザーのスピーカーがオフまたはオンになり、室内のオーディオ音が聞こえるようになります。 EnableSpeakerはEnableAudioRecvとEnableAudioPlayDeviceを同時に呼び出すことに相当します。

関数のプロトタイプ

Android
iOS
public abstract int EnableSpeaker(boolean isEnabled,String receiverID);
-(QAVResult)EnableSpeaker:(BOOL)enable Receiver:(NSString *)receiverID;
パラメータ
タイプ
意味
enable
BOOL
YES:特定のユーザーのスピーカーをオンにします。NO:特定のユーザーのスピーカーをオフにします
receiverID
NSString*
ターゲットユーザーOpenIdを入力します

コールバック

コールバックパラメータはITMG_ROOM_MANAGEMENT_SPEAKER_OP。

オーディオストリーム受信管理

このインターフェースを呼び出して、ルーム内のユーザーのオーディオ下りをオンまたはオフにします。呼び出しが成功すると、そのユーザーのオーディオ下りはオフまたはオンになりますが、再生デバイスには影響しません。

関数のプロトタイプ

Android
iOS
public abstract int EnableAudioRecv(boolean isEnabled,String receiverID);
-(QAVResult)EnableAudioRecv:(BOOL)enabled Receiver:(NSString *)receiverID;
パラメータ
タイプ
意味
enable
BOOL
YES:特定のユーザーのダウンリンクをオンにします。NO:特定のユーザーのダウンリンクをオフにします
receiverID
NSString*
ターゲットユーザーOpenIdを入力します

コールバック

コールバックパラメータはITMG_ROOM_MANAGEMENT_AUDIO_REC_OP。

オーディオ再生ハードウェア管理

このインターフェースを呼び出して、ルーム内のユーザーのオーディオ再生ハードウェアデバイスをオンまたはオフにします。呼び出しが成功すると、そのユーザーのオーディオ再生ハードウェアデバイスがオフまたはオンになりますが、下りには影響しません。

関数のプロトタイプ

Android
iOS
public abstract int EnableAudioPlayDevice(boolean isEnabled,String receiverID);
-(QAVResult)EnableAudioPlayDevice:(BOOL)enabled Receiver:(NSString *)receiverID;
パラメータ
タイプ
意味
enable
BOOL
YES:特定のユーザーのオーディオ再生ハードウェアデバイスをオンにします。NO:特定のユーザーのオーディオ再生ハードウェアデバイスをオフにします
receiverID
NSString*
ターゲットユーザーOpenIdを入力します

コールバック

コールバックパラメータはITMG_ROOM_MANAGEMENT_PLAY_OP。

メンバー状態取得インターフェース

特定ユーザーの収集状態の取得

このインターフェースを呼び出して、ルーム内のメンバーのマイク状態を取得します。

関数のプロトタイプ

Android
iOS
public abstract int GetMicState(String receiverID);
-(QAVResult)GetMicState:(NSString *)receiverID;
パラメータ
タイプ
意味
receiverID
NSString*
ターゲットユーザーOpenIdを入力します

コールバック

コールバックパラメータはITMG_ROOM_MANAGEMENT_GET_MIC_STATE。

特定ユーザーの再生状態の取得

このインターフェースを呼び出して、ルーム内のメンバーのスピーカー状態を取得します。

関数のプロトタイプ

Android
iOS
public abstract int GetSpeakerState(String receiverID);
-(QAVResult)GetSpeakerState:(NSString *)receiverID;

コールバック

コールバックパラメータはITMG_ROOM_MANAGEMENT_GET_SPEAKER_STATE。

特定のメンバーによる収集および再生操作の禁止

メンバーがルームに入ると、デフォルトでマイクとスピーカーの操作が許可されます。このインターフェースを呼び出すと、ルームのメンバーがマイクとスピーカーを操作できなくなります。この機能は、メンバーがルームを出ると無効になります。
Android
iOS
public abstract int ForbidUserOperation(boolean isEnabled,String receiverID);
-(QAVResult)ForbidUserOperation:(BOOL)enable Receiver:(NSString *)receiverID;
パラメータ
タイプ
意味
enable
BOOL
YES:特定ユーザーによるデバイスの操作を禁止します。NO:特定ユーザーによるデバイスの操作を許可します
receiverID
NSString*
ターゲットユーザーOpenIdを入力します

コールバック

コールバックパラメータはITMG_ROOM_MANAGERMENT_FOBIN_OP。

コールバック処理

GMEの他のコールバックと同様に、ルーム管理のコールバックもOnEventで処理されます。イベント名はITMG_MAIN_EVNET_TYPE_ROOM_MANAGEMENT_OPERATORで、イベントは次のような構造体を返します。

コールバックパラメータ

パラメータ
タイプ
意味
SenderID
NSString
イベント送信者IDです。自身のOpenIdと同じ場合は、ローカルから送信されたコマンドです
ReceiverID
NSString
イベント受信者IDです。自身のOpenIdと同じ場合は、ローカルが受信したコマンドです
OperateType
NSNumber
イベントタイプ
Result
NSNumber
イベント結果です。0は成功を意味します
OperateValue
NSNumber
コマンドの詳細

OperateType

数値
イベントタイプ
意味
0
ITMG_ROOM_MANAGEMENT_CAPTURE_OP
収集デバイスのハードウェアコールバックの制御
1
ITMG_ROOM_MANAGEMENT_PLAY_OP
再生デバイスのハードウェアコールバックの制御
2
ITMG_ROOM_MANAGEMENT_AUDIO_SEND_OP
アップリンクコールバックの制御
3
ITMG_ROOM_MANAGEMENT_AUDIO_REC_OP
ダウンリンクコールバックの制御
4
ITMG_ROOM_MANAGEMENT_MIC_OP
マイクコールバックの制御
5
ITMG_ROOM_MANAGEMENT_PLAY_OP
スピーカーコールバックの制御
6
ITMG_ROOM_MANAGEMENT_GET_MIC_STATE
マイク状態の取得
7
ITMG_ROOM_MANAGEMENT_GET_SPEAKER_STATE
スピーカー状態の取得
8
ITMG_ROOM_MANAGERMENT_FOBIN_OP
マイクイベントとスピーカーイベントの操作を禁止します

OperateValue

メンバー
意味
boolValue
0:コマンドをオフにします。1:コマンドをオンにします

サンプルコード

Android
iOS
public void OnEvent(ITMGContext.ITMG_MAIN_EVENT_TYPE type, Intent data) {
if (ITMGContext.ITMG_MAIN_EVENT_TYPE.ITMG_MAIN_EVNET_TYPE_ROOM_MANAGEMENT_OPERATOR== type) {

ArrayList<String> operatorArr = new ArrayList<String>();
operatorArr.add("収集");
operatorArr.add("再生");
operatorArr.add("上り");
operatorArr.add("下り");
operatorArr.add("上り収集");
operatorArr.add("下り再生");
operatorArr.add("mic状態");
operatorArr.add("spk状態");
operatorArr.add("mic/speak操作禁止");

String SenderID = data.getStringExtra("SenderID");
String ReceiverID = data.getStringExtra("ReceiverID");
int OperateType = data.getIntExtra("OperateType",-1000);

int Result =data.getIntExtra("Result",-1000);
boolean OperateValue = data.getBooleanExtra("OperateValue",false);
if (OperateType == -1000 ||Result == -1000) {
return;
}
if (SenderID.equals(identifier)) {
if (OperateType == ITMGContext.ITMG_ROOM_MANAGEMENT_GET_MIC_STATE || OperateType == ITMGContext.ITMG_ROOM_MANAGEMENT_GET_SPEAKER_STATE) {
Toast.makeText(getActivity(), String.format("id:%sへの%s操作、結果:%s", ReceiverID, operatorArr.get(OperateType), OperateValue ? "オン" : "オフ"), Toast.LENGTH_LONG).show();
}else{
Toast.makeText(getActivity(), String.format("id:%sへの%s%s操作、結果:%d", ReceiverID, operatorArr.get(OperateType), OperateValue ? "オン" : "オフ", Result), Toast.LENGTH_LONG).show();
}

} else if (ReceiverID.equals(identifier)||ReceiverID.equals("ALL")) {
if (Result == 0) {
switch (OperateType) {
case ITMGContext.ITMG_ROOM_MANAGEMENT_CAPTURE_OP:
{
if (!OperateValue) {
mSwitchCapture.setChecked(OperateValue);
}else{
AlertDialog.Builder dialog = new AlertDialog.Builder (getActivity()); //オブジェクト作成
dialog.setTitle("機器収集をオンにしますか");
dialog.setMessage("");
dialog.setCancelable(false);
dialog.setPositiveButton("オン", new DialogInterface.OnClickListener() {
//OKボタンのクリックイベントを設定
@Override
public void onClick(DialogInterface dialog, int which) {
mSwitchCapture.setChecked(true);
ITMGContext.GetInstance(getActivity()).GetAudioCtrl().EnableAudioCaptureDevice(true);
}
});
dialog.setNegativeButton("オフ", new DialogInterface.OnClickListener() {
//キャンセルボタンのクリックイベントを設定
@Override
public void onClick(DialogInterface dialog, int which) {
}
});
dialog.show();
}

}
break;
case ITMGContext.ITMG_ROOM_MANAGEMENT_PLAY_OP:
{
mSwitchPlayDevice.setChecked(OperateValue);
}
break;
case ITMGContext.ITMG_ROOM_MANAGEMENT_AUDIO_SEND_OP:
{
if (!OperateValue) {
mSwitchSend.setChecked(OperateValue);
}else{
AlertDialog.Builder dialog = new AlertDialog.Builder (getActivity()); //オブジェクト作成
dialog.setTitle("上りをオンにしますか");
dialog.setMessage("");
dialog.setCancelable(false);
dialog.setPositiveButton("オン", new DialogInterface.OnClickListener() {
//OKボタンのクリックイベントを設定
@Override
public void onClick(DialogInterface dialog, int which) {
mSwitchSend.setChecked(true);
ITMGContext.GetInstance(getActivity()).GetAudioCtrl().EnableAudioSend(true);
}
});
dialog.setNegativeButton("オフ", new DialogInterface.OnClickListener() {
//キャンセルボタンのクリックイベントを設定
@Override
public void onClick(DialogInterface dialog, int which) {
}
});
dialog.show();
}
}
break;
case ITMGContext.ITMG_ROOM_MANAGEMENT_AUDIO_REC_OP:
{
mSwitchRecv.setChecked(OperateValue);
}
break;
case ITMGContext.ITMG_ROOM_MANAGEMENT_MIC_OP:
{
if (!OperateValue) {
mSwitchCapture.setChecked(OperateValue);
mSwitchSend.setChecked(OperateValue);
}else{
AlertDialog.Builder dialog = new AlertDialog.Builder (getActivity()); //オブジェクト作成
dialog.setTitle("収集と上りをオンにしますか");
dialog.setMessage("");
dialog.setCancelable(false);
dialog.setPositiveButton("オン", new DialogInterface.OnClickListener() {
//OKボタンのクリックイベントを設定
@Override
public void onClick(DialogInterface dialog, int which) {
mSwitchCapture.setChecked(true);
mSwitchSend.setChecked(true);
ITMGContext.GetInstance(getActivity()).GetAudioCtrl().EnableMic(true);
}
});
dialog.setNegativeButton("オフ", new DialogInterface.OnClickListener() {
//キャンセルボタンのクリックイベントを設定
@Override
public void onClick(DialogInterface dialog, int which) {
}
});
dialog.show();
}
}
break;
case ITMGContext.ITMG_ROOM_MANAGEMENT_SPEAKER_OP:
{
mSwitchPlayDevice.setChecked(OperateValue);
mSwitchRecv.setChecked(OperateValue);
}
break;

}
}
if (OperateType == ITMGContext.ITMG_ROOM_MANAGEMENT_GET_MIC_STATE || OperateType == ITMGContext.ITMG_ROOM_MANAGEMENT_GET_SPEAKER_STATE)
{
Toast.makeText(getActivity(), String.format("id:%sからの%s操作、結果:%s",SenderID,operatorArr.get(OperateType),OperateValue?"オン":"オフ"), Toast.LENGTH_LONG).show();
}
else if (OperateType == ITMGContext.ITMG_ROOM_MANAGEMENT_SPEAKER_OP || OperateType == ITMGContext.ITMG_ROOM_MANAGEMENT_AUDIO_REC_OP|| OperateType == ITMGContext.ITMG_ROOM_MANAGEMENT_PLAY_OP|| OperateType == ITMGContext.ITMG_ROOM_MANAGERMENT_FOBIN_OP){
Toast.makeText(getActivity(), String.format("id:%sからの%s%s操作、結果:%d",SenderID,operatorArr.get(OperateType),OperateValue?"オン":"オフ",Result), Toast.LENGTH_LONG).show();
} else if (OperateValue == false) {
Toast.makeText(getActivity(), String.format("id:%sからの%s%s操作、結果:%d",SenderID,operatorArr.get(OperateType),OperateValue?"オン":"オフ",Result), Toast.LENGTH_LONG).show();
}
}
}
-(void)OnEvent:(ITMG_MAIN_EVENT_TYPE)eventType data:(NSDictionary *)data{
NSString *log = [NSString stringWithFormat:@"OnEvent:%d,data:%@", (int)eventType, data];
[self showLog:log];
NSLog(@"====%@====", log);
switch (eventType) {
case ITMG_MAIN_EVNET_TYPE_ROOM_MANAGEMENT_OPERATOR:
{
NSArray *operatorArr = @[@"収集",@"再生",@"上り",@"下り",@"上り収集",@"下り再生",@"メンバー追放",@"mic状態",@"spk状態",@"禁止操作mic/speak"];
// _openId
NSString *SenderID = [data objectForKey:@"SenderID"];
NSString *ReceiverID = [data objectForKey:@"ReceiverID"];
NSNumber *OperateType = [data objectForKey:@"OperateType"];
NSNumber *Result = [data objectForKey:@"Result"];
NSNumber *OperateValue = [data objectForKey:@"OperateValue"];

///自分が出したコマンド
if ([SenderID isEqualToString:_openId]) {
if (OperateType.intValue == ITMG_ROOM_MANAGEMENT_GET_MIC_STATE || OperateType.intValue == ITMG_ROOM_MANAGEMENT_GET_SPEAKER_STATE) {
NSString *alterString = [NSString stringWithFormat:@"id:%@への%@操作、結果:%@",ReceiverID,operatorArr[OperateType.intValue],OperateValue.boolValue?@"オン":@"オフ"];
UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"ルーム管理操作" message:alterString delegate:NULL cancelButtonTitle:@"OK" otherButtonTitles:nil];
[alert show];
}
else
{
NSString *alterString = [NSString stringWithFormat:@"id:%@への%@%@操作、結果:%@",ReceiverID,OperateValue.boolValue?@"オン":@"オフ",operatorArr[OperateType.intValue],Result];
UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"ルーム管理操作" message:alterString delegate:NULL cancelButtonTitle:@"OK" otherButtonTitles:nil];
[alert show];
}


}
else if([ReceiverID isEqualToString:_openId] ){ //他人からのコマンド
if (Result.intValue == 0) {
switch (OperateType.intValue) {
case ITMG_ROOM_MANAGEMENT_CAPTURE_OP:{
[_micSwitch setOn:OperateValue.boolValue animated:true];
}
break;
case ITMG_ROOM_MANAGEMENT_PLAY_OP:{
[_speakerSwitch setOn:OperateValue.boolValue animated:true];
}
break;
case ITMG_ROOM_MANAGEMENT_AUDIO_SEND_OP:{
[_sendSwitch setOn:OperateValue.boolValue animated:true];
}
break;
case ITMG_ROOM_MANAGEMENT_AUDIO_REC_OP:{
[_recvSwitch setOn:OperateValue.boolValue animated:true];
}
break;
case ITMG_ROOM_MANAGEMENT_MIC_OP:{
[_micSwitch setOn:OperateValue.boolValue animated:true];
[_sendSwitch setOn:OperateValue.boolValue animated:true];
}
break;
case ITMG_ROOM_MANAGEMENT_SPEAKER_OP:{
[_speakerSwitch setOn:OperateValue.boolValue animated:true];
[_recvSwitch setOn:OperateValue.boolValue animated:true];

}
break;
default:
break;
}

if (OperateType.intValue == ITMG_ROOM_MANAGEMENT_GET_MIC_STATE || OperateType.intValue == ITMG_ROOM_MANAGEMENT_GET_SPEAKER_STATE) {
NSString *alterString = [NSString stringWithFormat:@"id:%@からの%@操作、結果:%@",SenderID,operatorArr[OperateType.intValue],OperateValue.boolValue?@"オン":@"オフ"];
UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"ルーム管理操作" message:alterString delegate:NULL cancelButtonTitle:@"OK" otherButtonTitles:nil];
[alert show];
}
else{
NSString *alterString = [NSString stringWithFormat:@"id:%@からの%@%@操作、結果:%@",SenderID,OperateValue.boolValue?@"オン":@"オフ",operatorArr[OperateType.intValue],Result];
UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"ルーム管理操作" message:alterString delegate:NULL cancelButtonTitle:@"OK" otherButtonTitles:nil];
[alert show];
}
}
}
}
break;
}


ヘルプとサポート

この記事はお役に立ちましたか?

フィードバック