製品概要
製品の利点
応用シナリオ









App Name、Package Name、Bundle IDを記入し、プレーヤー高級版を選択し、確定をクリックします。

sudo gem install cocoapods
pod init
platform :ios, '8.0'target 'App' do# フル機能版SDK# 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
pod install
pod update
pod setuppod repo updaterm ~/Library/Caches/CocoaPods/search_index.json
-ObjCを追加します。


[TELicenseCheck setTELicense:LicenseURL key:LicenseKey completion:^(NSInteger authresult, NSString * _Nonnull errorMsg) {if (authresult == TELicenseCheckOk) {NSLog(@"認証成功");} else {NSLog(@"認証失敗");}}];
- [AppDelegate application:didFinishLaunchingWithOptions:]クラスで以下の設定をすることをお勧めします。- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {NSString * const licenceURL = @"<取得したlicenseUrl>";NSString * const licenceKey = @"<取得したkey>";// TXLiveBaseはヘッダーファイル"TXLiveBase.h"にあります。[TXLiveBase setLicence:licenceURL key:licenceKey];[TXLiveBase setObserver:self];NSLog(@"SDK Version = %@", [TXLiveBase getSDKVersionStr]);return YES;}#pragma mark - TXLiveBaseDelegate- (void)onLicenceLoaded:(int)result Reason:(NSString *)reason {NSLog(@"onLicenceLoaded: result:%d reason:%@", result, reason);// resultが0でない場合、設定に失敗したことを意味し、再試行が必要if (result != 0) {[TXLiveBase setLicence:licenceURL key:licenceKey];}}@end
NSLog(@"%@", [TXLiveBase getLicenceInfo]);
// 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];
// 顔加工関連リソースを読み込む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];
// 1.SDKアクセス環境を設定// もしグローバルのユーザーがサービス対象の場合、SDKアクセス環境をグローバルアクセス環境に設定してください。[TXLiveBase setGlobalEnv:"GDPR"];// 2.Player作成TXVodPlayer *_txVodPlayer = [[TXVodPlayer alloc] init];// 3.レンダリングViewに関連付ける[_txVodPlayer setupVideoWidget:_myView insertIndex:0];// 4.プレーヤーパラメータの設定TXVodPlayConfig *_config = [[TXVodPlayConfig alloc]init];[_config setEnableAccurateSeek:true]; // 精密seekするか、デフォルトはtrue[_config setMaxCacheItems:5]; // キャッシュファイルの数を5に設定[_config setProgressInterval:200]; // 進行状況のコールバック間隔を設定、単位はミリ秒[_config setMaxBufferSize:50]; // 最大プリロードサイズ、単位はMB[_txVodPlayer setConfig:_config]; // configを_txVodPlayerに渡す// 5.プレーヤーイベントリスニング- (void)onPlayEvent:(TXVodPlayer *)player event:(int)EvtID withParam:(NSDictionary*)param { if (EvtID == PLAY_EVT_VOD_PLAY_PREPARED) { //プレーヤー準備完了のイベントを受信する際に、pause、resume、getWidth、getSupportedBitratesなどのインターフェースを使用可能 } else if (EvtID == PLAY_EVT_PLAY_BEGIN) { // 開始再生イベントを受信 } else if (EvtID == PLAY_EVT_PLAY_END) { // 開始終了イベントを受信 } }
// 1.Player作成V2TXLivePlayer *_txLivePlayer = [[V2TXLivePlayer alloc] init];// 2.レンダリングViewに関連付ける[_txLivePlayer setRenderView:_myView];// 3.プレーヤーイベントリスニング[_txLivePlayer setObserver:self];- (void)onVideoLoading:(id<V2TXLivePlayer>)player extraInfo:(NSDictionary *)extraInfo {// ビデオ読み込みイベント}- (void)onVideoPlaying:(id<V2TXLivePlayer>)player firstPlay:(BOOL)firstPlay extraInfo:(NSDictionary *)extraInfo {// ビデオ再生イベント}
// アンカーのローカル画面のプレビューを表示するためのビデオレンダリングコントロールを取得@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];}
enterRoomの前に、上記のインターフェースを呼び出すと、SDKはカメラのプレビューとオーディオのキャプチャーのみを開始し、enterRoomを呼び出した後にのみプッシュを開始します。enterRoomの後に、上記のインターフェースを呼び出すと、SDKはカメラのプレビューとオーディオのキャプチャーを開始し、自動的にプッシュを開始します。- (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];}
- (void)enterRoomByAnchorWithUserId:(NSString *)userId roomId:(NSString *)roomId {TRTCParams *params = [[TRTCParams alloc] init];// 文字列のルーム番号を例にparams.strRoomId = roomId;params.userId = userId;// 業務バックエンドから取得したUserSigparams.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!");}}
roomIdと文字列型のstrRoomIdに分かれており、2種類のルームは相互接続されません。ルーム番号のタイプを統一することをお勧めします。TRTCAppSceneLIVEを選択することをお勧めします。- (void)enterRoomByAudienceWithUserId:(NSString *)userId roomId:(NSString *)roomId {TRTCParams *params = [[TRTCParams alloc] init];// 文字列のルーム番号を例にparams.strRoomId = roomId;params.userId = userId;// 業務バックエンドから取得したUserSigparams.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!");}}
- (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];}}
- (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];}
- (void)switchToAnchor {// アンカーロールに切り替え[self.trtcCloud switchRole:TRTCRoleAnchor];}// ロール切り替えイベントコールバック- (void)onSwitchRole:(TXLiteAVError)errCode errMsg:(NSString *)errMsg {if (errCode == ERR_NULL) {// ロールの切り替えに成功}}
- (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];}
- (void)switchToAudience {// 視聴者ロールに切り替える[self.trtcCloud switchRole:TRTCRoleAudience];}// ロール切り替えイベントコールバック- (void)onSwitchRole:(TXLiteAVError)errCode errMsg:(NSString *)errMsg {if (errCode == ERR_NULL) {// カメラのキャプチャーのパブリッシュを停止[self.trtcCloud stopLocalPreview];// マイクのキャプチャー及びパブリッシュを停止[self.trtcCloud stopLocalAudio];}}
- (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(@"現在のルームは解散されました");}}
onExitRoomコールバック通知をスローして知らせます。enterRoomを呼び出す場合や他のオーディオ・ビデオSDKに切り替える場合は、onExitRoomコールバックが終わるまで関連操作を行わないでください。そうしないと、カメラやマイクが強制的に使用されるなど、さまざまな異常が発生する可能性があります。DismissRoom と文字列型ルーム解散API DismissRoomByStrRoomId を提供しています。サーバー側のルーム解散インターフェースを呼び出すことで、ルーム内のすべてのユーザーをルームから退室させ、ルームを解散することができます。// 商品ポップアップメッセージのボディーNSDictionary *msgDict = @{@"itemNumber": @1, // 商品番号@"itemPrice": @199.0, // 商品価格@"itemTitle": @"xxx", // 商品タイトル@"itemUrl": @"xxx" // 商品画像URL};NSDictionary *dataDict = @{@"cmd": @"item_popup_msg",@"msg": msgDict};NSError *error;NSData *data = [NSJSONSerialization dataWithJSONObject:dataDict options:0 error:&error];// グループカスタムメッセージを送信(「商品ポップアップ」メッセージは高優先度に設定することをお勧めします)[[V2TIMManager sharedInstance] sendGroupCustomMessage:data to:groupID priority:V2TIM_PRIORITY_HIGH succ:^{// 商品ポップアップメッセージの送信に成功// ローカルでの「商品ポップアップ」エフェクトのレンダリング} fail:^(int code, NSString *desc) {// 商品ポップアップメッセージの送信に失敗}];
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\\"}}"}}]}
// グループカスタムメッセージを受信[[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:@"item_popup_msg"]) {NSNumber *itemNumber = msgDict[@"itemNumber"]; // 商品番号NSNumber *itemPrice = msgDict[@"itemPrice"]; // 商品価格NSString *itemTitle = msgDict[@"itemTitle"]; // 商品タイトルNSString *itemUrl = msgDict[@"itemUrl"]; // 商品画像URL// 商品番号、商品価格、商品タイトル、商品画像URLに基づいて、商品ポップアップ効果をレンダリング}} else {NSLog(@"解析エラー:%@", error.localizedDescription);}}}
// 商品ポップアップメッセージのボディーNSDictionary *msgDict = @{@"itemNumber": @1, // 商品番号@"itemPrice": @199.0, // 商品価格@"itemTitle": @"xxx", // 商品タイトル@"itemUrl": @"xxx" // 商品画像URL};NSDictionary *dataDict = @{@"cmd": @"item_popup_msg",@"msg": msgDict};NSError *error;NSData *data = [NSJSONSerialization dataWithJSONObject:dataDict options:0 error:&error];// SEI情報の送信[self.trtcCloud sendSEIMsg:data repeatCount:1];
// TRTCイベントリスナーを設定するself.trtcCloud.delegate = self;// SEIメッセージを受信- (void)onRecvSEIMsg:(NSString *)userId message:(NSData *)message {if (message.length > 0) {NSError *error;NSDictionary *dataDict = [NSJSONSerialization JSONObjectWithData:message options:0 error:&error];if (!error) {NSString *command = dataDict[@"cmd"];NSDictionary *msgDict = dataDict[@"msg"];if ([command isEqualToString:@"item_popup_msg"]) {NSNumber *itemNumber = msgDict[@"itemNumber"]; // 商品番号NSNumber *itemPrice = msgDict[@"itemPrice"]; // 商品価格NSString *itemTitle = msgDict[@"itemTitle"]; // 商品タイトルNSString *itemUrl = msgDict[@"itemUrl"]; // 商品画像URL// 商品番号、商品価格、商品タイトル、商品画像URLに基づいて、商品ポップアップ効果をレンダリング}} else {NSLog(@"解析エラー:%@", error.localizedDescription);}}}
// URLビデオリソースを再生NSString* url = @"http://1252463788.vod2.myqcloud.com/xxxxx/v.f20.mp4";[_txVodPlayer startVodPlay:url];// ローカルのサンドボックスビデオリソースを再生// Documentsのパスを取得NSString *documentPath = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) firstObject];// ローカルビデオのパスを取得NSString *videoPath = [NSString stringWithFormat:@"%@/video1.m3u8",documentPath];[_txVodPlayer startVodPlay:videoPath];
TXPlayerAuthParams *p = [TXPlayerAuthParams new];p.appId = 1252463788;p.fileId = @"4564972819220421305";// psign、つまりプレーヤーの署名、署名の紹介と生成方法はリンクを参照してください:https://www.tencentcloud.com/document/product/266/42436?from_cn_redirect=1p.sign = @"psignxxxxx"; // プレーヤーの署名[_txVodPlayer startVodPlayWithParams:p];
// プログレス調整(秒)[_txVodPlayer seek:time];// 一時停止[_txVodPlayer pause];// 再生再開[_txVodPlayer resume];// 再生終了[_txVodPlayer stopPlay];
removeVideoWidgetでviewコントロールを破棄することを忘れないでください。// viewコントロールを破棄[_txVodPlayer removeVideoWidget];
- (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はリクエスト成功// エラーメッセージ}
ConnectOtherRoom()を数回呼び出すことで、複数のルームのアンカーとクロスルームPKを実現できます。現在、1つのルームは最大で他の3つのルームのアンカーとクロスルーム交流が可能で、1つのルームには最大で10人のアンカーが他のルームのアンカーとクロスルーム交流できます。- (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];}}
// クロスルームPKからの退出[self.trtcCloud disconnectOtherRoom];// クロスルームPKの退出結果コールバック- (void)onDisconnectOtherRoom:(TXLiteAVError)errCode errMsg:(NSString *)errMsg {}
DisconnectOtherRoom()を呼び出した後、他のすべてのルームのアンカーとのクロスルームPKを退出します。DisconnectOtherRoom()でクロスルームPKを退出することができます。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:objectDataoptions:NSJSONReadingMutableContainerserror:&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];
// 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;}
- (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];}
// リモートユーザーのビデオストリームを購読する際にストリームタイプが選択可能[self.trtcCloud startRemoteView:userId streamType:TRTCVideoStreamTypeBig view:view];// 指定されたリモートユーザーの大画面と小画面をいつでも切り替え可能[self.trtcCloud setRemoteVideoStreamType:userId type:TRTCVideoStreamTypeSmall];
streamTypeをTRTCVideoStreamTypeSmallに設定することで、低解像度の小画面で視聴することができます。// ローカルプレビュー画面のレンダリングコントロールを更新[self.trtcCloud updateLocalView:view];// リモートユーザーのビデオレンダリングコントロールを更新[self.trtcCloud updateRemoteView:view streamType:TRTCVideoStreamTypeBig forUser:userId];
viewにターゲットビデオレンダリングコントロールを渡します。streamTypeはTRTCVideoStreamTypeBigとTRTCVideoStreamTypeSubのみに対応します。列挙値 | 取得値 | 説明 |
ERR_TRTC_INVALID_USER_SIG | -3320 | 入室パラメータuserSigが正しくありません。 TRTCParams.userSigが空であるかどうかを確認してください。 |
ERR_TRTC_USER_SIG_CHECK_FAILED | -100018 | UserSig検証失敗、パラメータ TRTCParams.userSigが正しく入力されているか、または期限切れでないかを確認してください。 |
列挙値 | 取得値 | 説明 |
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のルームに連続して入室しようとしていないか確認してください。 |
列挙値 | 取得値 | 説明 |
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 | マイクが使用中です。たとえば、モバイルデバイスが通話中の場合、マイクを開くと失敗します。 |
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];
// カメラの最大ズーム倍率を取得する(モバイル端末のみ適用)CGFloat zoomRatio = [[self.trtcCloud getDeviceManager] getCameraZoomMaxRatio];// カメラのズーム倍率を設定する(モバイル端末のみ適用)// 値の範囲1~5、1が最も遠い(通常のカメラ)、5が最も近い(拡大鏡)。推奨最大値は5、5を超えるとビデオデータがぼやけてしまう[[self.trtcCloud getDeviceManager] setCameraZoomRatio:zoomRatio];
// カメラのオートフォーカス機能をオンまたはオフ(モバイル端末のみ適用)[[self.trtcCloud getDeviceManager] enableCameraAutoFocus:NO];// カメラのフォーカス位置を設定(モバイル端末のみ適用)// このインターフェースを使用する前提条件は、まずenableCameraAutoFocusでオートフォーカス機能をオフにすることです。[[self.trtcCloud getDeviceManager] setCameraFocusPosition:CGPointMake(x, y)];
// 現在がインカメラかどうかを判断(モバイル端末のみ適用)BOOL isFrontCamera = [[self.trtcCloud getDeviceManager] isFrontCamera];// インカメラとアウトカメラを切り替え(モバイル端末のみ適用)// true: に渡すインカメラに。に渡すfalse: アウトカメラに[[self.trtcCloud getDeviceManager] switchCamera:!isFrontCamera];
フィードバック