• 製品
  • 価格
  • リソース
  • サポート

Android

業務フロー

この部分では、ライブコマースシナリオによくある業務フローをまとめて、全体のシナリオの実装プロセスをよりよく理解するのに役立ちます。
アンカーの放送開始と終了
アンカーのクロスルームPK
RTC視聴者が入室して交流する
ライブ通販商品管理
下図は、アンカー(ルームマスター)のローカルプレビュー、ルームの作成、ルームへの入室と配信開始、ルームからの退室と配信終了のプロセスを示しています。



下図は、アンカーAがアンカーBを招待してクロスルームPKでのコラボ配信を行うプロセスを示しています。クロスルームPK交流のプロセス中、2つのルームの視聴者は両方のルームマスターがPK交流配信している画面を見ることができます。



下図は、RTCリアルタイムインタラクティブライブルームで視聴者がルームに入る、マイクオンを申請する、マイクオフをする、ルームから退出するプロセスを示しています。



下図は、ライブ通販シナリオでホストが商品を編集・掲載し、視聴者が商品を閲覧・購入する流れを示しています。




アクセスの準備

ステップ1:サービスを利用する

ECライブ配信シーンでは、通常RTC Engine美顔 ARプレイヤー SDKなどの有料PaaSサービスを利用して構築します。このうち、RTC Engineはリアルタイム・オーディオ・ビデオインタラクション機能を提供し、美顔ARは美顔エフェクト機能を提供し、プレイヤーはライブ配信とオンデマンド再生機能を提供します。実際の業務ニーズに応じて、上記サービスを自由に選択して利用できます。
RTC Engineサービスの開通
美顔 AR サービスの開通
プレーヤーサービスを利用する
1. まず、RTC Engine コンソールにログインしてアプリケーションを作成する必要があります。必要に応じてRTC Engineアプリケーションバージョンをアップグレードできます。例えば、プロフェッショナル版ではより多くの付加価値機能サービスを利用できます。



説明:
テスト環境と本番環境に使用するアプリケーションをそれぞれ作成することをお勧めします。1年間に各Tencent Cloudアカウント(UIN)に毎月10,000分間の無料時間が提供されます。
RTC Engineの月額プランは体験版(デフォルト)、軽量版、標準版、プロフェッショナル版に分かれており、さまざまな付加価値機能サービスを利用できます。詳細はバージョン機能と月額プランの説明をご参照ください。
2. アプリケーションが作成された後、アプリケーション管理-アプリケーション概要セクションでそのアプリケーションの基本情報を確認できます。その中で、後で使用するためにSDKAppIDSDKSecretKeyを大切に保管してください。同時に、キーの漏洩はトラフィックの不正利用に繋がりますのでご注意ください。



1. 美顔 AR コンソール > モバイル端末 Licenseにログインし、新しいテスト Licenseを作成をクリックします(テスト版Licenseは無料で14日間有効、1回更新可能、合計28日間)。モバイルを選択し、実際の必要に応じてAppName、Package Name、BundleIDを入力します。試用したい機能:全ての美顔機能仮想背景顔認識ジェスチャー認識ギフトアニメーション効果にチェックを入れ、そして確認をクリックします。



2. 有効化後、現在のページで情報を確認し、上記の統合ガイドを参照して統合できます。統合ガイドでLicense KeyとLicense URLの使用方法を確認できます。



1. Video on DemandコントロールパネルまたはCSSコントロールパネルLicense管理モバイル版Licenseにログインし、Licenseテスト新規作成をクリックします。



2. 必要に応じてApp NamePackage NameBundle IDを記入し、プレーヤー高級版を選択し、確定をクリックします。



3. テスト版Licenseが作成された後、生成されたLicenseの情報がページに表示されます。SDK初期化にLicense KeyとLicense URLの2つのパラメータを渡す必要があるため、下記の情報を大切に保管してください



注意:
同じアプリケーションのLicense URLとKeyは唯一であり、テスト版Licenseが正式版にアップグレードされた後もLicense URLとKeyは変わりません。

ステップ2:SDKをインポートする

RTC Engine SDK、美顔 AR SDK、プレイヤー SDKはすべてmavenCentralライブラリに公開されました。gradleを設定して自動ダウンロードと更新を行うことができます。
1. dependenciesに適切なバージョンのSDK依存を追加してください。
dependencies {
// フル機能版SDK、RTC Engine、ライブ配信、ショートビデオ、プレイヤーなどの複数の機能を含みます
implementation 'com.tencent.liteav:LiteAVSDK_Professional:latest.release'
// 美顔AR SDK 例:S1-07プランは以下の通り
implementation 'com.tencent.mediacloud:TencentEffect_S1-07:latest.release'
}
説明:
推奨される自動ロード方式に加えて、SDKをダウンロードして手動でインポートすることもできます。詳細はRTC Engine SDK の手動統合美顔 AR SDKの手動統合 をご参照ください。
ECライブ配信シーンの実現には、通常、RTC Engine、プレイヤーなどの複数の機能の組み合わせが必要です。個別統合によるシンボル衝突の問題を避けるため、フル機能版SDKの統合をお勧めします機能版SDKの統合を推奨します
2. defaultConfigで、Appが使用するCPUアーキテクチャを指定します。
defaultConfig {
ndk {
abiFilters "armeabi-v7a", "arm64-v8a"
}
}
説明:
LiteAVSDK フル機能版は armeabi-v7a/arm64-v8a/x86/x86_64 アーキテクチャをサポートしていますが、美顔 AR SDK は armeabi-v7a/arm64-v8a アーキテクチャのみをサポートしています。
3. Sync Now をクリックすると、SDK が自動的にダウンロードされ、プロジェクトに統合されます。美顔 AR プランパッケージに動的エフェクトとフィルター機能が含まれている場合、SDK ダウンロードページ から対応するプランパッケージをダウンロードし、無料のフィルター素材(./assets/lut)とステッカー動的エフェクト(./MotionRes)を解凍して、ご自身のプロジェクトの下記ディレクトリに配置する必要があります:
動的効果:../assets/MotionRes
フィルタ:../assets/lut

ステップ3:プロジェクトの設定

1. 権限設定。AndroidManifest.xmlで App の権限を設定します。ECライブストリーミングシーンでは、RTC Engineおよび美顔AR SDKに以下の権限が必要です:
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
<uses-permission android:name="android.permission.RECORD_AUDIO" />
<uses-permission android:name="android.permission.MODIFY_AUDIO_SETTINGS" />
<uses-permission android:name="android.permission.BLUETOOTH" />
<uses-permission android:name="android.permission.CAMERA" />
<uses-feature android:name="android.hardware.camera.autofocus" />
注意:
android:hardwareAccelerated="false"を設定しないでください。ハードウェアアクセラレーションをオフにすると、相手のビデオストリームがレンダリングできなくなります。
RTC Engine SDKには権限申請ロジックが組み込まれていないため、適切な権限を自身で宣言する必要があります。一部の権限(ストレージ、録音、カメラなど)は実行時に動的に申請する必要があります。
もしAndroidプロジェクトのtargetSdkVersionが31または対象デバイスがAndroid 12以上のシステムバージョンに関連している場合、Bluetooth機能を正常に使用するため、公式にはコード内でandroid.permission.BLUETOOTH_CONNECT権限を動的な申請する必要があります。詳細はBluetooth権限を参照してください。
2. 難読化設定。私たちはSDK内部でJavaのリフレクション特性を使用しているため、proguard-rules.proファイル内でSDK関連クラスを難読化しないリストに追加する必要があります。
-keep class com.tencent.** { *; }
-keep class org.light.** { *;}
-keep class org.libpag.** { *;}
-keep class org.extra.** { *;}
-keep class com.gyailib.**{ *;}
-keep class androidx.exifinterface.** { *;}

ステップ4:認証とライセンス

RTC Engine 認証資格情報
美顔 AR 認証許可
プレーヤー認証ライセンス
UserSigは、Tencent Cloudが設計したセキュリティ保護署名であり、悪意のある攻撃者によるクラウドサービスの使用権の盗用を防ぐことを目的としています。RTC Engineは入室時にこの認証資格情報を検証します。
デバッグフェーズ:クライアントサンプルコードコントロールパネル取得の2つの方法でUserSigを計算生成でき、デバッグテストのみに使用します。
本番フェーズ:クライアントのリバースエンジニアリングによるキーの漏洩を防ぐため、より高いセキュリティレベルのサーバー側UserSig計算を推奨します。
具体的な実装の流れは以下の通りです。
1. AppがSDKの初期化関数を呼び出す前に、最初にサーバーにUserSigをリクエストします。
2. サーバーはSDKAppIDとUserIDに基づいてUserSigを計算します。
3. サーバーは計算されたUserSigをAppに返します。
4. Appは、特定のAPIを通じてSDKにUserSigを伝達します。
5. SDKがSDKAppID + UserID + UserSigをTencent Cloudのクラウドサーバーに提出して検証します。
6. Tencent CloudはUserSigを検証し、合法性を確認します。
7. 検証が完了すると、RTC Engine SDKにリアルタイム・オーディオ・ビデオサービスを提供します。



注意:
デバッグフェーズのローカルUserSig計算方式をオンライン環境に適用することは推奨しません。逆コンパイルによって容易に解読され、キーが漏洩する可能性があります。
複数の言語(Java/GO/PHP/Node.js/Python/C#/C++)のUserSigサーバーサイド計算のソースコードを提供しています。詳細はサーバーサイドUserSig計算を参照してください。
美顔 AR を使用する前に、Tencent Cloudにライセンス証明を検証する必要があります。Licenseを設定するには、License KeyとLicense URLが必要です。サンプルコードは以下の通りです。
import com.tencent.xmagic.telicense.TELicenseCheck;

// Licenseのダウンロードや更新をトリガーするだけで、認証結果を気にしない場合は、第4のパラメータにnullを渡す
TELicenseCheck.getInstance().setTELicense(context, URL, KEY, new TELicenseCheck.TELicenseCheckListener() {
@Override
public void onLicenseCheckFinish(int errorCode, String msg) {
// 注意:このコールバックは必ずしも呼び出しスレッドで実行されるわけではありません。
if (errorCode == TELicenseCheck.ERROR_OK) {
// 認証成功
} else {
// 認証失敗
}

}
});
注意:
関連業務モジュールの初期化コードで認証許可をトリガーすることをお勧めします。これにより、使用直前にLicenseをダウンロードすることを避けることができます。また、認証時にはネットワーク権限が必要です。
実際のアプリケーションのパッケージネームは、License作成時にバインドされたPackage Nameと完全に一致していなければならず、そうでない場合はLicenseの検証に失敗し、詳細は認証エラーコードを参照してください。
ライブ再生、オンデマンド再生機能はプレーヤーのLicense認証を設定した後にのみ再生成功でき、そうでない場合は再生に失敗し(黒い画面が表示されます)、グローバルで一度だけ設定すれば十分です。もしまだLicenseを取得していない場合は、正常に再生するために無料でテスト版Licenseを申し込むことができます。正式版Licenseは購入が必要です。License申請成功後、2つの文字列:License URLLicense Keyを得られます。
アプリがSDK関連機能を呼び出す前に、以下の設定を行う必要があります(Applicationクラスでの設定を推奨します):
public class MApplication extends Application {
public void onCreate() {
super.onCreate();
String licenceURL = ""; // 取得したlicence url
String licenceKey = ""; // 取得したlicence key
TXLiveBase.getInstance().setLicence(appContext, licenceURL, licenceKey);
TXLiveBase.setListener(new TXLiveBaseListener() {
@Override
public void onLicenceLoaded(int result, String reason) {
Log.i(TAG, "onLicenceLoaded: result:" + result + ", reason:" + reason);
if (result != 0) {
// resultが0でない場合、設定に失敗したことを意味し、再試行が必要
TXLiveBase.getInstance().setLicence(appContext, licenceURL, licenceKey);
}
}
});
}
}
License設定が成功した後(少し時間がかかります。具体的な時間はネットワークの状況によって異なります)、以下のメソッドでLicense情報を確認できます:
TXLiveBase.getInstance().getLicenceInfo();
注意:
実際のアプリケーションのパッケージネームは、License作成時にバインドされたPackage Nameと完全に一致していなければならず、そうでない場合はLicenseの検証に失敗します。
Licenseは強いオンライン検証のロジックであり、アプリが初めて起動した後にTXLiveBase#setLicenceを呼び出す際には、ネットワークが利用可能であることを確認する必要があります。アプリが初めて起動された時には、まだインターネットアクセスの権限が与えられていない可能性があるため、インターネットアクセスの権限が与えられた後に、再度TXLiveBase#setLicenceを呼び出す必要があります。
TXLiveBase#setLicenceの読み込み結果をリスニング:onLicenceLoadedインターフェース。失敗した場合は実際の状況に応じて対応するリトライやガイダンスを行い、何度か失敗した後には、頻度を制限し、業務を補助する製品ポップアップなどのガイダンスを用いて、ユーザーにネットワーク状況の確認を促します。
TXLiveBase#setLicenceは複数回呼び出すことができ、正常にロードされることを確認するため、アプリのメイン画面に入る際にTXLiveBase#setLicenceを呼び出すことをお勧めします。
マルチプロセスのアプリに対して、プレーヤーを使用したプロセスを起動する際には、必ずTXLiveBase#setLicenceを呼び出すようにしてください。例えば:Android端末で独立したプロセスでビデオを再生するアプリの場合、バックグラウンド再生時にプロセスがシステムによってkillされて再起動した時も、TXLiveBase#setLicenceを呼び出す必要があります。

ステップ5:SDKの初期化

初始化 RTC Engine SDK
美顔 AR SDKの初期化
プレーヤーSDKを初期化
// RTC Engine SDK インスタンスの作成(シングルトンパターン)

TRTCCloud mTRTCCloud = TRTCCloud.sharedInstance(context);
// イベントリスナーを設定する
mTRTCCloud.addListener(trtcSdkListener);

// SDKからの各種イベント通知(例:エラーコード、警告コード、オーディオ・ビデオの状態パラメータなど)
private TRTCCloudListener trtcSdkListener = new TRTCCloudListener() {
@Override
public void onError(int errCode, String errMsg, Bundle extraInfo) {
Log.d(TAG, errCode + errMsg);
}
@Override
public void onWarning(int warningCode, String warningMsg, Bundle extraInfo) {
Log.d(TAG, warningCode + warningMsg);
}
};

// イベントリスナーを削除
mTRTCCloud.removeListener(trtcSdkListener);
// RTC Engine SDK インスタンスの破棄(シングルトンパターン)
TRTCCloud.destroySharedInstance();
説明:
SDKイベント通知のリスニングを推奨します。一般的なエラーに関するログ出力と処理についての詳細はエラーコード表を参照してください。
import com.tencent.xmagic.XmagicApi;

// 美顔 AR SDKの初期化
XmagicApi mXmagicApi = new XmagicApi(context, XmagicResParser.getResPath(), new XmagicApi.OnXmagicPropertyErrorListener());

// 開発デバッグ時には、ログレベルをDEBUGに設定できますが、パフォーマンスに影響しますので、リリースパッケージではWARNに設定してください。
mXmagicApi.setXmagicLogLevel(Log.WARN);

// 顔加工AR SDKをリリース、この方法はGLスレッド内で呼び出す必要があります。
mXmagicApi.onDestroy();
説明:
美顔 AR SDKを初期化する前に、リソースのコピーなどの準備作業が必要です。詳細な手順については、美顔 AR SDK 使用プロセスをご参照ください。
オンデマンド再生シナリオのSDK初期化。
// SDKアクセス環境を設定(もしサービスがグローバルユーザーを対象とする場合、SDKアクセス環境をグローバルアクセス環境に設定してください)
TXLiveBase.setGlobalEnv("GDPR");

// Playerオブジェクトを作成
TXVodPlayer mVodPlayer = new TXVodPlayer(mContext);

// 動画レンダリング用のViewコントロールを追加
TXCloudVideoView mPlayerView = findViewById(R.id.video_view);
// PlayerオブジェクトとViewコントロールを関連付ける
mVodPlayer.setPlayerView(mPlayerView);

// プレーヤーパラメータの設定
TXVodPlayConfig config = new TXVodPlayConfig();
config.setEnableAccurateSeek(true); // 精密seekするか、デフォルトはtrue
config.setMaxCacheItems(5); // キャッシュファイルの数を5に設定
config.setProgressInterval(200); // 進行状況のコールバック間隔を設定、単位はミリ秒
config.setMaxBufferSize(50); // 最大プリロードサイズ、単位はMB
mVodPlayer.setConfig(config); // configをmVodPlayerに渡す

// プレーヤーイベントリスニング
mVodPlayer.setVodListener(new ITXVodPlayListener() {
@Override
public void onPlayEvent(TXVodPlayer player, int event, Bundle param) {
// イベント通知
}

@Override
public void onNetStatus(TXVodPlayer player, Bundle bundle) {
// 状態フィードバック
}
});
ライブ再生シナリオのSDK初期化。
// ビデオレンダリングに使用TXCloudVideoViewを予め追加する必要がある
TXCloudVideoView mRenderView = findViewById(R.id.video_view);
// Playerオブジェクトを作成
V2TXLivePlayer mLivePlayer = new V2TXLivePlayerImpl(mContext);
// Playerオブジェクトとビデオレンダリングviewを関連付ける
mLivePlayer.setRenderView(mRenderView);

// プレーヤーイベントリスニング
mLivePlayer.setObserver(new V2TXLivePlayerObserver() {
@Override
public void onVideoLoading(V2TXLivePlayer player, Bundle extraInfo) {
// ビデオ読み込みイベント
}
@Override
public void onVideoPlaying(V2TXLivePlayer player, boolean firstPlay, Bundle extraInfo) {
// ビデオ再生イベント
}
});

アクセスの流れ

APIタイムライン図





ステップ1:アンカーが入室、プッシュを開始する

RTC Engine SDKは、ビデオ画面を表示するコントロールとしてTXCloudVideoViewタイプのみをサポートしています。そのため、まずレイアウトファイルでビューレンダリングコントロールを定義する必要があります。
<com.tencent.rtmp.ui.TXCloudVideoView
android:id="@+id/live_cloud_view_main"
android:layout_width="match_parent"
android:layout_height="match_parent" />
注意:
ビューレンダリングコントロールとしてTextureViewまたはSurfaceViewを指定する必要がある場合は、高度機能-ビューレンダリングコントロールを参照してください。
1. アンカーが入室する前に、ローカルビデオのプレビューとオーディオのキャプチャーを開始します。
// アンカーのローカル画面のプレビューを表示するためのビデオレンダリングコントロールを取得
TXCloudVideoView mTxcvvAnchorPreviewView = findViewById(R.id.live_cloud_view_main);

// ビデオエンコードのパラメータを設定し、リモートのユーザーが見る画面の品質を決定
TRTCCloudDef.TRTCVideoEncParam encParam = new TRTCCloudDef.TRTCVideoEncParam();
encParam.videoResolution = TRTCCloudDef.TRTC_VIDEO_RESOLUTION_960_540;
encParam.videoFps = 15;
encParam.videoBitrate = 1300;
encParam.videoResolutionMode = TRTCCloudDef.TRTC_VIDEO_RESOLUTION_MODE_PORTRAIT;
mTRTCCloud.setVideoEncoderParam(encParam);

// ビデオキャプチャーには、boolean mIsFrontCameraでフロント/アウトカメラを指定できます。
mTRTCCloud.startLocalPreview(mIsFrontCamera, mTxcvvAnchorPreviewView);

// ここでは音声品質を指定。低いから高い順:SPEECH/DEFAULT/MUSIC
mTRTCCloud.startLocalAudio(TRTCCloudDef.TRTC_AUDIO_QUALITY_DEFAULT);
注意:
業務のニーズに応じて、ビデオエンコーディングのパラメータTRTCVideoEncParamを自由に設定できます。各グレードの最適な解像度とビットレートの組み合わせの詳細は、解像度ビットレート参照表を参照してください。
enterRoomの前に、上記のインターフェースを呼び出すと、SDKはカメラのプレビューとオーディオのキャプチャーのみを開始し、enterRoomを呼び出した後にのみプッシュを開始します。
enterRoomの後に、上記のインターフェースを呼び出すと、SDKはカメラのプレビューとオーディオのキャプチャーを開始し、自動的にプッシュを開始します。
2. アンカーはローカル画面のレンダリングパラメータと、エンコーダー出力画面モード(任意項目)を設定します。
TRTCCloudDef.TRTCRenderParams params = new TRTCCloudDef.TRTCRenderParams();
params.mirrorType = TRTCCloudDef.TRTC_VIDEO_MIRROR_TYPE_AUTO; // イメージモード
params.fillMode = TRTCCloudDef.TRTC_VIDEO_RENDER_MODE_FILL; // フィルモード
params.rotation = TRTCCloudDef.TRTC_VIDEO_ROTATION_0; // 回転角度
// ローカル画面のレンダリングパラメータを設定
mTRTCCloud.setLocalRenderParams(params);

// エンコーダー出力のイメージモードを設定
mTRTCCloud.setVideoEncoderMirror(boolean mirror);
// ビデオエンコーダーの出力する画像の向きを設定
mTRTCCloud.setVideoEncoderRotation(int rotation);
注意:
ローカル画面のレンダリングパラメータの設定は、ローカル画面のレンダリング効果にのみ影響します。
エンコーダーの出力モードを設定すると、ルームの他のユーザーが見る(およびクラウドに録画されたファイルの)画面効果に影響します。
3. アンカーが正式にライブを開始し、入室しプッシュします。
public void enterRoomByAnchor(String roomId, String userId) {
TRTCCloudDef.TRTCParams params = new TRTCCloudDef.TRTCParams();
// 文字列のルーム番号を例に
params.strRoomId = roomId;
params.userId = userId;
// 業務バックエンドから取得したUserSig
params.userSig = getUserSig(userId);
// 自分のSDKAppIDに置き換える
params.sdkAppId = SDKAppID;
// アンカーロール指定
params.role = TRTCCloudDef.TRTCRoleAnchor;
// インタラクティブライブシナリオで入室
mTRTCCloud.enterRoom(params, TRTCCloudDef.TRTC_APP_SCENE_LIVE);
}

// 入室結果イベントコールバック
@Override
public void onEnterRoom(long result) {
if (result > 0) {
// resultは入室にかかった時間(ミリ秒)
Log.d(TAG, "Enter room succeed");
} else {
// result入室失敗のエラーコード
Log.d(TAG, "Enter room failed");
}
}
注意:
RTC Engineのルーム番号は数字型のroomIdと文字列型のstrRoomIdに分かれており、2種類のルームは相互接続されません。ルーム番号のタイプを統一することをお勧めします。
RTC Engineのユーザーロールは配信者と視聴者に分かれており、配信者のみがストリーミング権限を持ちます。入室時にはユーザーロールを指定する必要があり、指定がない場合はデフォルトで配信者ロールになります。
ライブコマースシナリオでは、入室モードはTRTC_APP_SCENE_LIVEを選択することをお勧めします。

ステップ2:視聴者が入室してプル

1. 視聴者がRTC Engine ルームに入室。
public void enterRoomByAudience(String roomId, String userId) {
TRTCCloudDef.TRTCParams params = new TRTCCloudDef.TRTCParams();
// 文字列のルーム番号を例に
params.strRoomId = roomId;
params.userId = userId;
// 業務バックエンドから取得したUserSig
params.userSig = getUserSig(userId);
// 自分のSDKAppIDに置き換える
params.sdkAppId = SDKAppID;
// 指定視聴者ロール
params.role = TRTCCloudDef.TRTCRoleAudience;
// インタラクティブライブシナリオで入室
mTRTCCloud.enterRoom(params, TRTCCloudDef.TRTC_APP_SCENE_LIVE);
}

// 入室結果イベントコールバック
@Override
public void onEnterRoom(long result) {
if (result > 0) {
// resultは入室にかかった時間(ミリ秒)
Log.d(TAG, "Enter room succeed");
} else {
// result入室失敗のエラーコード
Log.d(TAG, "Enter room failed");
}
}
2. 視聴者がアンカーのオーディオ・ビデオストリームを購読します。
@Override
public void onUserAudioAvailable(String userId, boolean available) {
// リモートユーザーが自分のオーディオをパブリッシュ/キャンセル
// 自動購読モードでは、何も操作する必要はありません。SDKはリモートユーザーのオーディオを自動的に再生します。
}

@Override
public void onUserVideoAvailable(String userId, boolean available) {
// リモートユーザーがメインビデオ画面をパブリッシュ/キャンセル
if (available) {
// リモートユーザーのビデオストリームを購読し、ビデオレンダリングコントロールにバインド
mTRTCCloud.startRemoteView(userId, TRTCCloudDef.TRTC_VIDEO_STREAM_TYPE_BIG, TXCloudVideoView view);
} else {
// リモートユーザーのビデオストリームの購読を停止し、レンダリングコントロールをリリース
mTRTCCloud.stopRemoteView(userId, TRTCCloudDef.TRTC_VIDEO_STREAM_TYPE_BIG);
}
}
3. 視聴者がリモート画面のレンダリングモードを設定します(任意項目)。
TRTCCloudDef.TRTCRenderParams params = new TRTCCloudDef.TRTCRenderParams();
params.mirrorType = TRTCCloudDef.TRTC_VIDEO_MIRROR_TYPE_AUTO; // イメージモード
params.fillMode = TRTCCloudDef.TRTC_VIDEO_RENDER_MODE_FILL; // フィルモード
params.rotation = TRTCCloudDef.TRTC_VIDEO_ROTATION_0; // 回転角度
// リモート画面のレンダリングモードを設定
mTRTCCloud.setRemoteRenderParams(userId, TRTCCloudDef.TRTC_VIDEO_STREAM_TYPE_BIG, params)

ステップ3:視聴者の交流インタラクション

1. 視聴者がアンカーロールに切り替わります。
// アンカーロールに切り替え
mTRTCCloud.switchRole(TRTCCloudDef.TRTCRoleAnchor);

// ロール切り替えイベントコールバック
@Override
public void onSwitchRole(int errCode, String errMsg) {
if (errCode == TXLiteAVCode.ERR_NULL) {
// ロールの切り替えに成功
}
}
2. 視聴者がローカルのオーディオ・ビデオのキャプチャーおよびプッシュを開始します。
// マイクオン視聴者のローカル画面プレビューを表示するためのビデオレンダリングコントロールを取得します。
TXCloudVideoView mTxcvvAudiencePreviewView = findViewById(R.id.live_cloud_view_sub);

// ビデオエンコードのパラメータを設定し、リモートのユーザーが見る画面の品質を決定
TRTCCloudDef.TRTCVideoEncParam encParam = new TRTCCloudDef.TRTCVideoEncParam();
encParam.videoResolution = TRTCCloudDef.TRTC_VIDEO_RESOLUTION_480_270;
encParam.videoFps = 15;
encParam.videoBitrate = 550;
encParam.videoResolutionMode = TRTCCloudDef.TRTC_VIDEO_RESOLUTION_MODE_PORTRAIT;
mTRTCCloud.setVideoEncoderParam(encParam);

// ビデオキャプチャーには、boolean mIsFrontCameraでフロント/アウトカメラを指定できます。
mTRTCCloud.startLocalPreview(mIsFrontCamera, mTxcvvAudiencePreviewView);

// ここでは音声品質を指定。低いから高い順:SPEECH/DEFAULT/MUSIC
mTRTCCloud.startLocalAudio(TRTCCloudDef.TRTC_AUDIO_QUALITY_DEFAULT);
注意:
業務のニーズに応じて、ビデオエンコーディングのパラメータTRTCVideoEncParamを自由に設定できます。各グレードの最適な解像度とビットレートの組み合わせの詳細は、解像度ビットレート参照表を参照してください。
3. 視聴者がマイクオフにし、プッシュを停止します。
// 視聴者ロールに切り替える
mTRTCCloud.switchRole(TRTCCloudDef.TRTCRoleAudience);

// ロール切り替えイベントコールバック
@Override
public void onSwitchRole(int errCode, String errMsg) {
if (errCode == TXLiteAVCode.ERR_NULL) {
// カメラのキャプチャーのパブリッシュを停止
mTRTCCloud.stopLocalPreview();
// マイクのキャプチャー及びパブリッシュを停止
mTRTCCloud.stopLocalAudio();
}
}

ステップ4:ルームの退出および削除

1. ルームから退出。
public void exitRoom() {
mTRTCCloud.stopLocalAudio();
mTRTCCloud.stopLocalPreview();
mTRTCCloud.exitRoom();
}

// 退室イベントコールバック
@Override
public void onExitRoom(int reason) {
if (reason == 0) {
Log.d(TAG, "exitRoomアクティブコールでルーム退出します");
} else if (reason == 1) {
Log.d(TAG, "現在のルームからサーバーによってキックされました");
} else if (reason == 2) {
Log.d(TAG, "現在のルームは解散されました");
}
}
注意:
SDKが使うすべてのリソースがリリースされた後、SDKはonExitRoomコールバック通知をスローして知らせます。
再度enterRoomを呼び出す場合や他のオーディオ・ビデオSDKに切り替える場合は、onExitRoomコールバックが終わるまで関連操作を行わないでください。そうしないと、カメラやマイクが強制的に使用されるなど、さまざまな異常が発生する可能性があります。
2. ルームを解散する
サーバー側のルーム解散
RTC Engineは、サーバー側で数字型ルーム解散API DismissRoom と文字列型ルーム解散API DismissRoomByStrRoomId を提供しています。サーバー側のルーム解散インターフェースを呼び出すことで、ルーム内のすべてのユーザーをルームから退室させ、ルームを解散することができます。
クライアントのルーム解散
クライアント側にはルームを直接解散するAPIがなく、各クライアントがexitRoomを呼び出してルームを退室する必要があります。ルーム内のすべての配信者と視聴者が退室すると、RTC Engineのルームライフサイクルルールに従ってルームは自動的に解散されます。詳細はRTC Engine ルーム退室をご参照ください。
注意:
ライブ配信が終了した後、サーバー側でAPIを呼び出してルームを確実に解散することをお勧めします。一部のユーザーが予定通りに退室しないことによってルームが存続し、予期しない費用が発生するのを防げます。

詳細設定

商品情報ポップアップ

商品情報ポップアップ機能は、Chatカスタムメッセージで実装できます。また、SEI情報でも実装可能です。以下では、これら2つの実装方法をそれぞれ紹介します。

カスタムメッセージ

カスタムメッセージはTencent CloudのChatの機能に依存しています。事前にサービスを有効化し、Chat SDKをインポートする必要があります。詳細な手順については音声チャットルーム導入ガイド-導入準備をご参照ください。
1. カスタムメッセージの送信
方法1:配信者がクライアントから商品ポップアップに関連するグループカスタムメッセージを送信します。
// 商品ポップアップメッセージのボディー
JSONObject jsonObject = new JSONObject();
try {
jsonObject.put("cmd", "item_popup_msg");
JSONObject msgJsonObject = new JSONObject();
msgJsonObject.put("itemNumber", 1); // 商品番号
msgJsonObject.put("itemPrice", 199.0); // 商品価格
msgJsonObject.put("itemTitle", "xxx"); // 商品タイトル
msgJsonObject.put("itemUrl", "xxx"); // 商品画像URL
jsonObject.put("msg", msgJsonObject);
} catch (JSONException e) {
e.printStackTrace();
}
String data = jsonObject.toString();

// グループカスタムメッセージを送信(「商品ポップアップ」メッセージは高優先度に設定することをお勧めします)
V2TIMManager.getInstance().sendGroupCustomMessage(data.getBytes(), mRoomId,
V2TIMMessage.V2TIM_PRIORITY_HIGH, new V2TIMValueCallback<V2TIMMessage>() {
@Override
public void onError(int i, String s) {
// 商品ポップアップメッセージの送信に失敗
}

@Override
public void onSuccess(V2TIMMessage v2TIMMessage) {
// 商品ポップアップメッセージの送信に成功
// ローカルでの「商品ポップアップ」エフェクトのレンダリング
}
});
方法2:バックエンドの運営がサーバーから商品ポップアップに関連するグループカスタムメッセージを送信します。
リクエストURLサンプル:
https://xxxxxx/v4/group_open_http_svc/send_group_msg?sdkappid=88888888&identifier=admin&usersig=xxx&random=99999999&contenttype=json
リクエストボディサンプル:
{
"GroupId": "@TGS#12DEVUDHQ",
"Random": 2784275388,
"MsgPriority": "High", // メッセージの優先度、商品ポップアップメッセージは高優先度設定を推奨
"MsgBody": [
{
"MsgType": "TIMCustomElem",
"MsgContent": {
// itemNumber: 商品番号; itemPrice: 商品価格; itemTitel: 商品タイトル; itemUrl: 商品画像URL
"Data": "{\"cmd\": \"item_popup_msg\", \"msg\": {\"itemNumber\": 1, \"itemPrice\": 199.0, \"itemTitle\": \"xxx\", \"itemUrl\": \"xxx\"}}"
}
}
]
}
2. カスタムメッセージの受信
ルーム内の他のユーザークライアントがグループカスタムメッセージのコールバックを受信し、メッセージを解析して商品ポップアップエフェクトをレンダリングします。
// グループカスタムメッセージを受信
V2TIMManager.getInstance().addSimpleMsgListener(new V2TIMSimpleMsgListener() {
@Override
public void onRecvGroupCustomMessage(String msgID, String groupID, V2TIMGroupMemberInfo sender, byte[] customData) {
String customStr = new String(customData);
if (!customStr.isEmpty()) {
try {
JSONObject jsonObject = new JSONObject(customStr);
String command = jsonObject.getString("cmd");
JSONObject messageJsonObject = jsonObject.getJSONObject("msg");
if (command.equals("item_popup_msg")) {
int itemNumber = messageJsonObject.getInt("itemNumber"); // 商品番号
double itemPrice = messageJsonObject.getDouble("itemPrice"); // 商品価格
String itemTitle = messageJsonObject.getString("itemTitle"); // 商品タイトル
String itemUrl = messageJsonObject.getString("itemUrl"); // 商品画像URL
// 商品番号、商品価格、商品タイトル、商品画像URLに基づいて、商品ポップアップ効果をレンダリング
}
} catch (JSONException e) {
e.printStackTrace();
}
}
}
});

SEI情報

SEI情報は配信者のビデオストリームに挿入されて伝送され、商品情報のポップアップとホストのライブ画面を正確に同期させることができます。
1. SEI情報の送信。
配信者がRTC Engineクライアントで商品ポップアップ関連のSEIメッセージを送信します。
// 商品ポップアップメッセージのボディー
JSONObject jsonObject = new JSONObject();
try {
jsonObject.put("cmd", "item_popup_msg");
JSONObject msgJsonObject = new JSONObject();
msgJsonObject.put("itemNumber", 1); // 商品番号
msgJsonObject.put("itemPrice", 199.0); // 商品価格
msgJsonObject.put("itemTitle", "xxx"); // 商品タイトル
msgJsonObject.put("itemUrl", "xxx"); // 商品画像URL
jsonObject.put("msg", msgJsonObject);
} catch (JSONException e) {
e.printStackTrace();
}
String data = jsonObject.toString();

// SEI情報の送信
mTRTCCloud.sendSEIMsg(data.getBytes(), 1);
2. SEI情報の受信。
方法1:視聴者がTRTCクライアントでSEI情報を受信し、その後メッセージの解析と商品ポップアップ効果のレンダリングを行います。
mTRTCCloud.setListener(new TRTCCloudListener() {
@Override
public void onRecvSEIMsg(String userId, byte[] data) {
String dataStr = new String(data);
if (!dataStr.isEmpty()) {
try {
JSONObject jsonObject = new JSONObject(dataStr);
String command = jsonObject.getString("cmd");
JSONObject messageJsonObject = jsonObject.getJSONObject("msg");
if (command.equals("item_popup_msg")) {
int itemNumber = messageJsonObject.getInt("itemNumber"); // 商品番号
double itemPrice = messageJsonObject.getDouble("itemPrice"); // 商品価格
String itemTitle = messageJsonObject.getString("itemTitle"); // 商品タイトル
String itemUrl = messageJsonObject.getString("itemUrl"); // 商品画像URL
// 商品番号、商品価格、商品タイトル、商品画像URLに基づいて、商品ポップアップ効果をレンダリング
}
} catch (JSONException e) {
e.printStackTrace();
}
}
}
});

商品説明のリプレイ

事前に録画された商品説明動画を再生することで、商品説明のリプレイ機能を実現します。
まず、プレーヤーの初期化を行い、録画された動画の再生を開始します。TXVodPlayerは2種類の再生モードをサポートしており、必要に応じて自由に選択できます:
URLで
FileIdで
// URLビデオリソースを再生
String url = "http://1252463788.vod2.myqcloud.com/xxxxx/v.f20.mp4";
mVodPlayer.startVodPlay(url);

// ローカルビデオリソースを再生
String localFile = "/sdcard/video.mp4";
mVodPlayer.startVodPlay(localFile);
// 以下の新しいインターフェースの使用を推奨
// psign、つまりプレーヤーの署名、署名の紹介と生成方法はリンクを参照してください:https://cloud.tencent.com/document/product/266/42436
TXPlayInfoParams playInfoParam = new TXPlayInfoParams(1252463788, // Tencent CloudアカウントのappId
"4564972819220421305", // ビデオのfileId
"psignxxxxxxx"); // プレーヤーの署名
mVodPlayer.startVodPlay(playInfoParam);

// 旧インターフェース、使用非推奨
TXPlayerAuthBuilder authBuilder = new TXPlayerAuthBuilder();
authBuilder.setAppId(1252463788);
authBuilder.setFileId("4564972819220421305");
mVodPlayer.startVodPlay(authBuilder);
再生制御:プログレス調整、一時停止、再生再開、再生終了。
// プログレス調整(秒)
mVodPlayer.seek(time);

// 一時停止
mVodPlayer.pause();

// 再生再開
mVodPlayer.resume();

// 再生終了(最後のフレームをクリア)
mVodPlayer.stopPlay(true);
注意:
大量のメモリリークや画面のちらつきが発生するため、再生を終了する際、特に次のstartVodPlay前はViewコントロールを破棄することを忘れないでください。
また、メモリリークや「Receiver not registered」警告が発生する可能性があるため、再生画面を終了する際には、必ずレンダリングViewのonDestroy()関数を呼び出すことを忘れないでください。
@Override
public void onDestroy() {
super.onDestroy();
mVodPlayer.stopPlay(true); // trueは最後のフレームをクリア
mPlayerView.onDestroy();
}

クロスルームPK

1. 任意の一方がクロスルームPKを発起します。
public void connectOtherRoom(String roomId, String userId) {
try {
JSONObject jsonObj = new JSONObject();
// 数字のルーム番号はroomIdです。
jsonObj.put("strRoomId", roomId);
jsonObj.put("userId", userId);
mTRTCCloud.ConnectOtherRoom(jsonObj.toString());
} catch (JSONException e) {
e.printStackTrace();
}
}

// クロスルームPKのレスポンスコールバック
@Override
public void onConnectOtherRoom(String userId, int errCode, String errMsg) {
// クロスルームアンカーと交流したいユーザーID
// エラーコード、ERR_NULLはリクエスト成功
// エラーメッセージ
}
注意:
クロスルームPKのローカルユーザーとリモートユーザーは両方とも配信者ロールでなければならず、両方ともオーディオ・ビデオのアップストリームが必要です。
ConnectOtherRoom()を数回呼び出すことで、複数のルームのアンカーとクロスルームPKを実現できます。現在、1つのルームは最大で他の3つのルームのアンカーとクロスルーム交流が可能で、1つのルームには最大で10人のアンカーが他のルームのアンカーとクロスルーム交流できます。
2. 二つのルームの全てのユーザーは、もう一つのルームからのPKアンカーのオーディオ・ビデオストリームの利用可能コールバックを受け取ります。
@Override
public void onUserAudioAvailable(String userId, boolean available) {
// リモートユーザーが自分のオーディオをパブリッシュ/キャンセル
// 自動購読モードでは、何も操作する必要はありません。SDKはリモートユーザーのオーディオを自動的に再生します。
}

@Override
public void onUserVideoAvailable(String userId, boolean available) {
// リモートユーザーがメインビデオ画面をパブリッシュ/キャンセル
if (available) {
// リモートユーザーのビデオストリームを購読し、ビデオレンダリングコントロールにバインド
mTRTCCloud.startRemoteView(userId, TRTCCloudDef.TRTC_VIDEO_STREAM_TYPE_BIG, TXCloudVideoView view);
} else {
// リモートユーザーのビデオストリームの購読を停止し、レンダリングコントロールをリリース
mTRTCCloud.stopRemoteView(userId, TRTCCloudDef.TRTC_VIDEO_STREAM_TYPE_BIG);
}
}
3. 任意の一方がクロスルームPKを退出します。
// クロスルームPKからの退出
mTRTCCloud.DisconnectOtherRoom();

// クロスルームPKの退出結果コールバック
@Override
public void onDisConnectOtherRoom(int errCode, String errMsg) {
super.onDisConnectOtherRoom(errCode, errMsg);
}
注意:
DisconnectOtherRoom()を呼び出した後、他のすべてのルームのアンカーとのクロスルームPKを退出します。
クロスルームPKの発起側と受信側のどちらでもDisconnectOtherRoom()でクロスルームPKを退出することができます。

サードパーティー顔加工アクセス

RTC Engineはサードパーティ製の美顔製品の導入をサポートしており、以下では美顔ARを例に、サードパーティ製美顔の導入プロセスを説明します。
1. 美顔AR SDKの統合、License認証の申請については、詳細は導入準備手順を参照して実装してください。
2. リソースコピー(該当する場合)。リソースファイルがassetsディレクトリに内蔵されている場合、使用する前にAppのプライベートディレクトリにcopyする必要があります。
XmagicResParser.setResPath(new File(getFilesDir(), "xmagic").getAbsolutePath());
//loading

//copyリソースファイルをプライベートディレクトリにする必要がありますが、一度だけ実行必要です。
XmagicResParser.copyRes(getApplicationContext());
リソースファイルがネットワークから動的にダウンロードされた場合、ダウンロード成功後にリソースファイルのパスを設定する必要があります。
XmagicResParser.setResPath("ダウンロードしたリソースファイルのローカルパス";
3. サードパーティ製美顔のビデオデータコールバックを設定し、美顔 AR SDK が処理した各フレームのデータ結果をRTC Engine SDK内部に渡してレンダリング処理を行います。
mTRTCCloud.setLocalVideoProcessListener(TRTCCloudDef.TRTC_VIDEO_PIXEL_FORMAT_Texture_2D, TRTCCloudDef.TRTC_VIDEO_BUFFER_TYPE_TEXTURE, new TRTCCloudListener.TRTCVideoFrameListener() {
@Override
public void onGLContextCreated() {
// SDK内部のOpenGL環境が作成、この時点でサードパーティー顔加工の初期化作業が可能
if (mXmagicApi == null) {
XmagicApi mXmagicApi = new XmagicApi(context, XmagicResParser.getResPath(), new XmagicApi.OnXmagicPropertyErrorListener());
} else {
mXmagicApi.onResume();
}
}

@Override
public int onProcessVideoFrame(TRTCCloudDef.TRTCVideoFrame srcFrame, TRTCCloudDef.TRTCVideoFrame dstFrame) {
// サードパーティー顔加工コンポーネントをアクセスするためのビデオ処理コールバック
if (mXmagicApi != null) {
dstFrame.texture.textureId = mXmagicApi.process(srcFrame.texture.textureId, srcFrame.width, srcFrame.height);
}
return 0;
}

@Override
public void onGLContextDestory() {
// SDK内部のOpenGL環境が破棄、この時点でサードパーティー顔加工のリソース破棄が可能
mXmagicApi.onDestroy();
}
});
注意:
ステップ1とステップ2は、異なるサードパーティ製美顔製品によって実装方法が異なりますが、ステップ3はRTC Engineがサードパーティ製美顔を統合するための汎用的かつ重要なステップです。

2-wayエンコードモード

2-wayエンコードモードを有効にすると、現在ユーザーのエンコーダーは、「HD大画面」と「SD小画面」の2つのビデオストリームを同時に出力します(ただし、オーディオストリームは1つだけです)。これにより、ルームの他のユーザーは、自分のネットワーク状況や画面のサイズに応じて、「HD大画面」または「SD小画面」を選択して購読できます。
1. 大小画面の2-wayエンコードモードを有効にします。
public void enableDualStreamMode(boolean enable) {
// 小画面のビデオエンコードパラメータ(カスタマイズ可能)
TRTCCloudDef.TRTCVideoEncParam smallVideoEncParam = new TRTCCloudDef.TRTCVideoEncParam();
smallVideoEncParam.videoResolution = TRTCCloudDef.TRTC_VIDEO_RESOLUTION_480_270;
smallVideoEncParam.videoFps = 15;
smallVideoEncParam.videoBitrate = 550;
smallVideoEncParam.videoResolutionMode = TRTCCloudDef.TRTC_VIDEO_RESOLUTION_MODE_PORTRAIT;
mTRTCCloud.enableEncSmallVideoStream(enable, smallVideoEncParam);
}
注意:
2-wayエンコードを開始すると、より多くのCPUとネットワーク帯域幅を消費するため、Mac、Windowsまたは高パフォーマンスのPadでの使用を検討できますが、携帯端末での使用はお勧めしません。
2. リモートユーザーのビデオストリームのプルタイプを選択します。
// リモートユーザーのビデオストリームを購読する際にストリームタイプが選択可能
mTRTCCloud.startRemoteView(userId, streamType, videoView);

// 指定されたリモートユーザーの大画面と小画面をいつでも切り替え可能
mTRTCCloud.setRemoteVideoStreamType(userId, streamType);
注意:
2-wayエンコードを有効にした後、指定されたビデオストリームタイプstreamTypeTRTC_VIDEO_STREAM_TYPE_SMALLに設定することで、低解像度の小画面で視聴することができます。

ビューレンダリングコントロール

RTC Engineには、ビデオ画面を操作する必要があるインターフェースが多くあり、これらのインターフェースではすべてビデオレンダリングコントロールの指定が必要です。Androidプラットフォームでは、TXCloudVideoViewをビデオレンダリングコントロールとして使用し、SurfaceViewTextureViewの2つのレンダリング方式をサポートしています。以下、レンダリングコントロールのタイプを指定する方法と、ビデオレンダリングコントロールを更新する方法について説明します。
1. 特定のプランを強制的に使用したい場合や、ローカルビデオレンダリングコントロールをTXCloudVideoViewに変換したい場合は、以下の方法でプログラムを組めます。
// TextureViewの強制使用
TextureView textureView = findViewById(R.id.texture_view);
TXCloudVideoView cloudVideoView = new TXCloudVideoView(context);
cloudVideoView.addVideoView(textureView);

// SurfaceViewの強制使用
SurfaceView surfaceView = findViewById(R.id.surface_view);
TXCloudVideoView cloudVideoView = new TXCloudVideoView(surfaceView);
2. 業務に表示領域の切り替えに関するインタラクティブなシーンが含まれる場合、RTC Engine SDKを使用してローカルプレビュー画面を更新したり、リモートユーザーのビデオレンダリングコントロール機能を実装したりできます。
// ローカルプレビュー画面のレンダリングコントロールを更新
mTRTCCloud.updateLocalView(videoView);

// リモートユーザーのビデオレンダリングコントロールを更新
mTRTCCloud.updateRemoteView(userId, streamType, videoView);
注意:
パラメーターvideoViewにターゲットビデオレンダリングコントロールを渡します。streamTypeTRTC_VIDEO_STREAM_TYPE_BIGTRTC_VIDEO_STREAM_TYPE_SUBのみに対応します。

例外処理

異常エラー処理

RTC Engine SDK が回復不能なエラーに遭遇すると、onError コールバックでスローされます。詳細は エラーコード表 をご覧ください。
1. UserSig関係。UserSig検証に失敗すると入室に失敗します。UserSigツールを使用して検証できます。
列挙値
取得値
説明
ERR_TRTC_INVALID_USER_SIG
-3320
入室パラメータuserSigが正しくありません。TRTCParams.userSigが空であるかどうかを確認してください。
ERR_TRTC_USER_SIG_CHECK_FAILED
-100018
UserSig検証失敗、パラメータTRTCParams.userSigが正しく入力されているか、または期限切れでないかを確認してください。
2. 入退室関係。入室に失敗した場合は、まず入室パラメータが正しいかどうかを確認してください。また、入退室インターフェースは必ずペアで呼び出す必要があります。入室に失敗した場合でも、退室インターフェースを呼び出す必要があります。
列挙値
取得値
説明
ERR_TRTC_CONNECT_SERVER_TIMEOUT
-3308
入室リクエストがタイムアウトしました。ネットワークが切断されているか、VPNが使用されているかを確認してください。また、4Gに切り替えてテストすることもできます。
ERR_TRTC_INVALID_SDK_APPID
-3317
入室パラメータsdkAppIdエラー。TRTCParams.sdkAppIdが空であるかどうか確認してください。
ERR_TRTC_INVALID_ROOM_ID
-3318
入室パラメータroomIdエラー。TRTCParams.roomIdまたはTRTCParams.strRoomIdが空であるかどうか確認してください。roomIdとstrRoomIdは混在できません。
ERR_TRTC_INVALID_USER_ID
-3319
入室パラメータuserIdが正しくありません。TRTCParams.userIdが空であるかどうかを確認してください。
ERR_TRTC_ENTER_ROOM_REFUSED
-3340
入室リクエストが拒否されました。enterRoomで同じIDのルームに連続して入室しようとしていないか確認してください。
3. デバイス関係。デバイス関連のエラーをリスニングし、関連するエラーが発生した場合にUIでユーザーに通知します。
列挙値
取得値
説明
ERR_CAMERA_START_FAIL
-1301
カメラの起動に失敗しました。例えば、WindowsまたはMacデバイスで、カメラの設定プログラム(ドライバー)に異常があります。デバイスを無効にしてから再度有効にするか、マシンを再起動するか、または設定プログラムを更新してください。
ERR_MIC_START_FAIL
-1302
マイクの起動に失敗しました。例えば、WindowsまたはMacデバイスで、マイクの設定プログラム(ドライバー)に異常があります。デバイスを無効にしてから再度有効にするか、マシンを再起動するか、設定プログラムを更新してください。
ERR_CAMERA_NOT_AUTHORIZED
-1314
カメラが許可されていません。これは通常、モバイルデバイスで発生し、ユーザーによって権限が拒否された可能性があります。
ERR_MIC_NOT_AUTHORIZED
-1317
マイクが許可されていません。これは通常、モバイルデバイスで発生し、ユーザーによって権限が拒否された可能性があります。
ERR_CAMERA_OCCUPY
-1316
カメラが使用中です。他のカメラを試してみてください。
ERR_MIC_OCCUPY
-1319
マイクが使用中です。たとえば、モバイルデバイスが通話中の場合、マイクを開くと失敗します。

リモートイメージモードが無効の場合

RTC Engine 設定画面ミラーリングは、ローカルプレビューミラーリングsetLocalRenderParams とビデオエンコーダーミラーリングsetVideoEncoderMirrorに分かれており、それぞれローカルプレビュー画面のミラーリング効果と、ビデオエンコード出力画面のミラーリング効果(リモート視聴者およびクラウド録画のミラーリングモード)に影響します。ローカルプレビューのイメージエフェクトをリモートの視聴者側で同時に有効にしたい場合は、以下の方法でエンコードしてください。
// ローカル画面のレンダリングパラメータを設定
TRTCCloudDef.TRTCRenderParams params = new TRTCCloudDef.TRTCRenderParams();
params.mirrorType = TRTCCloudDef.TRTC_VIDEO_MIRROR_TYPE_ENABLE; // イメージモード
params.fillMode = TRTCCloudDef.TRTC_VIDEO_RENDER_MODE_FILL; // フィルモード
params.rotation = TRTCCloudDef.TRTC_VIDEO_ROTATION_0; // 回転角度
mTRTCCloud.setLocalRenderParams(params);

// エンコーダー出力のイメージモードを設定
mTRTCCloud.setVideoEncoderMirror(true);

カメラのズーム/フォーカス/切り替えの問題

ECライブ配信シーンでは、配信者がカメラに対してカスタマイズ調整のニーズを持つ場合があり、RTC Engine SDKのデバイス管理クラスにはこのようなニーズに対応する関連インターフェースも用意されています。
1. カメラのズーム倍率を照会および設定します。
// カメラの最大ズーム倍率を取得する(モバイル端末のみ適用)
float zoomRatio = mTRTCCloud.getDeviceManager().getCameraZoomMaxRatio();
// カメラのズーム倍率を設定する(モバイル端末のみ適用)
// 値の範囲1~5、1が最も遠い(通常のカメラ)、5が最も近い(拡大鏡)。推奨最大値は5、5を超えるとビデオデータがぼやけてしまう
mTRTCCloud.getDeviceManager().setCameraZoomRatio(zoomRatio);
2. カメラのフォーカス機能と位置を設定します。
// カメラのオートフォーカス機能をオンまたはオフ(モバイル端末のみ適用)
mTRTCCloud.getDeviceManager().enableCameraAutoFocus(false);
// カメラのフォーカス位置を設定(モバイル端末のみ適用)
// このインターフェースを使用する前提条件は、まずenableCameraAutoFocusでオートフォーカス機能をオフにすることです。
mTRTCCloud.getDeviceManager().setCameraFocusPosition(int x, int y);
3. 判断し、インカメラまたはアウトカメラを切り替えます。
// 現在がインカメラかどうかを判断(モバイル端末のみ適用)
boolean isFrontCamera = mTRTCCloud.getDeviceManager().isFrontCamera();
// インカメラとアウトカメラを切り替え(モバイル端末のみ適用)
// true: に渡すインカメラに。に渡すfalse: アウトカメラに
mTRTCCloud.getDeviceManager().switchCamera(!isFrontCamera);