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

iOS

業務フロー

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



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



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




アクセスの準備

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

ショー配信シーンでは、通常RTC Engine美顔 ARの2つの有料PaaSサービスに依存して構築されます。RTC Engineはリアルタイムのオーディオビデオインタラクション機能を提供し、美顔 ARは美顔エフェクト機能を提供します。サードパーティの美顔製品を使用する場合は、美顔 ARの統合部分を無視できます。
RTC Engineサービスの開通
美顔 AR サービスの開通
1. まず、RTC Engine コンソールにログインしてアプリケーションを作成する必要があります。必要に応じてRTC Engineアプリケーションバージョンをアップグレードできます。例えば、プロフェッショナル版ではより多くの付加価値機能サービスを利用できます。



説明:
テスト環境と本番環境にそれぞれ使用するために2つのアプリケーションを作成することをお勧めします。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の使用方法を確認できます。




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

RTC Engine SDKと美顔 AR SDKはCocoaPodsライブラリに公開されており、CocoaPodsを通じて統合できます。
1. インストールCocoaPods。ターミナルウィンドウで以下のコマンドを入力してください(Macで事前にRuby環境をインストールする必要があります)。
sudo gem install cocoapods
2. Podfileを作成。プロジェクトのパスに移動し、以下のコマンドラインを入力すると、プロジェクトのパスにPodfileが表示されます。
pod init
3. Podfileを編集。プロジェクトのニーズに応じて適切なバージョンを選択し、Podfileファイルを編集してください。
platform :ios, '8.0'
target 'App' do
# RTC Engine 軽量版
# インストールパッケージのサイズ増加が最小限ですが、RTC Engineとライブプレーヤー(TXLivePlayer)の2つの機能のみをサポートしています。
pod 'TXLiteAVSDK_TRTC', :podspec => 'https://liteav.sdk.qcloud.com/pod/liteavsdkspec/TXLiteAVSDK_TRTC.podspec'
# Professional版
# RTC Engine、ライブプレーヤー(TXLivePlayer)、RTMPプッシュ(TXLivePusher)、オンデマンドプレーヤー(TXVodPlayer)、ショートビデオ録画・編集(UGSV)など、多数の機能を含みます。
# pod 'TXLiteAVSDK_Professional', :podspec => 'https://liteav.sdk.qcloud.com/pod/liteavsdkspec/TXLiteAVSDK_Professional.podspec'
# 美顔AR SDK 例:S1-07プランは以下の通り
pod 'TencentEffect_S1-07'

end
4. SDKを更新してインストール
ターミナルウィンドウで以下のコマンドを入力して、ローカルレポジトリーファイルを更新し、SDKをインストールしま。
pod install
あるいは以下のコマンドを使用して、ローカルレポジトリーのバージョンを更新してください。
pod update
pod命令を実行した後、SDKが統合された.xcworkspaceの拡張子を持つプロジェクトファイルが生成され、ダブルクリックで開けます。
説明:
pod検索に失敗した場合、podのローカルrepoキャッシュを更新することをお勧めします。更新コマンドは以下の通りです。
pod setup
pod repo update
rm ~/Library/Caches/CocoaPods/search_index.json
推奨される自動ロード方式に加えて、SDKをダウンロードして手動でインポートすることもできます。詳細はRTC Engine SDK の手動統合美顔 AR SDKの手動統合 をご参照ください。
5. 実際のプロジェクトに美顔リソースを追加する
5.1 対応するプランのSDKと美顔リソースをダウンロードして解凍し、resources/motionResフォルダ内のbundleリソースを実際のプロジェクトに追加してください。
5.2 Build SettingsのOther Linker Flagsの中に-ObjCを追加します。
6. Bundle Identifierを申請されたテスト権限と一致させてください。

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

1. 権限設定
ショールーム配信シーンでは、RTC Engine SDK及び美顔AR SDKに以下の権限が必要です。 AppのInfo.plistに以下2項目を追加します。これらはそれぞれ、システムが権限付与ダイアログを表示する際のマイクとカメラへのプロンプトメッセージに対応します。
Privacy - Microphone Usage Description、そしてマイク使用目的も入力してください。
Privacy - Camera Usage Description、そしてカメラ使用目的も入力してください。



2. バックグラウンドでApp関連機能を継続して実行する必要がある場合は、Xcodeで現在のプロジェクトを選択し、Capabilitiesで設定項目Background ModesをONに設定し、Audio, AirPlay and Picture in Pictureにチェックを入れてください。以下の図に示されたように。




ステップ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が必要です。サンプルコードは以下の通りです。
[TELicenseCheck setTELicense:LicenseURL key:LicenseKey completion:^(NSInteger authresult, NSString * _Nonnull errorMsg) {
if (authresult == TELicenseCheckOk) {
NSLog(@"認証成功");
} else {
NSLog(@"認証失敗");
}
}];
注意:
関連業務モジュールの初期化コードで認証許可をトリガーすることをお勧めします。これにより、使用直前にLicenseをダウンロードすることを避けることができます。また、認証時にはネットワーク権限が必要です。
実際のアプリケーションのBundle IDは、License作成時にバインドされたBundle IDと完全に一致していなければならず、そうでない場合はLicenseの検証に失敗し、詳細は認証エラーコードを参照してください。

ステップ5:SDKの初期化

RTC Engine SDKの初期化
美顔 AR SDKの初期化
// RTC Engine SDK インスタンスの作成(シングルトンパターン)
self.trtcCloud = [TRTCCloud sharedInstance];
// イベントリスナーを設定する
self.trtcCloud.delegate = self;

// SDKからの各種イベント通知(例:エラーコード、警告コード、オーディオ・ビデオの状態パラメータなど)
- (void)onError:(TXLiteAVError)errCode errMsg:(nullable NSString *)errMsg extInfo:(nullable NSDictionary *)extInfo {
NSLog(@"%d: %@", errCode, errMsg);
}

- (void)onWarning:(TXLiteAVWarning)warningCode warningMsg:(nullable NSString *)warningMsg extInfo:(nullable NSDictionary *)extInfo {
NSLog(@"%d: %@", warningCode, warningMsg);
}

// イベントリスナーを削除
self.trtcCloud.delegate = nil;
// RTC Engine SDK インスタンスの破棄(シングルトンパターン)
[TRTCCloud destroySharedIntance];
説明:
SDKイベント通知のリスニングを推奨します。一般的なエラーに関するログ出力と処理についての詳細はエラーコード表を参照してください。
// 美顔関連リソースを読み込む
NSDictionary *assetsDict = @{@"core_name":@"LightCore.bundle",
@"root_path":[[NSBundle mainBundle] bundlePath]
};

// Tencent Effect SDKの初期化
self.beautyKit = [[XMagic alloc] initWithRenderSize:previewSize assetsDict:assetsDict];

// Tencent Effect SDKをリリース
[self.beautyKit deinit]
説明:
美顔 AR SDKを初期化する前に、リソースのコピーなどの準備作業が必要です。詳細な手順については、美顔 AR SDK 使用プロセスをご参照ください。

アクセスの流れ

APIタイムライン図





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

1. アンカーが入室する前に、ローカルビデオのプレビューとオーディオのキャプチャーを開始します。
// アンカーのローカル画面のプレビューを表示するためのビデオレンダリングコントロールを取得
@property (nonatomic, strong) UIView *anchorPreviewView;
@property (nonatomic, strong) TRTCCloud *trtcCloud;

- (void)setupTRTC {
self.trtcCloud = [TRTCCloud sharedInstance];
self.trtcCloud.delegate = self;
// ビデオエンコードのパラメータを設定し、リモートのユーザーが見る画面の品質を決定
TRTCVideoEncParam *encParam = [[TRTCVideoEncParam alloc] init];
encParam.videoResolution = TRTCVideoResolution_960_540;
encParam.videoFps = 15;
encParam.videoBitrate = 1300;
encParam.resMode = TRTCVideoResolutionModePortrait;
[self.trtcCloud setVideoEncoderParam:encParam];
// ビデオキャプチャーには、isFrontCameraでフロント/アウトカメラを指定できます。
[self.trtcCloud startLocalPreview:self.isFrontCamera view:self.anchorPreviewView];

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

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

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

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

1. 視聴者がRTC Engine ルームに入室。
- (void)enterRoomByAudienceWithUserId:(NSString *)userId roomId:(NSString *)roomId {
TRTCParams *params = [[TRTCParams alloc] init];
// 文字列のルーム番号を例に
params.strRoomId = roomId;
params.userId = userId;
// 業務バックエンドから取得したUserSig
params.userSig = @"userSig";
// 自分のSDKAppIDに置き換える
params.sdkAppId = 0;
// 指定視聴者ロール
params.role = TRTCRoleAudience;
// インタラクティブライブシナリオで入室
[self.trtcCloud enterRoom:params appScene:TRTCAppSceneLIVE];
}

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

- (void)onUserVideoAvailable:(NSString *)userId available:(BOOL)available {
// リモートユーザーがメインビデオ画面をパブリッシュ/キャンセル
if (available) {
// リモートユーザーのビデオストリームを購読し、ビデオレンダリングコントロールにバインド
[self.trtcCloud startRemoteView:userId streamType:TRTCVideoStreamTypeBig view:self.remoteView];
} else {
// リモートユーザーのビデオストリームの購読を停止し、レンダリングコントロールをリリース
[self.trtcCloud stopRemoteView:userId streamType:TRTCVideoStreamTypeBig];
}
}
3. 視聴者がリモート画面のレンダリングモードを設定します(任意項目)。
- (void)setupRemoteRenderParams {
TRTCRenderParams *params = [[TRTCRenderParams alloc] init];
// イメージモード
params.mirrorType = TRTCVideoMirrorTypeAuto;
// フィルモード
params.fillMode = TRTCVideoFillMode_Fill;
// 回転角度
params.rotation = TRTCVideoRotation_0;
// リモート画面のレンダリングモードを設定
[self.trtcCloud setRemoteRenderParams:@"userId" streamType:TRTCVideoStreamTypeBig params:params];
}

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

1. 視聴者がアンカーロールに切り替わります。
- (void)switchToAnchor {
// アンカーロールに切り替え
[self.trtcCloud switchRole:TRTCRoleAnchor];
}

// ロール切り替えイベントコールバック
- (void)onSwitchRole:(TXLiteAVError)errCode errMsg:(NSString *)errMsg {
if (errCode == ERR_NULL) {
// ロールの切り替えに成功
}
}
2. 視聴者がローカルのオーディオ・ビデオのキャプチャーおよびプッシュを開始します。
- (void)setupTRTC {
// ビデオエンコードのパラメータを設定し、リモートのユーザーが見る画面の品質を決定
TRTCVideoEncParam *encParam = [[TRTCVideoEncParam alloc] init];
encParam.videoResolution = TRTCVideoResolution_480_270;
encParam.videoFps = 15;
encParam.videoBitrate = 550;
encParam.resMode = TRTCVideoResolutionModePortrait;
[self.trtcCloud setVideoEncoderParam:encParam];
// ビデオキャプチャーには、isFrontCameraでフロント/アウトカメラを指定できます。
[self.trtcCloud startLocalPreview:self.isFrontCamera view:self.audiencePreviewView];
// ここでは音声品質を指定。低いから高い順:SPEECH/DEFAULT/MUSIC
[self.trtcCloud startLocalAudio:TRTCAudioQualityDefault];
}
注意:
業務のニーズに応じて、ビデオエンコーディングのパラメータTRTCVideoEncParamを自由に設定できます。各グレードの最適な解像度とビットレートの組み合わせの詳細は、解像度ビットレート参照表を参照してください。
3. 視聴者がマイクオフにし、プッシュを停止します。
- (void)switchToAudience {
// 視聴者ロールに切り替える
[self.trtcCloud switchRole:TRTCRoleAudience];
}

// ロール切り替えイベントコールバック
- (void)onSwitchRole:(TXLiteAVError)errCode errMsg:(NSString *)errMsg {
if (errCode == ERR_NULL) {
// カメラのキャプチャーのパブリッシュを停止
[self.trtcCloud stopLocalPreview];
// マイクのキャプチャー及びパブリッシュを停止
[self.trtcCloud stopLocalAudio];
}
}

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

1. ルームから退出
- (void)exitRoom {
[self.trtcCloud stopLocalAudio];
[self.trtcCloud stopLocalPreview];
[self.trtcCloud exitRoom];
}

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

高度機能

アンカーのクロスルームPK

1. 任意の一方がクロスルームPKを発起します。
- (void)connectOtherRoom:(NSString *)roomId {
NSMutableDictionary *jsonDict = [[NSMutableDictionary alloc] init];
// 数字のルーム番号はroomIdです。
[jsonDict setObject:roomId forKey:@"strRoomId"];
[jsonDict setObject:self.userId forKey:@"userId"];
NSData *jsonData = [NSJSONSerialization dataWithJSONObject:jsonDict options:NSJSONWritingPrettyPrinted error:nil];
NSString *jsonString = [[NSString alloc] initWithData:jsonData encoding:NSUTF8StringEncoding];
[self.trtcCloud connectOtherRoom:jsonString];
}

// クロスルームPKのレスポンスコールバック
- (void)onConnectOtherRoom:(NSString *)userId errCode:(TXLiteAVError)errCode errMsg:(NSString *)errMsg {
// クロスルームアンカーと交流したいユーザーID
// エラーコード、ERR_NULLはリクエスト成功
// エラーメッセージ
}
注意:
クロスルームPK交流のローカルユーザーとリモートユーザーは、両方ともアンカーロールでなければならず、両方とも音声またはビデオのアップストリームが必要です。
2. 二つのルームの全てのユーザーは、もう一つのルームからのPKアンカーのオーディオ・ビデオストリームの利用可能コールバックを受け取ります。
- (void)onUserAudioAvailable:(NSString *)userId available:(BOOL)available {
// リモートユーザーが自分のオーディオをパブリッシュ/キャンセル
// 自動購読モードでは、何も操作する必要はありません。SDKはリモートユーザーのオーディオを自動的に再生します。
}

- (void)onUserVideoAvailable:(NSString *)userId available:(BOOL)available {
// リモートユーザーがメインビデオ画面をパブリッシュ/キャンセル
if (available) {
// リモートユーザーのビデオストリームを購読し、ビデオレンダリングコントロールにバインド
[self.trtcCloud startRemoteView:userId streamType:TRTCVideoStreamTypeBig view:self.remoteView];
} else {
// リモートユーザーのビデオストリームの購読を停止し、レンダリングコントロールをリリース
[self.trtcCloud stopRemoteView:userId streamType:TRTCVideoStreamTypeBig];
}
}
3. 任意の一方がクロスルームPKを退出します。
// クロスルームPKからの退出
[self.trtcCloud disconnectOtherRoom];

// クロスルームPKの退出結果コールバック
- (void)onDisconnectOtherRoom:(TXLiteAVError)errCode errMsg:(NSString *)errMsg {
}
注意:
DisconnectOtherRoom()を呼び出した後、他のすべてのルームのアンカーとのクロスルームPKを退出します。
クロスルームPKの発起側と受信側のどちらでもDisconnectOtherRoom()でクロスルームPKを退出することができます。

サードパーティー美顔アクセス

RTC Engineはサードパーティ製の美顔エフェクト製品の導入をサポートしており、以下では美顔ARを例に、サードパーティ製美顔の導入プロセスを説明します。
1. 美顔AR SDKの統合、License認証の申請については、詳細は導入準備手順を参照して実装してください。
2. SDK素材リソースパスを設定します(存在する場合)。
NSString *beautyConfigPath = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) lastObject];
beautyConfigPath = [beautyConfigPath stringByAppendingPathComponent:@"beauty_config.json"];
NSFileManager *localFileManager=[[NSFileManager alloc] init];
BOOL isDir = YES;
NSDictionary * beautyConfigJson = @{};
if ([localFileManager fileExistsAtPath:beautyConfigPath isDirectory:&isDir] && !isDir) {
NSString *beautyConfigJsonStr = [NSString stringWithContentsOfFile:beautyConfigPath encoding:NSUTF8StringEncoding error:nil];
NSError *jsonError;
NSData *objectData = [beautyConfigJsonStr dataUsingEncoding:NSUTF8StringEncoding];
beautyConfigJson = [NSJSONSerialization JSONObjectWithData:objectData
options:NSJSONReadingMutableContainers
error:&jsonError];
}
NSDictionary *assetsDict = @{@"core_name":@"LightCore.bundle",
@"root_path":[[NSBundle mainBundle] bundlePath],
@"tnn_"
@"beauty_config":beautyConfigJson
};
// SDKの初期化:widthとheightはそれぞれtextureの幅と高さ
self.xMagicKit = [[XMagic alloc] initWithRenderSize:CGSizeMake(width,height) assetsDict:assetsDict];
3. サードパーティ製美顔のビデオデータコールバックを設定し、美顔SDKが処理した各フレームのデータ結果をRTC Engine SDK内部に渡してレンダリング処理を行います。
// RTC Engine SDK がサードパーティ製美顔のビデオデータコールバックを設定します
[self.trtcCloud setLocalVideoProcessDelegete:self pixelFormat:TRTCVideoPixelFormat_Texture_2D bufferType:TRTCVideoBufferType_Texture];

#pragma mark - TRTCVideoFrameDelegate

// YTProcessInputを作成しSDKに渡してレンダリング処理を実行
- (uint32_t)onProcessVideoFrame:(TRTCVideoFrame *_Nonnull)srcFrame dstFrame:(TRTCVideoFrame *_Nonnull)dstFrame {
if (!self.xMagicKit) {
[self buildBeautySDK:srcFrame.width and:srcFrame.height texture:srcFrame.textureId];// XMagic SDKを初期化
self.heightF = srcFrame.height;
self.widthF = srcFrame.width;
}
if(self.xMagicKit!=nil && (self.heightF!=srcFrame.height || self.widthF!=srcFrame.width)){
self.heightF = srcFrame.height;
self.widthF = srcFrame.width;
[self.xMagicKit setRenderSize:CGSizeMake(srcFrame.width, srcFrame.height)];
}
YTProcessInput *input = [[YTProcessInput alloc] init];
input.textureData = [[YTTextureData alloc] init];
input.textureData.texture = srcFrame.textureId;
input.textureData.textureWidth = srcFrame.width;
input.textureData.textureHeight = srcFrame.height;
input.dataType = kYTTextureData;
YTProcessOutput *output = [self.xMagicKit process:input withOrigin:YtLightImageOriginTopLeft withOrientation:YtLightCameraRotation0];
dstFrame.textureId = output.textureData.texture;
return 0;
}
注意:
ステップ1とステップ2は、異なるサードパーティ製美顔製品によって実装方法が異なりますが、ステップ3はRTC Engineがサードパーティ製美顔を統合するための汎用的かつ重要なステップです。

2-wayエンコードモード

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

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

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

業務に表示領域の切り替えに関するインタラクティブなシーンが含まれる場合、RTC Engine SDKを使用してローカルプレビュー画面を更新したり、リモートユーザーのビデオレンダリングコントロール機能を実装したりできます。
// ローカルプレビュー画面のレンダリングコントロールを更新
[self.trtcCloud updateLocalView:view];

// リモートユーザーのビデオレンダリングコントロールを更新
[self.trtcCloud updateRemoteView:view streamType:TRTCVideoStreamTypeBig forUser:userId];
注意:
パラメーターviewにターゲットビデオレンダリングコントロールを渡します。streamTypeTRTCVideoStreamTypeBigTRTCVideoStreamTypeSubのみに対応します。

ライブ配信のインタラクティブメッセージ

ライブ配信でのインタラクションは、ライブシナリオで特に重要です。ユーザーはいいねメッセージギフトメッセージ弾幕メッセージなどの方法でアンカーとインタラクションを行います。ライブ配信インタラクション機能を実装するには、Chatサービスの有効化とChat SDKのインポートが必要です。詳細なガイドはボイスチャットルームアクセスガイド-アクセスの準備を参照してください。

いいねメッセージ

1. クライアントでいいねに関連するグループカスタムメッセージを送信し、送信成功後に業務側でローカルにいいねエフェクトをレンダリングします。
// いいねメッセージのボディー
NSDictionary *msgDict = @{
@"type": @1, // いいねの種類
@"likeCount": @10 // いいねの数
};
NSDictionary *dataDict = @{
@"cmd": @"like_msg",
@"msg": msgDict
};
NSError *error;
NSData *data = [NSJSONSerialization dataWithJSONObject:dataDict options:0 error:&error];

// グループカスタムメッセージを送信(「いいね」メッセージは低優先度に設定することをお勧めします)
[[V2TIMManager sharedInstance] sendGroupCustomMessage:data to:groupID priority:V2TIM_PRIORITY_LOW succ:^{
// いいねメッセージの送信に成功
// ローカルでの「いいね」エフェクトのレンダリング
} fail:^(int code, NSString *desc) {
// いいねメッセージの送信に失敗
}];
2. ルーム内の他のユーザークライアントがグループカスタムメッセージのコールバックを受信し、メッセージを解析していいねエフェクトをレンダリングします。
// グループカスタムメッセージを受信
[[V2TIMManager sharedInstance] addSimpleMsgListener:self];
- (void)onRecvGroupCustomMessage:(NSString *)msgID groupID:(NSString *)groupID sender:(V2TIMGroupMemberInfo *)info customData:(NSData *)data {
if (data.length > 0) {
NSError *error;
NSDictionary *dataDict = [NSJSONSerialization JSONObjectWithData:data options:0 error:&error];
if (!error) {
NSString *command = dataDict[@"cmd"];
NSDictionary *msgDict = dataDict[@"msg"];
if ([command isEqualToString:@"like_msg"]) {
NSNumber *type = msgDict[@"type"]; // いいねの種類
NSNumber *likeCount = msgDict[@"likeCount"]; // いいねの数
// いいねの種類と数に応じていいねの効果をレンダリング
}
} else {
NSLog(@"解析エラー: %@", error.localizedDescription);
}
}
}

ギフトメッセージ

1. ギフト発送側が業務サーバーにリクエストを送り、業務サーバーが課金決済を完了した後にREST APIを呼び出してグループにカスタムメッセージを送信します。
1.1 リクエストURLサンプル
https://xxxxxx/v4/group_open_http_svc/send_group_msg?sdkappid=88888888&identifier=admin&usersig=xxx&random=99999999&contenttype=json
1.2 リクエストボディサンプル
{
"GroupId": "@TGS#12DEVUDHQ",
"Random": 2784275388,
"MsgPriority": "High", // メッセージの優先度、ギフトメッセージは高優先度に設定するべきです
"MsgBody": [
{
"MsgType": "TIMCustomElem",
"MsgContent": {
// type: ギフトタイプ; giftUrl: ギフトリソースアドレス; giftName: ギフト名称; giftCount: ギフト数
"Data": "{\"cmd\": \"gift_msg\", \"msg\": {\"type\": 1, \"giftUrl\": \"xxx\", \"giftName\": \"xxx\", \"giftCount\": 1}}"
}
}
]
}
2. ルーム内の他のユーザークライアントがグループカスタムメッセージのコールバックを受信し、その後メッセージを解析してギフトエフェクトをレンダリングします。
// グループカスタムメッセージを受信
[[V2TIMManager sharedInstance] addSimpleMsgListener:self];
- (void)onRecvGroupCustomMessage:(NSString *)msgID groupID:(NSString *)groupID sender:(V2TIMGroupMemberInfo *)info customData:(NSData *)data {
if (data.length > 0) {
NSError *error;
NSDictionary *dataDict = [NSJSONSerialization JSONObjectWithData:data options:0 error:&error];
if (!error) {
NSString *command = dataDict[@"cmd"];
NSDictionary *msgDict = dataDict[@"msg"];
if ([command isEqualToString:@"gift_msg"]) {
NSNumber *type = msgDict[@"type"]; // ギフトタイプ
NSNumber *giftCount = msgDict[@"giftCount"]; // ギフトの数
NSString *giftUrl = msgDict[@"giftUrl"]; // ギフトリソースアドレス
NSString *giftName = msgDict[@"giftName"]; // ギフト名称
// ギフトタイプ、ギフト数、ギフトリソースアドレス、ギフト名称に基づいてギフトのエフェクトをレンダリングします。
}
} else {
NSLog(@"解析エラー: %@", error.localizedDescription);
}
}
}

弾幕メッセージ

ショー配信ルームでは通常、テキスト形式の弾幕メッセージによるインタラクションがあり、これは Chat のグループチャット通常テキストメッセージの送信及び受信によって実現できます。
// パブリックチャットに弾幕メッセージを送信
[[V2TIMManager sharedInstance] sendGroupTextMessage:text to:groupID priority:V2TIM_PRIORITY_NORMAL succ:^{
// 弾幕メッセージの送信に成功
// ローカルにメッセージテキストを表示
} fail:^(int code, NSString *desc) {
// 弾幕メッセージの送信に失敗
}];

// パブリックチャットの弾幕メッセージを受信
[[V2TIMManager sharedInstance] addSimpleMsgListener:self];
- (void)onRecvGroupTextMessage:(NSString *)msgID groupID:(NSString *)groupID sender:(V2TIMGroupMemberInfo *)info text:(NSString *)text {
// 送信者情報infoとメッセージテキストtextに基づいて弾幕メッセージをレンダリング
}
注意:
ギフトメッセージを高優先度に設定することをお勧めします。弾幕メッセージは通常の優先度に設定し、いいねメッセージは低優先度に設定してください。
自分はクライアントでグループチャットメッセージを送信しても、メッセージ受信コールバックはトリガーされません。グループ内の他のユーザーのみが受信できます。

異常処理

異常エラー処理

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に分かれており、それぞれローカルプレビュー画面のミラーリング効果と、ビデオエンコード出力画面のミラーリング効果(リモート視聴者およびクラウド録画のミラーリングモード)に影響します。ローカルプレビューのイメージエフェクトをリモートの視聴者側で同時に有効にしたい場合は、以下の方法でエンコードしてください。
// ローカル画面のレンダリングパラメータを設定
TRTCRenderParams *params = [[TRTCRenderParams alloc] init];
params.mirrorType = TRTCVideoMirrorTypeEnable; // イメージモード
params.fillMode = TRTCVideoFillMode_Fill; // フィルモード
params.rotation = TRTCVideoRotation_0; // 回転角度
[self.trtcCloud setLocalRenderParams:params];
// エンコーダー出力のイメージモードを設定
[self.trtcCloud setVideoEncoderMirror:YES];

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

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