chengyanfang

fix

Too many changes to show.

To preserve performance only 19 of 19+ files are displayed.

No preview for this file type
No preview for this file type
  1 +/*
  2 + * Module: TRTCCloud @ TXLiteAVSDK
  3 + *
  4 + * Function: 腾讯云视频通话功能的主要接口类
  5 + *
  6 + * Version: 7.0.8671
  7 + */
  8 +
  9 +#import <Foundation/Foundation.h>
  10 +#import <VideoToolbox/VideoToolbox.h>
  11 +#import "TRTCCloudDelegate.h"
  12 +#import "TRTCCloudDef.h"
  13 +#import "TXBeautyManager.h"
  14 +
  15 +
  16 +/// @defgroup TRTCCloud_ios TRTCCloud
  17 +/// 腾讯云视频通话功能的主要接口类
  18 +/// @{
  19 +@interface TRTCCloud : NSObject
  20 +
  21 +// 请使用 +sharedIntance 方法
  22 ++ (instancetype)new __attribute__((unavailable("Use +sharedInstance instead")));
  23 +- (instancetype)init __attribute__((unavailable("Use +sharedInstance instead")));
  24 +
  25 +
  26 +/////////////////////////////////////////////////////////////////////////////////
  27 +//
  28 +// SDK 基础函数
  29 +//
  30 +/////////////////////////////////////////////////////////////////////////////////
  31 +
  32 +/// @name 创建与销毁
  33 +/// @{
  34 +
  35 +/**
  36 +* 创建 TRTCCloud 单例
  37 +*/
  38 ++ (instancetype)sharedInstance;
  39 +
  40 +/**
  41 +* 销毁 TRTCCloud 单例
  42 +*/
  43 ++ (void)destroySharedIntance;
  44 +
  45 +/**
  46 +* 设置回调接口 TRTCCloudDelegate
  47 +*
  48 +* 您可以通过 TRTCCloudDelegate 获得来自 SDK 的各种状态通知,详见 TRTCCloudDelegate.h 中的定义
  49 +*/
  50 +@property (nonatomic, weak) id<TRTCCloudDelegate> delegate;
  51 +
  52 +/**
  53 +* 设置驱动 TRTCCloudDelegate 回调的队列
  54 +*
  55 +* SDK 默认会采用 Main Queue 作为驱动 TRTCCloudDelegate。如果您不指定自己的 delegateQueue,
  56 +* SDK 的 TRTCCloudDelegate 回调都将由 Main Queue 来调用。此时您在 TRTCCloudDelegate 的回调函数里操作 UI 是线程安全的。
  57 +*/
  58 +@property (nonatomic, strong) dispatch_queue_t delegateQueue;
  59 +
  60 +/// @}
  61 +
  62 +/////////////////////////////////////////////////////////////////////////////////
  63 +//
  64 +// (一)房间相关接口函数
  65 +//
  66 +/////////////////////////////////////////////////////////////////////////////////
  67 +#pragma mark - 房间相关接口函数
  68 +/// @name 房间相关接口函数
  69 +/// @{
  70 +
  71 +/**
  72 + * 1.1 进入房间
  73 + *
  74 + * 调用接口后,您会收到来自 TRTCCloudDelegate 中的 onEnterRoom(result) 回调:
  75 + * - 如果加入成功,result 会是一个正数(result > 0),表示加入房间的时间消耗,单位是毫秒(ms)。
  76 + * - 如果加入失败,result 会是一个负数(result < 0),表示进房失败的错误码。
  77 + *
  78 + * 进房失败的错误码含义请参见[错误码](https://cloud.tencent.com/document/product/647/32257)。
  79 + *
  80 + * - {@link TRTCAppSceneVideoCall}:<br>
  81 + * 视频通话场景,支持720P、1080P高清画质,单个房间最多支持300人同时在线,最高支持50人同时发言。<br>
  82 + * 适合:[1对1视频通话]、[300人视频会议]、[在线问诊]、[视频聊天]、[远程面试]等。<br>
  83 + * - {@link TRTCAppSceneAudioCall}:<br>
  84 + * 语音通话场景,支持 48kHz,支持双声道。单个房间最多支持300人同时在线,最高支持50人同时发言。<br>
  85 + * 适合:[1对1语音通话]、[300人语音会议]、[语音聊天]、[语音会议]、[在线狼人杀]等。<br>
  86 + * - {@link TRTCAppSceneLIVE}:<br>
  87 + * 视频互动直播,支持平滑上下麦,切换过程无需等待,主播延时小于300ms;支持十万级别观众同时播放,播放延时低至1000ms。<br>
  88 + * 适合:[视频低延时直播]、[十万人互动课堂]、[视频直播 PK]、[视频相亲房]、[互动课堂]、[远程培训]、[超大型会议]等。<br>
  89 + * - {@link TRTCAppSceneVoiceChatRoom}:<br>
  90 + * 语音互动直播,支持平滑上下麦,切换过程无需等待,主播延时小于300ms;支持十万级别观众同时播放,播放延时低至1000ms。<br>
  91 + * 适合:[语音低延时直播]、[语音直播连麦]、[语聊房]、[K 歌房]、[FM 电台]等。<br>
  92 + *
  93 + * @param param 进房参数,请参考 TRTCParams
  94 + * @param scene 应用场景,目前支持视频通话(VideoCall)、在线直播(Live)、语音通话(AudioCall)、语音聊天室(VoiceChatRoom)四种场景。
  95 + *
  96 + * @note
  97 + * 1. 当 scene 选择为 TRTCAppSceneLIVE 或 TRTCAppSceneVoiceChatRoom 时,您必须通过 TRTCParams 中的 role 字段指定当前用户的角色。<br>
  98 + * 2. 不管进房是否成功,enterRoom 都必须与 exitRoom 配对使用,在调用 exitRoom 前再次调用 enterRoom 函数会导致不可预期的错误问题。
  99 + */
  100 +- (void)enterRoom:(TRTCParams *)param appScene:(TRTCAppScene)scene;
  101 +
  102 +/**
  103 + * 1.2 离开房间
  104 + *
  105 + * 调用 exitRoom() 接口会执行退出房间的相关逻辑,例如释放音视频设备资源和编解码器资源等。
  106 + * 待资源释放完毕,SDK 会通过 TRTCCloudDelegate 中的 onExitRoom() 回调通知到您。
  107 + *
  108 + * 如果您要再次调用 enterRoom() 或者切换到其他的音视频 SDK,请等待 onExitRoom() 回调到来之后再执行相关操作。
  109 + * 否则可能会遇到摄像头或麦克风(例如 iOS 里的 AudioSession)被占用等各种异常问题。
  110 + */
  111 +- (void)exitRoom;
  112 +
  113 +
  114 +/**
  115 + * 1.3 切换角色,仅适用于直播场景(TRTCAppSceneLIVE 和 TRTCAppSceneVoiceChatRoom)
  116 + *
  117 + * 在直播场景下,一个用户可能需要在“观众”和“主播”之间来回切换。
  118 + * 您可以在进房前通过 TRTCParams 中的 role 字段确定角色,也可以通过 switchRole 在进房后切换角色。
  119 + *
  120 + * @param role 目标角色,默认为主播:
  121 + * - {@link TRTCRoleAnchor} 主播,可以上行视频和音频,一个房间里最多支持50个主播同时上行音视频。
  122 + * - {@link TRTCRoleAudience} 观众,只能观看,不能上行视频和音频,一个房间里的观众人数没有上限。
  123 + */
  124 +-(void)switchRole:(TRTCRoleType)role;
  125 +
  126 +
  127 +/**
  128 + * 1.4 请求跨房通话(主播 PK)
  129 + *
  130 + * TRTC 中两个不同音视频房间中的主播,可以通过“跨房通话”功能拉通连麦通话功能。使用此功能时,
  131 + * 两个主播无需退出各自原来的直播间即可进行“连麦 PK”。
  132 + *
  133 + * 例如:当房间“001”中的主播 A 通过 connectOtherRoom() 跟房间“002”中的主播 B 拉通跨房通话后,
  134 + * 房间“001”中的用户都会收到主播 B 的 onUserEnter(B) 回调和 onUserVideoAvailable(B,YES) 回调。
  135 + * 房间“002”中的用户都会收到主播 A 的 onUserEnter(A) 回调和 onUserVideoAvailable(A,YES) 回调。
  136 + *
  137 + * 简言之,跨房通话的本质,就是把两个不同房间中的主播相互分享,让每个房间里的观众都能看到两个主播。
  138 + *
  139 + * <pre>
  140 + * 房间 001 房间 002
  141 + * ------------- ------------
  142 + * 跨房通话前:| 主播 A | | 主播 B |
  143 + * | 观众 U V W | | 观众 X Y Z |
  144 + * ------------- ------------
  145 + *
  146 + * 房间 001 房间 002
  147 + * ------------- ------------
  148 + * 跨房通话后:| 主播 A B | | 主播 B A |
  149 + * | 观众 U V W | | 观众 X Y Z |
  150 + * ------------- ------------
  151 + * </pre>
  152 + *
  153 + * 跨房通话的参数考虑到后续扩展字段的兼容性问题,暂时采用了 JSON 格式的参数,要求至少包含两个字段:
  154 + * - roomId:房间“001”中的主播 A 要跟房间“002”中的主播 B 连麦,主播 A 调用 connectOtherRoom() 时 roomId 应指定为“002”。
  155 + * - userId:房间“001”中的主播 A 要跟房间“002”中的主播 B 连麦,主播 A 调用 connectOtherRoom() 时 userId 应指定为 B 的 userId。
  156 + *
  157 + * 跨房通话的请求结果会通过 TRTCCloudDelegate 中的 onConnectOtherRoom() 回调通知给您。
  158 + *
  159 + * <pre>
  160 + * NSMutableDictionary * jsonDict = [[NSMutableDictionary alloc] init];
  161 + * [jsonDict setObject:@(002) forKey:@"roomId"];
  162 + * [jsonDict setObject:@"userB" forKey:@"userId"];
  163 + * NSData* jsonData = [NSJSONSerialization dataWithJSONObject:jsonDict options:NSJSONWritingPrettyPrinted error:nil];
  164 + * NSString* jsonString = [[NSString alloc] initWithData:jsonData encoding:NSUTF8StringEncoding];
  165 + * [trtc connectOtherRoom:jsonString];
  166 + * </pre>
  167 + *
  168 + * @param param JSON 字符串连麦参数,roomId 代表目标房间号,userId 代表目标用户 ID。
  169 + *
  170 + **/
  171 +- (void)connectOtherRoom:(NSString *)param;
  172 +
  173 +/**
  174 + * 1.5 退出跨房通话
  175 + *
  176 + * 跨房通话的退出结果会通过 TRTCCloudDelegate 中的 onDisconnectOtherRoom() 回调通知给您。
  177 + **/
  178 +- (void)disconnectOtherRoom;
  179 +
  180 +/**
  181 + * 1.6 设置音视频数据接收模式(需要在进房前设置才能生效)
  182 + *
  183 + * 为实现进房秒开的绝佳体验,SDK 默认进房后自动接收音视频。即在您进房成功的同时,您将立刻收到远端所有用户的音视频数据。
  184 + * 若您没有调用 startRemoteView,视频数据将自动超时取消。
  185 + * 若您主要用于语音聊天等没有自动接收视频数据需求的场景,您可以根据实际需求选择接收模式。
  186 + *
  187 + * @param autoRecvAudio YES:自动接收音频数据;NO:需要调用 muteRemoteAudio 进行请求或取消。默认值:YES
  188 + * @param autoRecvVideo YES:自动接收视频数据;NO:需要调用 startRemoteView/stopRemoteView 进行请求或取消。默认值:YES
  189 + *
  190 + * @note 需要在进房前设置才能生效。
  191 + **/
  192 +- (void)setDefaultStreamRecvMode:(BOOL)autoRecvAudio video:(BOOL)autoRecvVideo;
  193 +
  194 +/// @}
  195 +
  196 +/////////////////////////////////////////////////////////////////////////////////
  197 +//
  198 +// (二)CDN 相关接口函数
  199 +//
  200 +/////////////////////////////////////////////////////////////////////////////////
  201 +#pragma mark - CDN 相关接口函数
  202 +
  203 +/// @name CDN 相关接口函数
  204 +/// @{
  205 +
  206 +/**
  207 + * 2.1 开始向腾讯云的直播 CDN 推流
  208 + *
  209 + * 该接口会指定当前用户的音视频流在腾讯云 CDN 所对应的 StreamId,进而可以指定当前用户的 CDN 播放地址。
  210 + *
  211 + * 例如:如果我们采用如下代码设置当前用户的主画面 StreamId 为 user_stream_001,那么该用户主画面对应的 CDN 播放地址为:
  212 + * “http://yourdomain/live/user_stream_001.flv”,其中 yourdomain 为您自己备案的播放域名,
  213 + * 您可以在直播[控制台](https://console.cloud.tencent.com/live) 配置您的播放域名,腾讯云不提供默认的播放域名。
  214 + *
  215 + * <pre>
  216 + * TRTCCloud *trtcCloud = [TRTCCloud sharedInstance];
  217 + * [trtcCloud enterRoom:params appScene:TRTCAppSceneLIVE];
  218 + * [trtcCloud startLocalPreview:frontCamera view:localView];
  219 + * [trtcCloud startLocalAudio];
  220 + * [trtcCloud startPublishing: @"user_stream_001" type:TRTCVideoStreamTypeBig];
  221 + *
  222 + * </pre>
  223 + *
  224 + * 您也可以在设置 enterRoom 的参数 TRTCParams 时指定 streamId, 而且我们更推荐您采用这种方案。
  225 + *
  226 + * @param streamId 自定义流 Id。
  227 + * @param type 仅支持TRTCVideoStreamTypeBig 和 TRTCVideoStreamTypeSub。
  228 + * @note 您需要先在实时音视频 [控制台](https://console.cloud.tencent.com/rav/) 中的功能配置页开启“启动自动旁路直播”才能生效。
  229 +*/
  230 +- (void)startPublishing:(NSString *)streamId type:(TRTCVideoStreamType)type;
  231 +
  232 +/**
  233 + * 2.2 停止向腾讯云的直播 CDN 推流
  234 + */
  235 +- (void)stopPublishing;
  236 +
  237 +/**
  238 + * 2.3 开始向友商云的直播 CDN 转推
  239 + *
  240 + * 该接口跟 startPublishing() 类似,但 startPublishCDNStream() 支持向非腾讯云的直播 CDN 转推。
  241 + * 使用 startPublishing() 绑定腾讯云直播 CDN 不收取额外的费用。
  242 + * 使用 startPublishCDNStream() 绑定非腾讯云直播 CDN 需要收取转推费用,且需要通过工单联系我们开通。
  243 + */
  244 +- (void)startPublishCDNStream:(TRTCPublishCDNParam*)param;
  245 +
  246 +/**
  247 + * 2.4 停止向非腾讯云地址转推
  248 + */
  249 +- (void)stopPublishCDNStream;
  250 +
  251 +/**
  252 + * 2.5 设置云端的混流转码参数
  253 + *
  254 + * 如果您在实时音视频 [控制台](https://console.cloud.tencent.com/trtc/) 中的功能配置页开启了“启动自动旁路直播”功能,
  255 + * 房间里的每一路画面都会有一个默认的直播 [CDN 地址](https://cloud.tencent.com/document/product/647/16826)。
  256 + *
  257 + * 一个直播间中可能有不止一位主播,而且每个主播都有自己的画面和声音,但对于 CDN 观众来说,他们只需要一路直播流,
  258 + * 所以您需要将多路音视频流混成一路标准的直播流,这就需要混流转码。
  259 + *
  260 + * 当您调用 setMixTranscodingConfig() 接口时,SDK 会向腾讯云的转码服务器发送一条指令,目的是将房间里的多路音视频流混合为一路,
  261 + * 您可以通过 mixUsers 参数来调整每一路画面的位置,以及是否只混合声音,也可以通过 videoWidth、videoHeight、videoBitrate 等参数控制混合音视频流的编码参数。
  262 + *
  263 + * <pre>
  264 + * 【画面1】=> 解码 ====> \
  265 + * \
  266 + * 【画面2】=> 解码 => 画面混合 => 编码 => 【混合后的画面】
  267 + * /
  268 + * 【画面3】=> 解码 ====> /
  269 + *
  270 + * 【声音1】=> 解码 ====> \
  271 + * \
  272 + * 【声音2】=> 解码 => 声音混合 => 编码 => 【混合后的声音】
  273 + * /
  274 + * 【声音3】=> 解码 ====> /
  275 + * </pre>
  276 + *
  277 + * 参考文档:[云端混流转码](https://cloud.tencent.com/document/product/647/16827)。
  278 + *
  279 + * @param config 请参考 TRTCCloudDef.h 中关于 TRTCTranscodingConfig 的介绍。如果传入 nil 则取消云端混流转码。
  280 + * @note 关于云端混流的注意事项:
  281 + * - 云端转码会引入一定的 CDN 观看延时,大概会增加1 - 2秒。
  282 + * - 调用该函数的用户,会将连麦中的多路画面混合到自己当前这路画面中。
  283 + */
  284 +- (void)setMixTranscodingConfig:(TRTCTranscodingConfig*)config;
  285 +
  286 +
  287 +/// @}
  288 +
  289 +/////////////////////////////////////////////////////////////////////////////////
  290 +//
  291 +// (三)视频相关接口函数
  292 +//
  293 +/////////////////////////////////////////////////////////////////////////////////
  294 +#pragma mark - 视频相关接口函数
  295 +/// @name 视频相关接口函数
  296 +/// @{
  297 +
  298 +#if TARGET_OS_IPHONE
  299 +/**
  300 + * 3.1 开启本地视频的预览画面 (iOS 版本)
  301 + *
  302 + * 当开始渲染首帧摄像头画面时,您会收到 TRTCCloudDelegate 中的 onFirstVideoFrame(nil) 回调。
  303 + *
  304 + * @param frontCamera YES:前置摄像头;NO:后置摄像头。
  305 + * @param view 承载视频画面的控件
  306 + */
  307 +- (void)startLocalPreview:(BOOL)frontCamera view:(TXView *)view;
  308 +#elif TARGET_OS_MAC
  309 +/**
  310 + * 3.1 开启本地视频的预览画面 (Mac 版本)
  311 + *
  312 + * 在调用该方法前,可以先调用 setCurrentCameraDevice 选择使用 Mac 自带摄像头或外接摄像头。
  313 + * 当开始渲染首帧摄像头画面时,您会收到 TRTCCloudDelegate 中的 onFirstVideoFrame(nil) 回调。
  314 + *
  315 + * @param view 承载视频画面的控件
  316 + */
  317 +- (void)startLocalPreview:(TXView *)view;
  318 +#endif
  319 +
  320 +/**
  321 + * 3.2 停止本地视频采集及预览
  322 + */
  323 +- (void)stopLocalPreview;
  324 +
  325 +/**
  326 + * 3.3 是否停止推送本地的视频数据
  327 + *
  328 + * 当停止推送本地视频后,房间里的其它成员将会收到 onUserVideoAvailable 回调通知
  329 + *
  330 + * @param mute YES:屏蔽;NO:开启,默认值:NO
  331 + */
  332 +- (void)muteLocalVideo:(BOOL)mute;
  333 +
  334 +/**
  335 + * 3.4 开始显示远端视频画面
  336 + *
  337 + * 在收到 SDK 的 onUserVideoAvailable(userid, YES) 通知时,可以获知该远程用户开启了视频,
  338 + * 此后调用 startRemoteView(userid) 接口加载该用户的远程画面,此时可以用 loading 动画优化加载过程中的等待体验。
  339 + * 待该用户的首帧画面开始显示时,您会收到 onFirstVideoFrame(userId) 事件回调。
  340 + *
  341 + * @param userId 对方的用户标识
  342 + * @param view 承载视频画面的控件
  343 + */
  344 +- (void)startRemoteView:(NSString *)userId view:(TXView *)view;
  345 +
  346 +/**
  347 + * 3.5 停止显示远端视频画面,同时不再拉取该远端用户的视频数据流
  348 + *
  349 + * 调用此接口后,SDK 会停止接收该用户的远程视频流,同时会清理相关的视频显示资源。
  350 + *
  351 + * @param userId 对方的用户标识
  352 + */
  353 +- (void)stopRemoteView:(NSString *)userId;
  354 +
  355 +/**
  356 + * 3.6 停止显示所有远端视频画面,同时不再拉取远端用户的视频数据流
  357 + *
  358 + * @note 如果有屏幕分享的画面在显示,则屏幕分享的画面也会一并被关闭。
  359 + */
  360 +- (void)stopAllRemoteView;
  361 +
  362 +/**
  363 + * 3.7 暂停接收指定的远端视频流
  364 + *
  365 + * 该接口仅停止接收远程用户的视频流,但并不释放显示资源,所以视频画面会冻屏在 mute 前的最后一帧。
  366 + *
  367 + * @param userId 对方的用户标识
  368 + * @param mute 是否停止接收
  369 + */
  370 +- (void)muteRemoteVideoStream:(NSString*)userId mute:(BOOL)mute;
  371 +
  372 +/**
  373 + * 3.8 停止接收所有远端视频流
  374 + *
  375 + * @param mute 是否停止接收
  376 + */
  377 +- (void)muteAllRemoteVideoStreams:(BOOL)mute;
  378 +
  379 +/**
  380 + * 3.9 设置视频编码器相关参数
  381 + *
  382 + * 该设置决定了远端用户看到的画面质量(同时也是云端录制出的视频文件的画面质量)
  383 + *
  384 + * @param param 视频编码参数,详情请参考 TRTCCloudDef.h 中的 TRTCVideoEncParam 定义
  385 + */
  386 +- (void)setVideoEncoderParam:(TRTCVideoEncParam*)param;
  387 +
  388 +/**
  389 + * 3.10 设置网络流控相关参数
  390 + *
  391 + * 该设置决定 SDK 在各种网络环境下的调控策略(例如弱网下选择“保清晰”或“保流畅”)
  392 + *
  393 + * @param param 网络流控参数,详情请参考 TRTCCloudDef.h 中的 TRTCNetworkQosParam 定义
  394 + */
  395 +- (void)setNetworkQosParam:(TRTCNetworkQosParam*)param;
  396 +
  397 +/**
  398 + * 3.11 设置本地图像的渲染模式
  399 + *
  400 + * @param mode 填充(画面可能会被拉伸裁剪)或适应(画面可能会有黑边),默认值:TRTCVideoFillMode_Fill
  401 + */
  402 +- (void)setLocalViewFillMode:(TRTCVideoFillMode)mode;
  403 +
  404 +/**
  405 + * 3.12 设置远端图像的渲染模式
  406 + *
  407 + * @param userId 用户 ID
  408 + * @param mode 填充(画面可能会被拉伸裁剪)或适应(画面可能会有黑边),默认值:TRTCVideoFillMode_Fill
  409 + */
  410 +- (void)setRemoteViewFillMode:(NSString*)userId mode:(TRTCVideoFillMode)mode;
  411 +
  412 +/**
  413 + * 3.13 设置本地图像的顺时针旋转角度
  414 + *
  415 + * @param rotation 支持90、180以及270旋转角度,默认值:TRTCVideoRotation_0
  416 + */
  417 +- (void)setLocalViewRotation:(TRTCVideoRotation)rotation;
  418 +
  419 +/**
  420 + * 3.14 设置远端图像的顺时针旋转角度
  421 + *
  422 + * @param userId 用户 ID
  423 + * @param rotation 支持90、180以及270旋转角度,默认值:TRTCVideoRotation_0
  424 + */
  425 +- (void)setRemoteViewRotation:(NSString*)userId rotation:(TRTCVideoRotation)rotation;
  426 +
  427 +/**
  428 + * 3.15 设置视频编码输出的(也就是远端用户观看到的,以及服务器录制下来的)画面方向
  429 + *
  430 + * 在 iPad、iPhone 等设备180度旋转时,由于摄像头的采集方向没有变,所以对方看到的画面是上下颠倒的,
  431 + * 在这种情况下,您可以通过该接口将 SDK 输出到对方的画面旋转180度,这样可以可以确保对方看到的画面依然正常。
  432 + *
  433 + * @param rotation 目前支持0和180两个旋转角度,默认值:TRTCVideoRotation_0
  434 + */
  435 +- (void)setVideoEncoderRotation:(TRTCVideoRotation)rotation;
  436 +
  437 +#if TARGET_OS_IPHONE
  438 +/**
  439 + * 3.16 设置本地摄像头预览画面的镜像模式(iOS)
  440 + *
  441 + * @param mirror 镜像模式,默认值:TRTCLocalVideoMirrorType_Auto
  442 + */
  443 +- (void)setLocalViewMirror:(TRTCLocalVideoMirrorType)mirror;
  444 +#elif TARGET_OS_MAC
  445 +
  446 +/**
  447 + * 3.17 设置本地摄像头预览画面的镜像模式(Mac)
  448 + *
  449 + * @param mirror 镜像模式,默认值:YES
  450 + */
  451 +- (void)setLocalViewMirror:(BOOL)mirror;
  452 +#endif
  453 +
  454 +/**
  455 + * 3.18 设置编码器输出的画面镜像模式
  456 + *
  457 + * 该接口不改变本地摄像头的预览画面,但会改变另一端用户看到的(以及服务器录制的)画面效果。
  458 + *
  459 + * @param mirror 是否开启远端镜像,YES:开启远端画面镜像;NO:关闭远端画面镜像,默认值:NO。
  460 + */
  461 +- (void)setVideoEncoderMirror:(BOOL)mirror;
  462 +
  463 +/**
  464 + * 3.19 设置重力感应的适应模式
  465 + *
  466 + * @param mode 重力感应模式,详情请参考 TRTCGSensorMode 的定义,默认值:TRTCGSensorMode_UIAutoLayout
  467 + */
  468 +- (void)setGSensorMode:(TRTCGSensorMode) mode;
  469 +
  470 +/**
  471 + * 3.20 开启大小画面双路编码模式
  472 + *
  473 + * 如果当前用户是房间中的主要角色(例如主播、老师、主持人等),并且使用 PC 或者 Mac 环境,可以开启该模式。
  474 + * 开启该模式后,当前用户会同时输出【高清】和【低清】两路视频流(但只有一路音频流)。
  475 + * 对于开启该模式的当前用户,会占用更多的网络带宽,并且会更加消耗 CPU 计算资源。
  476 + *
  477 + * 对于同一房间的远程观众而言:
  478 + * - 如果用户下行网络很好,可以选择观看【高清】画面
  479 + * - 如果用户下行网络较差,可以选择观看【低清】画面
  480 + *
  481 + * @note 双路编码开启后,会消耗更多的 CPU 和 网络带宽,所以对于 iMac、Windows 或者高性能 Pad 可以考虑开启,但请不要在手机端开启。
  482 + *
  483 + * @param enable 是否开启小画面编码,默认值:NO
  484 + * @param smallVideoEncParam 小流的视频参数
  485 + * @return 0:成功;-1:大画面已经是最低画质
  486 + */
  487 +- (int)enableEncSmallVideoStream:(BOOL)enable withQuality:(TRTCVideoEncParam*)smallVideoEncParam;
  488 +
  489 +/**
  490 + * 3.21 选定观看指定 uid 的大画面或小画面
  491 + *
  492 + * 此功能需要该 uid 通过 enableEncSmallVideoStream 提前开启双路编码模式。
  493 + * 如果该 uid 没有开启双路编码模式,则此操作将无任何反应。
  494 + *
  495 + * @param userId 用户 ID
  496 + * @param type 视频流类型,即选择看大画面或小画面,默认为大画面
  497 + */
  498 +- (void)setRemoteVideoStreamType:(NSString*)userId type:(TRTCVideoStreamType)type;
  499 +
  500 +/**
  501 + * 3.22 设定观看方优先选择的视频质量
  502 + *
  503 + * 低端设备推荐优先选择低清晰度的小画面。
  504 + * 如果对方没有开启双路视频模式,则此操作无效。
  505 + *
  506 + * @param type 默认观看大画面或小画面,默认为大画面
  507 + */
  508 +- (void)setPriorRemoteVideoStreamType:(TRTCVideoStreamType)type;
  509 +
  510 +#if TARGET_OS_IPHONE
  511 +/**
  512 +* 3.23 视频画面截图
  513 +*
  514 +* 截取本地、远程主路和远端辅流的视频画面,并通过 UIImage 对象返回给您。
  515 +*
  516 +* @param userId 用户 ID,nil 表示截取本地视频画面,本地仅支持摄像头画面(type:TRTCVideoStreamTypeBig)的截取。
  517 +* @param type 视频流类型,支持摄像头画面(TRTCVideoStreamTypeBig)和 屏幕分享画面(TRTCVideoStreamTypeSub)。
  518 +* @param completionBlock 画面截取后的回调。
  519 +*/
  520 +- (void)snapshotVideo:(NSString *)userId type:(TRTCVideoStreamType)type completionBlock:(void (^)(UIImage *image))completionBlock;
  521 +
  522 +#endif
  523 +
  524 +/// @}
  525 +
  526 +/////////////////////////////////////////////////////////////////////////////////
  527 +//
  528 +// (四)音频相关接口函数
  529 +//
  530 +/////////////////////////////////////////////////////////////////////////////////
  531 +#pragma mark - 音频相关接口函数
  532 +/// @name 音频相关接口函数
  533 +/// @{
  534 +
  535 +/**
  536 + * 4.1 开启本地音频的采集和上行
  537 + *
  538 + * 该函数会启动麦克风采集,并将音频数据传输给房间里的其他用户。
  539 + * SDK 不会默认开启本地音频采集和上行,您需要调用该函数开启,否则房间里的其他用户将无法听到您的声音。
  540 + *
  541 + * @note 该函数会检查麦克风的使用权限,如果当前 App 没有麦克风权限,SDK 会向用户申请开启。
  542 + */
  543 +- (void)startLocalAudio;
  544 +
  545 +/**
  546 + * 4.2 关闭本地音频的采集和上行
  547 + *
  548 + * 当关闭本地音频的采集和上行,房间里的其它成员会收到 onUserAudioAvailable(NO) 回调通知。
  549 + */
  550 +- (void)stopLocalAudio;
  551 +
  552 +/**
  553 + * 4.3 静音本地的音频
  554 + *
  555 + * 当静音本地音频后,房间里的其它成员会收到 onUserAudioAvailable(NO) 回调通知。
  556 + *
  557 + * 与 stopLocalAudio 不同之处在于,muteLocalAudio 并不会停止发送音视频数据,而是继续发送码率极低的静音包。
  558 + * 由于 MP4 等视频文件格式,对于音频的连续性是要求很高的,使用 stopLocalAudio 会导致录制出的 MP4 不易播放。
  559 + * 因此在对录制质量要求很高的场景中,建议选择 muteLocalAudio,从而录制出兼容性更好的 MP4 文件。
  560 + *
  561 + * @param mute YES:屏蔽;NO:开启,默认值:NO
  562 + */
  563 +- (void)muteLocalAudio:(BOOL)mute;
  564 +
  565 +/**
  566 + * 4.4 设置音频路由
  567 + *
  568 + * 微信和手机 QQ 视频通话功能的免提模式就是基于音频路由实现的。
  569 + * 一般手机都有两个扬声器,一个是位于顶部的听筒扬声器,声音偏小;一个是位于底部的立体声扬声器,声音偏大。
  570 + * 设置音频路由的作用就是决定声音使用哪个扬声器播放。
  571 + *
  572 + * @param route 音频路由,即声音由哪里输出(扬声器、听筒),默认值:TRTCAudioModeSpeakerphone
  573 + */
  574 +- (void)setAudioRoute:(TRTCAudioRoute)route;
  575 +
  576 +/**
  577 + * 4.5 静音某一个用户的声音,同时不再拉取该远端用户的音频数据流
  578 + *
  579 + * @param userId 对方的用户 ID
  580 + * @param mute YES:静音;NO:非静音
  581 + */
  582 +- (void)muteRemoteAudio:(NSString *)userId mute:(BOOL)mute;
  583 +
  584 +/**
  585 + * 4.6 静音所有用户的声音,同时不再拉取远端用户的音频数据流
  586 + *
  587 + * @param mute YES:静音;NO:非静音
  588 + */
  589 +- (void)muteAllRemoteAudio:(BOOL)mute;
  590 +
  591 +/**
  592 + * 4.7 设置某个远程用户的播放音量
  593 + *
  594 + * @param userId 远程用户 ID
  595 + * @param volume 音量大小,取值0 - 100
  596 + */
  597 +- (void)setRemoteAudioVolume:(NSString *)userId volume:(int)volume;
  598 +
  599 +/**
  600 + * 4.8 设置 SDK 采集音量。
  601 + *
  602 + * @param volume 音量大小,取值0 - 100,默认值为100
  603 + */
  604 +- (void)setAudioCaptureVolume:(NSInteger)volume;
  605 +
  606 +/**
  607 + * 4.9 获取 SDK 采集音量
  608 + */
  609 +- (NSInteger)getAudioCaptureVolume;
  610 +
  611 +/**
  612 + * 4.10 设置 SDK 播放音量。
  613 + *
  614 + * @note 该函数会控制最终交给系统播放的声音音量,会影响录制本地音频文件的音量大小,但不会影响耳返的音量。
  615 + *
  616 + * @param volume 音量大小,取值0 - 100,默认值为100
  617 + */
  618 +- (void)setAudioPlayoutVolume:(NSInteger)volume;
  619 +
  620 +/**
  621 + * 4.11 获取 SDK 播放音量
  622 + */
  623 +- (NSInteger)getAudioPlayoutVolume;
  624 +
  625 +/**
  626 + * 4.12 启用音量大小提示
  627 + *
  628 + * 开启此功能后,SDK 会在 onUserVoiceVolume() 中反馈对每一路声音音量大小值的评估。
  629 + * 如需打开此功能,请在 startLocalAudio() 之前调用。
  630 + *
  631 + * @note Demo 中有一个音量大小的提示条,就是基于这个接口实现的。
  632 + * @param interval 设置 onUserVoiceVolume 回调的触发间隔,单位为ms,最小间隔为100ms,如果小于等于0则会关闭回调,建议设置为300ms;
  633 + */
  634 +- (void)enableAudioVolumeEvaluation:(NSUInteger)interval;
  635 +
  636 +/**
  637 + * 4.13 开始录音
  638 + *
  639 + * 该方法调用后, SDK 会将通话过程中的所有音频(包括本地音频,远端音频,BGM 等)录制到一个文件里。
  640 + * 无论是否进房,调用该接口都生效。
  641 + * 如果调用 exitRoom 时还在录音,录音会自动停止。
  642 + *
  643 + * @param param 录音参数,请参考 TRTCAudioRecordingParams
  644 + * @return 0:成功;-1:录音已开始;-2:文件或目录创建失败;-3:后缀指定的音频格式不支持
  645 + */
  646 +- (int)startAudioRecording:(TRTCAudioRecordingParams*) param;
  647 +
  648 +/**
  649 + * 4.14 停止录音
  650 + *
  651 + * 如果调用 exitRoom 时还在录音,录音会自动停止。
  652 + */
  653 +- (void)stopAudioRecording;
  654 +
  655 +/**
  656 + * 4.15 设置通话时使用的系统音量类型
  657 + *
  658 + * 智能手机一般具备两种系统音量类型,即通话音量类型和媒体音量类型。
  659 + * - 通话音量:手机专门为通话场景设计的音量类型,使用手机自带的回声抵消功能,音质相比媒体音量类型较差,
  660 + * 无法通过音量按键将音量调成零,但是支持蓝牙耳机上的麦克风。
  661 + *
  662 + * - 媒体音量:手机专门为音乐场景设计的音量类型,音质相比于通话音量类型要好,通过通过音量按键可以将音量调成零。
  663 + * 使用媒体音量类型时,如果要开启回声抵消(AEC)功能,SDK 会开启内置的声学处理算法对声音进行二次处理。
  664 + * 在媒体音量模式下,蓝牙耳机无法使用自带的麦克风采集声音,只能使用手机上的麦克风进行声音采集。
  665 + *
  666 + * SDK 目前提供了三种系统音量类型的控制模式,分别为:
  667 + * - {@link TRTCSystemVolumeTypeAuto}:
  668 + * “麦上通话,麦下媒体”,即主播上麦时使用通话音量,观众不上麦则使用媒体音量,适合在线直播场景。
  669 + * 如果您在 enterRoom 时选择的场景为 {@link TRTCAppSceneLIVE} 或 {@link TRTCAppSceneVoiceChatRoom},SDK 会自动选择该模式。
  670 + *
  671 + * - {@link TRTCSystemVolumeTypeVOIP}:
  672 + * 通话全程使用通话音量,适合多人会议场景。
  673 + * 如果您在 enterRoom 时选择的场景为 {@link TRTCAppSceneVideoCall} 或 {@link TRTCAppSceneAudioCall},SDK 会自动选择该模式。
  674 + *
  675 + * - {@link TRTCSystemVolumeTypeMedia}:
  676 + * 通话全程使用媒体音量,不常用,适合个别有特殊需求(如主播外接声卡)的应用场景。
  677 + *
  678 + * @note
  679 + * 1. 需要在调用 startLocalAudio() 之前调用该接口。<br>
  680 + * 2. 如无特殊需求,不推荐您自行设置,您只需通过 enterRoom 设置好适合您的场景,SDK 内部会自动选择相匹配的音量类型。
  681 + *
  682 + * @param type 系统音量类型,如无特殊需求,不推荐您自行设置。
  683 + */
  684 +- (void)setSystemVolumeType:(TRTCSystemVolumeType)type;
  685 +
  686 +#if TARGET_OS_IPHONE
  687 +/**
  688 + * 4.16 开启耳返
  689 + *
  690 + * 开启后会在耳机里听到自己的声音。
  691 + *
  692 + * @note 仅在戴耳机时有效
  693 + *
  694 + * @param enable YES:开启;NO:关闭,默认值:NO
  695 + */
  696 +- (void)enableAudioEarMonitoring:(BOOL)enable;
  697 +#endif
  698 +
  699 +/// @}
  700 +
  701 +
  702 +
  703 +/////////////////////////////////////////////////////////////////////////////////
  704 +//
  705 +// (五)摄像头相关接口函数
  706 +//
  707 +/////////////////////////////////////////////////////////////////////////////////
  708 +#pragma mark - 摄像头相关接口函数
  709 +/// @name 摄像头相关接口函数
  710 +/// @{
  711 +#if TARGET_OS_IPHONE
  712 +
  713 +/**
  714 + * 5.1 切换摄像头
  715 + */
  716 +- (void)switchCamera;
  717 +
  718 +/**
  719 + * 5.2 查询当前摄像头是否支持缩放
  720 + */
  721 +- (BOOL)isCameraZoomSupported;
  722 +
  723 +/**
  724 + * 5.3 设置摄像头缩放因子(焦距)
  725 + *
  726 + * 取值范围1 - 5,取值为1表示最远视角(正常镜头),取值为5表示最近视角(放大镜头)。
  727 + * 最大值推荐为5,若超过5,视频数据会变得模糊不清。
  728 + *
  729 + * @param distance 取值范围为1 - 5,数值越大,焦距越远
  730 + */
  731 +- (void)setZoom:(CGFloat)distance;
  732 +
  733 +/**
  734 + * 5.4 查询是否支持开关闪光灯(手电筒模式)
  735 + */
  736 +- (BOOL)isCameraTorchSupported;
  737 +
  738 +/**
  739 + * 5.5 开关闪光灯
  740 + *
  741 + * @param enable YES:开启;NO:关闭,默认值:NO
  742 + */
  743 +- (BOOL)enbaleTorch:(BOOL)enable;
  744 +
  745 +/**
  746 + * 5.6 查询是否支持设置焦点
  747 + */
  748 +- (BOOL)isCameraFocusPositionInPreviewSupported;
  749 +
  750 +/**
  751 + * 5.7 设置摄像头焦点
  752 + *
  753 + * @param touchPoint 对焦位置
  754 + */
  755 +- (void)setFocusPosition:(CGPoint)touchPoint;
  756 +
  757 +/**
  758 + * 5.8 查询是否支持自动识别人脸位置
  759 + */
  760 +- (BOOL)isCameraAutoFocusFaceModeSupported;
  761 +
  762 +/**
  763 + * 5.9 自动识别人脸位置
  764 + *
  765 + * @param enable YES:开启;NO:关闭,默认值:YES
  766 + */
  767 +- (void)enableAutoFaceFoucs:(BOOL)enable;
  768 +
  769 +#elif TARGET_OS_MAC
  770 +
  771 +/**
  772 + * 5.10 获取摄像头设备列表
  773 + *
  774 + * Mac 主机本身自带一个摄像头,也允许插入 USB 摄像头。
  775 + * 如果您希望用户选择自己外接的摄像头,可以提供一个多摄像头选择的功能。
  776 + *
  777 + * @return 摄像头设备列表,第一项为当前系统默认设备
  778 + */
  779 +- (NSArray<TRTCMediaDeviceInfo*>*)getCameraDevicesList;
  780 +
  781 +/**
  782 + * 5.11 获取当前使用的摄像头
  783 + */
  784 +- (TRTCMediaDeviceInfo*)getCurrentCameraDevice;
  785 +
  786 +/**
  787 + * 5.12 设置要使用的摄像头
  788 + *
  789 + * @param deviceId 从 getCameraDevicesList 中得到的设备 ID
  790 + * @return 0:成功;-1:失败
  791 + */
  792 +- (int)setCurrentCameraDevice:(NSString*)deviceId;
  793 +
  794 +#endif
  795 +/// @}
  796 +
  797 +/////////////////////////////////////////////////////////////////////////////////
  798 +//
  799 +// (六)音频设备相关接口函数
  800 +//
  801 +/////////////////////////////////////////////////////////////////////////////////
  802 +#pragma mark - 音频设备相关接口函数
  803 +/// @name 音频设备相关接口函数
  804 +/// @{
  805 +#if !TARGET_OS_IPHONE && TARGET_OS_MAC
  806 +
  807 +/**
  808 + * 6.1 获取麦克风设备列表
  809 + *
  810 + * Mac 主机本身自带一个质量很好的麦克风,但它也允许用户外接其他的麦克风,而且很多 USB 摄像头上也自带麦克风。
  811 + * 如果您希望用户选择自己外接的麦克风,可以提供一个多麦克风选择的功能。
  812 + *
  813 + * @return 麦克风设备列表,第一项为当前系统默认设备
  814 + */
  815 +- (NSArray<TRTCMediaDeviceInfo*>*)getMicDevicesList;
  816 +
  817 +/**
  818 + * 6.2 获取当前的麦克风设备
  819 + *
  820 + * @return 当前麦克风设备信息
  821 + */
  822 +- (TRTCMediaDeviceInfo*)getCurrentMicDevice;
  823 +
  824 +/**
  825 + * 6.3 设置要使用的麦克风
  826 + *
  827 + * @param deviceId 从 getMicDevicesList 中得到的设备 ID
  828 + * @return 0:成功;<0:失败
  829 + */
  830 +- (int)setCurrentMicDevice:(NSString*)deviceId;
  831 +
  832 +/**
  833 + * 6.4 获取当前麦克风设备音量
  834 + *
  835 + * @return 麦克风音量
  836 + */
  837 +- (float)getCurrentMicDeviceVolume;
  838 +
  839 +/**
  840 + * 6.5 设置麦克风设备的音量
  841 + *
  842 + * 该接口的功能是调节系统采集音量,如果用户直接调节 Mac 系统设置的采集音量时,该接口的设置结果会被用户的操作所覆盖。
  843 + *
  844 + * @param volume 麦克风音量值,范围0 - 100
  845 + */
  846 +- (void)setCurrentMicDeviceVolume:(NSInteger)volume;
  847 +
  848 +/**
  849 + * 6.6 获取扬声器设备列表
  850 + *
  851 + * @return 扬声器设备列表,第一项为当前系统默认设备
  852 + */
  853 +- (NSArray<TRTCMediaDeviceInfo*>*)getSpeakerDevicesList;
  854 +
  855 +/**
  856 + * 6.7 获取当前的扬声器设备
  857 + *
  858 + * @return 当前扬声器设备信息
  859 + */
  860 +- (TRTCMediaDeviceInfo*)getCurrentSpeakerDevice;
  861 +
  862 +/**
  863 + * 6.8 设置要使用的扬声器
  864 + *
  865 + * @param deviceId 从 getSpeakerDevicesList 中得到的设备 ID
  866 + * @return 0:成功;<0:失败
  867 + */
  868 +- (int)setCurrentSpeakerDevice:(NSString*)deviceId;
  869 +
  870 +/**
  871 + * 6.9 当前扬声器设备音量
  872 + *
  873 + * @return 扬声器音量
  874 + */
  875 +- (float)getCurrentSpeakerDeviceVolume;
  876 +
  877 +/**
  878 + * 6.10 设置当前扬声器音量
  879 + *
  880 + * 该接口的功能是调节系统播放音量,如果用户直接调节 Mac 系统设置的播放音量时,该接口的设置结果会被用户的操作所覆盖。
  881 + *
  882 + * @param volume 设置的扬声器音量,范围0 - 100
  883 + * @return 0:成功;<0:失败
  884 + */
  885 +- (int)setCurrentSpeakerDeviceVolume:(NSInteger)volume;
  886 +
  887 +#endif
  888 +/// @}
  889 +
  890 +/////////////////////////////////////////////////////////////////////////////////
  891 +//
  892 +// (七)美颜滤镜相关接口函数
  893 +//
  894 +/////////////////////////////////////////////////////////////////////////////////
  895 +#pragma mark - 美颜滤镜相关接口函数
  896 +/// @name 美颜滤镜相关接口函数
  897 +/// @{
  898 +
  899 +/**
  900 + * 7.1 获取美颜管理对象
  901 + *
  902 + * 通过美颜管理,您可以使用以下功能:
  903 + * - 设置"美颜风格"、“美白”、“红润”、“大眼”、“瘦脸”、“V脸”、“下巴”、“短脸”、“小鼻”、“亮眼”、“白牙”、“祛眼袋”、“祛皱纹”、“祛法令纹”等美容效果。
  904 + * - 调整“发际线”、“眼间距”、“眼角”、“嘴形”、“鼻翼”、“鼻子位置”、“嘴唇厚度”、“脸型”
  905 + * - 设置人脸挂件(素材)等动态效果
  906 + * - 添加美妆
  907 + * - 进行手势识别
  908 + */
  909 +- (TXBeautyManager *)getBeautyManager;
  910 +
  911 +/**
  912 + * 7.2 设置指定素材滤镜特效
  913 + *
  914 + * @param image 指定素材,即颜色查找表图片。**必须使用 png 格式**
  915 + */
  916 +- (void)setFilter:(TXImage *)image;
  917 +
  918 +/**
  919 + * 7.3 设置滤镜浓度
  920 + *
  921 + * 在美女秀场等应用场景里,滤镜浓度的要求会比较高,以便更加突显主播的差异。
  922 + * 我们默认的滤镜浓度是0.5,如果您觉得滤镜效果不明显,可以使用下面的接口进行调节。
  923 + *
  924 + * @param concentration 从0到1,越大滤镜效果越明显,默认值为0.5。
  925 + */
  926 +- (void)setFilterConcentration:(float)concentration;
  927 +
  928 +/**
  929 + * 7.4 添加水印
  930 + *
  931 + * 水印的位置是通过 rect 来指定的,rect 的格式为 (x,y,width,height)
  932 + * - x:水印的坐标,取值范围为0 - 1的浮点数。
  933 + * - y:水印的坐标,取值范围为0 - 1的浮点数。
  934 + * - width:水印的宽度,取值范围为0 - 1的浮点数。
  935 + * - height:是不用设置的,SDK 内部会根据水印图片的宽高比自动计算一个合适的高度。
  936 + *
  937 + * 例如,如果当前编码分辨率是540 × 960,rect 设置为(0.1,0.1,0.2,0.0)。
  938 + * 那么水印的左上坐标点就是(540 × 0.1,960 × 0.1)即(54,96),水印的宽度是 540 × 0.2 = 108px,高度自动计算。
  939 + *
  940 + * @param image 水印图片,**必须使用透明底的 png 格式**
  941 + * @param streamType 如果要给屏幕分享的一路也设置水印,需要调用两次的 setWatermark。
  942 + * @param rect 水印相对于编码分辨率的归一化坐标,x,y,width,height 取值范围0 - 1。
  943 + */
  944 +- (void)setWatermark:(TXImage*)image streamType:(TRTCVideoStreamType)streamType rect:(CGRect)rect;
  945 +
  946 +/**
  947 + * 7.5 设置绿幕背景视频(企业版有效,其它版本设置此参数无效)
  948 + *
  949 + * 此处的绿幕功能并非智能抠背,需要被拍摄者的背后有一块绿色的幕布来辅助产生特效
  950 + *
  951 + * @param file 视频文件路径。支持 MP4; nil 表示关闭特效。
  952 + */
  953 +- (void)setGreenScreenFile:(NSURL *)file;
  954 +/// @}
  955 +
  956 +/////////////////////////////////////////////////////////////////////////////////
  957 +//
  958 +// (八)屏幕共享(辅流)相关函数(MAC)
  959 +//
  960 +/////////////////////////////////////////////////////////////////////////////////
  961 +#pragma mark - 屏幕共享接口函数(MAC)
  962 +/// @name 辅流相关接口函数(MAC)
  963 +/// @{
  964 +/**
  965 + * 8.1 开始显示远端用户的屏幕分享画面
  966 + *
  967 + * 对应于 startRemoteView() 用于显示主画面,该接口只能用于显示辅路(屏幕分享、远程播片)画面。
  968 + *
  969 + * @param userId 对方的用户标识
  970 + * @param view 渲染控件
  971 + * @note 请在 onUserSubStreamAvailable 回调后再调用这个接口。
  972 + */
  973 +- (void)startRemoteSubStreamView:(NSString *)userId view:(TXView *)view;
  974 +
  975 +/**
  976 + * 8.2 停止显示远端用户的屏幕分享画面。
  977 + *
  978 + * @param userId 对方的用户标识
  979 + */
  980 +- (void)stopRemoteSubStreamView:(NSString *)userId;
  981 +
  982 +/**
  983 + * 8.3 设置屏幕分享画面的显示模式
  984 + *
  985 + * 对应于 setRemoteViewFillMode() 于设置主画面的显示模式,该接口用于设置远端的辅路(屏幕分享、远程播片)画面。
  986 + *
  987 + * @param userId 用户的 ID
  988 + * @param mode 填充(画面可能会被拉伸裁剪)或适应(画面可能会有黑边),默认值:TRTCVideoFillMode_Fit
  989 + */
  990 +- (void)setRemoteSubStreamViewFillMode:(NSString *)userId mode:(TRTCVideoFillMode)mode;
  991 +
  992 +/**
  993 + * 8.4 设置屏幕分享画面的顺时针旋转角度
  994 + *
  995 + * 对应于 setRemoteViewRotation() 用于设置主画面的旋转角度,该接口用于设置远端的辅路(屏幕分享、远程播片)画面。
  996 + *
  997 + * @param userId 用户 ID
  998 + * @param rotation 支持90、180、270旋转角度
  999 + */
  1000 +- (void)setRemoteSubStreamViewRotation:(NSString*)userId rotation:(TRTCVideoRotation)rotation;
  1001 +
  1002 +#if !TARGET_OS_IPHONE && TARGET_OS_MAC
  1003 +
  1004 +/**
  1005 + * 8.5 枚举可分享的屏幕窗口
  1006 + *
  1007 + * 如果您要给您的 App 增加屏幕分享功能,一般需要先显示一个窗口选择界面,这样用户可以选择希望分享的窗口。
  1008 + * 通过下列函数,您可以获得可分享窗口的 ID、类型、窗口名称以及缩略图。
  1009 + * 获取上述信息后,您就可以实现一个窗口选择界面。您也可以使用 Demo 源码中已经实现好的窗口选择界面。
  1010 + *
  1011 + * @note 返回的列表中包括屏幕和应用窗口,屏幕会在列表的前面几个元素中。
  1012 + *
  1013 + * @param thumbnailSize 指定要获取的窗口缩略图大小,缩略图可用于绘制在窗口选择界面上
  1014 + * @param iconSize 指定要获取的窗口图标大小
  1015 + * @return 窗口列表包括屏幕
  1016 + */
  1017 +- (NSArray<TRTCScreenCaptureSourceInfo*>*)getScreenCaptureSourcesWithThumbnailSize:(CGSize)thumbnailSize iconSize:(CGSize)iconSize;
  1018 +
  1019 +/**
  1020 + * 8.6 设置屏幕共享参数,该方法在屏幕共享过程中也可以调用
  1021 + *
  1022 + * 如果您期望在屏幕分享的过程中,切换想要分享的窗口,可以再次调用这个函数,无需重新开启屏幕分享。
  1023 + *
  1024 + * @param screenSource 指定分享源
  1025 + * @param rect 指定捕获的区域(传 CGRectZero 则默认分享全屏)
  1026 + * @param capturesCursor 是否捕获鼠标光标
  1027 + * @param highlight 是否高亮正在分享的窗口
  1028 + *
  1029 + */
  1030 +- (void)selectScreenCaptureTarget:(TRTCScreenCaptureSourceInfo *)screenSource
  1031 + rect:(CGRect)rect
  1032 + capturesCursor:(BOOL)capturesCursor
  1033 + highlight:(BOOL)highlight;
  1034 +
  1035 +/**
  1036 + * 8.7 启动屏幕分享
  1037 + *
  1038 + * @param view 渲染控件所在的父控件
  1039 + */
  1040 +- (void)startScreenCapture:(NSView *)view;
  1041 +
  1042 +/**
  1043 + * 8.8 停止屏幕采集
  1044 + *
  1045 + * @return 0:成功;<0:失败
  1046 + */
  1047 +- (int)stopScreenCapture;
  1048 +
  1049 +/**
  1050 + * 8.9 暂停屏幕分享
  1051 + *
  1052 + * @return 0:成功;<0:失败
  1053 + */
  1054 +- (int)pauseScreenCapture;
  1055 +
  1056 +/**
  1057 + * 8.10 恢复屏幕分享
  1058 + *
  1059 + * @return 0:成功;<0:失败
  1060 + */
  1061 +- (int)resumeScreenCapture;
  1062 +
  1063 +/**
  1064 + * 8.12 设置屏幕分享的编码器参数
  1065 + *
  1066 + * 对应于 setVideoEncoderParam() 设置主画面的编码参数,该函数仅用于设置辅路(屏幕分享、远程播放视频)的编码参数。
  1067 + * 该设置决定远端用户看到的画面质量,同时也是云端录制出的视频文件的画面质量。
  1068 + *
  1069 + * @param param 辅流编码参数,详情请参考 TRTCCloudDef.h 中的 TRTCVideoEncParam 定义
  1070 + */
  1071 +- (void)setSubStreamEncoderParam:(TRTCVideoEncParam *)param;
  1072 +
  1073 +/**
  1074 + * 8.13 设置屏幕分享的混音音量大小
  1075 + *
  1076 + * 数值越高,辅路音量的占比越高,麦克风音量占比越小。不推荐将该参数值设置过大,数值太大容易压制麦克风的声音。
  1077 + *
  1078 + * @param volume 设置的音量大小,范围0 - 100
  1079 + */
  1080 +- (void)setSubStreamMixVolume:(NSInteger)volume;
  1081 +
  1082 +#endif
  1083 +/// @}
  1084 +
  1085 +/////////////////////////////////////////////////////////////////////////////////
  1086 +//
  1087 +// (九)自定义采集和渲染
  1088 +//
  1089 +/////////////////////////////////////////////////////////////////////////////////
  1090 +#pragma mark - 自定义采集和渲染
  1091 +/// @name 自定义采集和渲染
  1092 +/// @{
  1093 +/**
  1094 + * 9.1 启用视频自定义采集模式
  1095 + *
  1096 + * 开启该模式后,SDK 不在运行原有的视频采集流程,只保留编码和发送能力。
  1097 + * 您需要用 sendCustomVideoData() 不断地向 SDK 塞入自己采集的视频画面。
  1098 + *
  1099 + * @param enable 是否启用,默认值:NO
  1100 + */
  1101 +- (void)enableCustomVideoCapture:(BOOL)enable;
  1102 +
  1103 +/**
  1104 + * 9.2 向 SDK 投送自己采集的视频数据
  1105 + *
  1106 + * TRTCVideoFrame 推荐下列填写方式(其他字段不需要填写):
  1107 + * - pixelFormat:推荐选择 TRTCVideoPixelFormat_NV12。
  1108 + * - bufferType:推荐选择 TRTCVideoBufferType_PixelBuffer。
  1109 + * - pixelBuffer:iOS 平台上常用的视频数据格式。
  1110 + * - data:视频裸数据格式,bufferType 为 NSData 时使用。
  1111 + * - timestamp:如果 timestamp 间隔不均匀,会严重影响音画同步和录制出的 MP4 质量。
  1112 + * - width:视频图像长度,bufferType 为 NSData 时填写。
  1113 + * - height:视频图像宽度,bufferType 为 NSData 时填写。
  1114 + *
  1115 + * 参考文档:[自定义采集和渲染](https://cloud.tencent.com/document/product/647/34066)。
  1116 + *
  1117 + * @param frame 视频数据,支持 PixelBuffer NV12,BGRA 以及 I420 格式数据。
  1118 + * @note - SDK 内部有帧率控制逻辑,目标帧率以您在 setVideoEncoderParam 中设置的为准,太快会自动丢帧,太慢则会自动补帧。
  1119 + * @note - 可以设置 frame 中的 timestamp 为 0,相当于让 SDK 自己设置时间戳,但请“均匀”地控制 sendCustomVideoData 的调用间隔,否则会导致视频帧率不稳定。
  1120 + *
  1121 + */
  1122 +- (void)sendCustomVideoData:(TRTCVideoFrame *)frame;
  1123 +
  1124 +/**
  1125 + * 9.3 设置本地视频的自定义渲染回调
  1126 + *
  1127 + * 设置此方法后,SDK 内部会跳过原来的渲染流程,并把采集到的数据回调出来,您需要自己完成画面渲染。
  1128 + * - pixelFormat 指定回调的数据格式,例如 NV12、i420 以及 32BGRA。
  1129 + * - bufferType 指定 buffer 的类型,直接使用 PixelBuffer 效率最高;使用 NSData 相当于让 SDK 在内部做了一次内存转换,因此会有额外的性能损耗。
  1130 + *
  1131 + * @param delegate 自定义渲染回调
  1132 + * @param pixelFormat 指定回调的像素格式
  1133 + * @param bufferType PixelBuffer:可以直接使用 imageWithCVImageBuffer 转成 UIImage;NSData:经过内存整理的视频数据。
  1134 + * @return 0:成功;<0:错误
  1135 + */
  1136 +- (int)setLocalVideoRenderDelegate:(id<TRTCVideoRenderDelegate>)delegate pixelFormat:(TRTCVideoPixelFormat)pixelFormat bufferType:(TRTCVideoBufferType)bufferType;
  1137 +
  1138 +/**
  1139 + * 9.4 设置远端视频的自定义渲染回调
  1140 + *
  1141 + * 此方法同 setLocalVideoRenderDelegate,区别在于一个是本地画面的渲染回调, 一个是远程画面的渲染回调。
  1142 + *
  1143 + * @note 调用此函数之前,需要先调用 startRemoteView 来获取远端用户的视频流(view 设置为 nil 即可),否则不会有数据回调出来。
  1144 + *
  1145 + * @param userId 指定目标 userId。
  1146 + * @param delegate 自定义渲染的回调。
  1147 + * @param pixelFormat 指定回调的像素格式。
  1148 + * @param bufferType PixelBuffer:可以直接使用 imageWithCVImageBuffer 转成 UIImage;NSData:经过内存整理的视频数据。
  1149 + * @return 0:成功;<0:错误
  1150 + */
  1151 +- (int)setRemoteVideoRenderDelegate:(NSString*)userId delegate:(id<TRTCVideoRenderDelegate>)delegate pixelFormat:(TRTCVideoPixelFormat)pixelFormat bufferType:(TRTCVideoBufferType)bufferType;
  1152 +
  1153 +/**
  1154 + * 9.5 启用音频自定义采集模式
  1155 + *
  1156 + * 开启该模式后,SDK 不在运行原有的音频采集流程,只保留编码和发送能力。
  1157 + * 您需要用 sendCustomAudioData() 不断地向 SDK 塞入自己采集的音频数据。
  1158 + *
  1159 + * @note 由于回声抵消(AEC)需要严格的控制声音采集和播放的时间,所以开启自定义音频采集后,AEC 能力可能会失效。
  1160 + *
  1161 + * @param enable 是否启用, true:启用;false:关闭,默认值:NO
  1162 + */
  1163 +- (void)enableCustomAudioCapture:(BOOL)enable;
  1164 +
  1165 +/**
  1166 + * 9.6 向 SDK 投送自己采集的音频数据
  1167 + *
  1168 + * TRTCAudioFrame 推荐如下填写方式:
  1169 + *
  1170 + * - data:音频帧 buffer。音频帧数据必须是 PCM 格式,推荐每帧20ms采样数。【48000采样率、单声道的帧长度:48000 × 0.02s × 1 × 16bit = 15360bit = 1920字节】。
  1171 + * - sampleRate:采样率,仅支持48000。
  1172 + * - channel:频道数量(如果是立体声,数据是交叉的),单声道:1; 双声道:2。
  1173 + * - timestamp:如果 timestamp 间隔不均匀,会严重影响音画同步和录制出的 MP4 质量。
  1174 + *
  1175 + * 参考文档:[自定义采集和渲染](https://cloud.tencent.com/document/product/647/34066)。
  1176 + *
  1177 + * @param frame 音频数据
  1178 + * @note 可以设置 frame 中的 timestamp 为0,相当于让 SDK 自己设置时间戳,但请“均匀”地控制 sendCustomAudioData 的调用间隔,否则会导致声音断断续续。
  1179 + */
  1180 +- (void)sendCustomAudioData:(TRTCAudioFrame *)frame;
  1181 +
  1182 +/**
  1183 + * 9.7 设置音频数据回调
  1184 + *
  1185 + * 设置此方法,SDK 内部会把音频数据(PCM 格式)回调出来,包括:
  1186 + * - onCapturedAudioFrame:本机麦克风采集到的音频数据
  1187 + * - onPlayAudioFrame:混音前的每一路远程用户的音频数据
  1188 + * - onMixedPlayAudioFrame:各路音频数据混合后送入扬声器播放的音频数据
  1189 + *
  1190 + * @param delegate 音频数据回调,delegate = nil 则停止回调数据
  1191 + */
  1192 +- (void)setAudioFrameDelegate:(id<TRTCAudioFrameDelegate>)delegate;
  1193 +
  1194 +/// @}
  1195 +
  1196 +
  1197 +/////////////////////////////////////////////////////////////////////////////////
  1198 +//
  1199 +// (十)自定义消息发送
  1200 +//
  1201 +/////////////////////////////////////////////////////////////////////////////////
  1202 +#pragma mark - 自定义消息发送
  1203 +/// @name 自定义消息发送
  1204 +/// @{
  1205 +
  1206 +/**
  1207 + * 10.1 发送自定义消息给房间内所有用户
  1208 + *
  1209 + * 该接口可以借助音视频数据通道向当前房间里的其他用户广播您自定义的数据,但因为复用了音视频数据通道,
  1210 + * 请务必严格控制自定义消息的发送频率和消息体的大小,否则会影响音视频数据的质量控制逻辑,造成不确定性的问题。
  1211 + *
  1212 + * @param cmdID 消息 ID,取值范围为1 - 10
  1213 + * @param data 待发送的消息,最大支持1KB(1000字节)的数据大小
  1214 + * @param reliable 是否可靠发送,可靠发送的代价是会引入一定的延时,因为接收端要暂存一段时间的数据来等待重传
  1215 + * @param ordered 是否要求有序,即是否要求接收端接收的数据顺序和发送端发送的顺序一致,这会带来一定的接收延时,因为在接收端需要暂存并排序这些消息。
  1216 + * @return YES:消息已经发出;NO:消息发送失败。
  1217 + *
  1218 + * @note 本接口有以下限制:
  1219 + * - 发送消息到房间内所有用户,每秒最多能发送30条消息。
  1220 + * - 每个包最大为1KB,超过则很有可能会被中间路由器或者服务器丢弃。
  1221 + * - 每个客户端每秒最多能发送总计8KB数据。
  1222 + * - 将 reliable 和 ordered 同时设置为 YES 或 NO,暂不支持交叉设置。
  1223 + * - 强烈建议不同类型的消息使用不同的 cmdID,这样可以在要求有序的情况下减小消息时延。
  1224 + */
  1225 +- (BOOL)sendCustomCmdMsg:(NSInteger)cmdID data:(NSData *)data reliable:(BOOL)reliable ordered:(BOOL)ordered;
  1226 +
  1227 +/**
  1228 + * 10.2 将小数据量的自定义数据嵌入视频帧中
  1229 + *
  1230 + * 与 sendCustomCmdMsg 的原理不同,sendSEIMsg 是将数据直接塞入视频数据头中。因此,即使视频帧被旁路到了直播 CDN 上,
  1231 + * 这些数据也会一直存在。由于需要把数据嵌入视频帧中,建议尽量控制数据大小,推荐使用几个字节大小的数据。
  1232 + *
  1233 + * 最常见的用法是把自定义的时间戳(timstamp)用 sendSEIMsg 嵌入视频帧中,实现消息和画面的完美对齐。
  1234 + *
  1235 + * @param data 待发送的数据,最大支持1kb(1000字节)的数据大小
  1236 + * @param repeatCount 发送数据次数
  1237 + * @return YES:消息已通过限制,等待后续视频帧发送;NO:消息被限制发送
  1238 + *
  1239 + * @note 本接口有以下限制:
  1240 + * - 数据在接口调用完后不会被即时发送出去,而是从下一帧视频帧开始带在视频帧中发送。
  1241 + * - 发送消息到房间内所有用户,每秒最多能发送30条消息(与 sendCustomCmdMsg 共享限制)。
  1242 + * - 每个包最大为1KB,若发送大量数据,会导致视频码率增大,可能导致视频画质下降甚至卡顿(与 sendCustomCmdMsg 共享限制)。
  1243 + * - 每个客户端每秒最多能发送总计8KB数据(与 sendCustomCmdMsg 共享限制)。
  1244 + * - 若指定多次发送(repeatCount > 1),则数据会被带在后续的连续 repeatCount 个视频帧中发送出去,同样会导致视频码率增大。
  1245 + * - 如果 repeatCount > 1,多次发送,接收消息 onRecvSEIMsg 回调也可能会收到多次相同的消息,需要去重。
  1246 + */
  1247 +- (BOOL)sendSEIMsg:(NSData *)data repeatCount:(int)repeatCount;
  1248 +
  1249 +/// @}
  1250 +
  1251 +/////////////////////////////////////////////////////////////////////////////////
  1252 +//
  1253 +// (十一)背景混音相关接口函数
  1254 +//
  1255 +/////////////////////////////////////////////////////////////////////////////////
  1256 +#pragma mark - 背景混音相关接口函数
  1257 +/// @name 背景混音相关接口函数
  1258 +/// @{
  1259 +/**
  1260 + * 11.1 启动播放背景音乐
  1261 + *
  1262 + * @param path 音乐文件路径,支持的文件格式:aac, mp3, m4a。
  1263 + * @param beginNotify 音乐播放开始的回调通知
  1264 + * @param progressNotify 音乐播放的进度通知,单位毫秒
  1265 + * @param completeNotify 音乐播放结束的回调通知
  1266 + */
  1267 +- (void) playBGM:(NSString *)path
  1268 + withBeginNotify:(void (^)(NSInteger errCode))beginNotify
  1269 +withProgressNotify:(void (^)(NSInteger progressMS, NSInteger durationMS))progressNotify
  1270 + andCompleteNotify:(void (^)(NSInteger errCode))completeNotify;
  1271 +
  1272 +/**
  1273 + * 11.2 停止播放背景音乐
  1274 + */
  1275 +- (void)stopBGM;
  1276 +
  1277 +/**
  1278 + * 11.3 暂停播放背景音乐
  1279 + */
  1280 +- (void)pauseBGM;
  1281 +
  1282 +/**
  1283 + * 11.4 继续播放背景音乐
  1284 + */
  1285 +- (void)resumeBGM;
  1286 +
  1287 +/**
  1288 + * 11.5 获取音乐文件总时长,单位毫秒
  1289 + *
  1290 + * @param path 音乐文件路径,如果 path 为空,那么返回当前正在播放的 music 时长。
  1291 + * @return 成功返回时长,失败返回-1
  1292 + */
  1293 +- (NSInteger)getBGMDuration:(NSString *)path;
  1294 +
  1295 +/**
  1296 + * 11.6 设置 BGM 播放进度
  1297 + *
  1298 + * @param pos 单位毫秒
  1299 + * @return 0:成功;-1:失败
  1300 + */
  1301 +- (int)setBGMPosition:(NSInteger)pos;
  1302 +
  1303 +/**
  1304 + * 11.7 设置背景音乐播放音量的大小
  1305 + *
  1306 + * 播放背景音乐混音时使用,用来控制背景音乐播放音量的大小,
  1307 + * 该接口会同时控制远端播放音量的大小和本地播放音量的大小,
  1308 + * 因此调用该接口后,setBGMPlayoutVolume和setBGMPublishVolume设置的音量值会被覆盖
  1309 + *
  1310 + * @param volume 音量大小,100为正常音量,取值范围为0 - 100;默认值:100
  1311 + */
  1312 +- (void)setBGMVolume:(NSInteger)volume;
  1313 +
  1314 +/**
  1315 + * 11.8 设置背景音乐本地播放音量的大小
  1316 + *
  1317 + * 播放背景音乐混音时使用,用来控制背景音乐在本地播放时的音量大小。
  1318 + *
  1319 + * @param volume 音量大小,100为正常音量,取值范围为0 - 100;默认值:100
  1320 + */
  1321 +- (void)setBGMPlayoutVolume:(NSInteger)volume;
  1322 +
  1323 +/**
  1324 + * 11.9 设置背景音乐远端播放音量的大小
  1325 + *
  1326 + * 播放背景音乐混音时使用,用来控制背景音乐在远端播放时的音量大小。
  1327 + *
  1328 + * @param volume 音量大小,100为正常音量,取值范围为0 - 100;默认值:100
  1329 + */
  1330 +- (void)setBGMPublishVolume:(NSInteger)volume;
  1331 +
  1332 +/**
  1333 + * 11.10 设置混响效果 (目前仅支持 iOS)
  1334 + *
  1335 + * @param reverbType 混响类型,详情请参见 TXReverbType
  1336 + */
  1337 +- (void)setReverbType:(TRTCReverbType)reverbType;
  1338 +
  1339 +/**
  1340 + * 11.10 设置变声类型 (目前仅支持 iOS)
  1341 + *
  1342 + * @param voiceChangerType 变声类型,详情请参见 TXVoiceChangerType
  1343 + */
  1344 +- (void)setVoiceChangerType:(TRTCVoiceChangerType)voiceChangerType;
  1345 +/// @}
  1346 +
  1347 +/////////////////////////////////////////////////////////////////////////////////
  1348 +//
  1349 +// (十二)音效相关接口函数
  1350 +//
  1351 +/////////////////////////////////////////////////////////////////////////////////
  1352 +#pragma mark - 音效相关接口函数
  1353 +/// @name 音效相关接口函数
  1354 +/// @{
  1355 +/**
  1356 + * 12.1 播放音效
  1357 + *
  1358 + * 每个音效都需要您指定具体的 ID,您可以通过该 ID 对音效的开始、停止、音量等进行设置。
  1359 + * 支持的文件格式:aac, mp3, m4a。
  1360 + *
  1361 + * @note 若您想同时播放多个音效,请分配不同的 ID 进行播放。因为使用同一个 ID 播放不同音效,SDK 会先停止播放旧的音效,再播放新的音效。
  1362 + *
  1363 + * @param effect 音效
  1364 + */
  1365 +- (void)playAudioEffect:(TRTCAudioEffectParam*) effect;
  1366 +
  1367 +/**
  1368 + * 12.2 设置音效音量
  1369 + *
  1370 + * @note 该操作会覆盖通过 setAllAudioEffectsVolume 指定的整体音效音量。
  1371 + *
  1372 + * @param effectId 音效 ID
  1373 + * @param volume 音量大小,取值范围为0 - 100;默认值:100
  1374 + */
  1375 +- (void)setAudioEffectVolume:(int) effectId volume:(int) volume;
  1376 +
  1377 +/**
  1378 + * 12.3 停止音效
  1379 + *
  1380 + * @param effectId 音效 ID
  1381 + */
  1382 +- (void)stopAudioEffect:(int) effectId;
  1383 +
  1384 +/**
  1385 + * 12.4 停止所有音效
  1386 + */
  1387 +- (void)stopAllAudioEffects;
  1388 +
  1389 +/**
  1390 + * 12.5 设置所有音效音量
  1391 + *
  1392 + * @note 该操作会覆盖通过 setAudioEffectVolume 指定的单独音效音量。
  1393 + *
  1394 + * @param volume 音量大小,取值范围为0 - 100;默认值:100
  1395 + */
  1396 +- (void)setAllAudioEffectsVolume:(int) volume;
  1397 +
  1398 +/**
  1399 + * 12.6 暂停音效
  1400 + *
  1401 + * @param effectId 音效 ID
  1402 + */
  1403 +- (void)pauseAudioEffect:(int)effectId;
  1404 +
  1405 +/**
  1406 + * 12.7 恢复音效
  1407 + *
  1408 + * @param effectId 音效 ID
  1409 + */
  1410 +- (void)resumeAudioEffect:(int)effectId;
  1411 +/// @}
  1412 +
  1413 +/////////////////////////////////////////////////////////////////////////////////
  1414 +//
  1415 +// (十三)设备和网络测试
  1416 +//
  1417 +/////////////////////////////////////////////////////////////////////////////////
  1418 +#pragma mark - 设备和网络测试
  1419 +/// @name 设备和网络测试
  1420 +/// @{
  1421 +
  1422 +/**
  1423 + * 13.1 开始进行网络测速(视频通话期间请勿测试,以免影响通话质量)
  1424 + *
  1425 + * 测速结果将会用于优化 SDK 接下来的服务器选择策略,因此推荐您在用户首次通话前先进行一次测速,这将有助于我们选择最佳的服务器。
  1426 + * 同时,如果测试结果非常不理想,您可以通过醒目的 UI 提示用户选择更好的网络。
  1427 + *
  1428 + * @note 测速本身会消耗一定的流量,所以也会产生少量额外的流量费用。
  1429 + *
  1430 + * @param sdkAppId 应用标识
  1431 + * @param userId 用户标识
  1432 + * @param userSig 用户签名
  1433 + * @param completion 测试回调,会分多次回调
  1434 + */
  1435 +- (void)startSpeedTest:(uint32_t)sdkAppId userId:(NSString *)userId userSig:(NSString *)userSig completion:(void(^)(TRTCSpeedTestResult* result, NSInteger completedCount, NSInteger totalCount))completion;
  1436 +
  1437 +/**
  1438 + * 13.2 停止服务器测速
  1439 + */
  1440 +- (void)stopSpeedTest;
  1441 +
  1442 +
  1443 +#if TARGET_OS_OSX
  1444 +/**
  1445 + * 13.3 开始进行摄像头测试
  1446 + *
  1447 + * @note 在测试过程中可以使用 setCurrentCameraDevice 接口切换摄像头。
  1448 + * @param view 预览控件所在的父控件
  1449 + */
  1450 +- (void)startCameraDeviceTestInView:(NSView *)view;
  1451 +
  1452 +/**
  1453 + * 13.4 结束视频测试预览
  1454 + */
  1455 +- (void)stopCameraDeviceTest;
  1456 +
  1457 +
  1458 +/**
  1459 + * 13.5 开始进行麦克风测试
  1460 + *
  1461 + * 该方法测试麦克风是否能正常工作,volume 的取值范围为0 - 100。
  1462 + */
  1463 +- (void)startMicDeviceTest:(NSInteger)interval testEcho:(void (^)(NSInteger volume))testEcho;
  1464 +
  1465 +/**
  1466 + * 13.6 停止麦克风测试
  1467 + */
  1468 +- (void)stopMicDeviceTest;
  1469 +
  1470 +/**
  1471 + * 13.7 开始扬声器测试
  1472 + *
  1473 + * 该方法播放指定的音频文件测试播放设备是否能正常工作。如果能听到声音,说明播放设备能正常工作。
  1474 + */
  1475 +- (void)startSpeakerDeviceTest:(NSString*)audioFilePath onVolumeChanged:(void (^)(NSInteger volume, BOOL isLastFrame))volumeBlock;
  1476 +
  1477 +/**
  1478 + * 13.8 停止扬声器测试
  1479 + */
  1480 +- (void)stopSpeakerDeviceTest;
  1481 +
  1482 +#endif
  1483 +
  1484 +/// @}
  1485 +
  1486 +/////////////////////////////////////////////////////////////////////////////////
  1487 +//
  1488 +// (十四)Log 相关接口函数
  1489 +//
  1490 +/////////////////////////////////////////////////////////////////////////////////
  1491 +/// @name Log 相关接口函数
  1492 +/// @{
  1493 +
  1494 +#pragma mark - LOG 相关接口函数
  1495 +/**
  1496 + * 14.1 获取 SDK 版本信息
  1497 + */
  1498 ++ (NSString *)getSDKVersion;
  1499 +
  1500 +/**
  1501 + * 14.2 设置 Log 输出级别
  1502 + *
  1503 + * @param level 参见 TRTCLogLevel,默认值:TRTC_LOG_LEVEL_NULL
  1504 + */
  1505 ++ (void)setLogLevel:(TRTCLogLevel)level;
  1506 +
  1507 +/**
  1508 + * 14.3 启用或禁用控制台日志打印
  1509 + *
  1510 + * @param enabled 指定是否启用,默认为禁止状态
  1511 + */
  1512 ++ (void)setConsoleEnabled:(BOOL)enabled;
  1513 +
  1514 +/**
  1515 + * 14.4 启用或禁用 Log 的本地压缩。
  1516 + *
  1517 + * 开启压缩后,Log 存储体积明显减小,但需要腾讯云提供的 Python 脚本解压后才能阅读。
  1518 + * 禁用压缩后,Log 采用明文存储,可以直接用记事本打开阅读,但占用空间较大。
  1519 + *
  1520 + * @param enabled 指定是否启用,默认为启动状态
  1521 + */
  1522 ++ (void)setLogCompressEnabled:(BOOL)enabled;
  1523 +
  1524 +/**
  1525 + * 14.5 修改日志保存路径
  1526 + *
  1527 + * @note 日志文件默认保存在 sandbox Documents/log 下,如需修改,必须在所有方法前调用。
  1528 + * @param path 存储日志路径
  1529 + */
  1530 ++ (void)setLogDirPath:(NSString *)path;
  1531 +
  1532 +/**
  1533 + * 14.6 设置日志回调
  1534 + */
  1535 ++ (void)setLogDelegate:(id<TRTCLogDelegate>)logDelegate;
  1536 +
  1537 +/**
  1538 + * 14.7 显示仪表盘
  1539 + *
  1540 + * 仪表盘是状态统计和事件消息浮层 view,方便调试。
  1541 + * @param showType 0:不显示;1:显示精简版;2:显示全量版
  1542 + */
  1543 +- (void)showDebugView:(NSInteger)showType;
  1544 +
  1545 +/**
  1546 + * 14.8 设置仪表盘的边距
  1547 + *
  1548 + * 必须在 showDebugView 调用前设置才会生效
  1549 + * @param userId 用户 ID
  1550 + * @param margin 仪表盘内边距,注意这里是基于 parentView 的百分比,margin 的取值范围是0 - 1
  1551 + */
  1552 +- (void)setDebugViewMargin:(NSString *)userId margin:(TXEdgeInsets)margin;
  1553 +
  1554 +
  1555 +/**
  1556 + * 14.9 调用实验性 API 接口
  1557 + *
  1558 + * @note 该接口用于调用一些实验性功能
  1559 + * @param jsonStr 接口及参数描述的 JSON 字符串
  1560 + */
  1561 +- (void)callExperimentalAPI:(NSString*)jsonStr;
  1562 +
  1563 +/// @}
  1564 +
  1565 +/////////////////////////////////////////////////////////////////////////////////
  1566 +//
  1567 +// (十五)弃用接口函数
  1568 +//
  1569 +/////////////////////////////////////////////////////////////////////////////////
  1570 +#pragma mark - 弃用接口函数
  1571 +/// @name 弃用接口函数
  1572 +/// @{
  1573 +
  1574 +/**
  1575 + * 15.1 设置麦克风的音量大小
  1576 + *
  1577 + * @deprecated v6.9 版本弃用
  1578 + * 播放背景音乐混音时使用,用来控制麦克风音量大小。
  1579 + *
  1580 + * @param volume 音量大小,100为正常音量,取值范围为0 - 100;默认值:100
  1581 + */
  1582 +- (void)setMicVolumeOnMixing:(NSInteger)volume __attribute__((deprecated("use setAudioCaptureVolume instead")));
  1583 +
  1584 +/**
  1585 + * 15.2 设置美颜、美白以及红润效果级别
  1586 + *
  1587 + * SDK 内部集成两套风格不同的磨皮算法,一套我们取名叫“光滑”,适用于美女秀场,效果比较明显。
  1588 + * 另一套我们取名“自然”,磨皮算法更多地保留了面部细节,主观感受上会更加自然。
  1589 + *
  1590 + * @deprecated v6.9 版本弃用,请使用 TXBeautyManager 设置美颜功能
  1591 + * @param beautyStyle 美颜风格,光滑或者自然,光滑风格磨皮更加明显,适合娱乐场景。
  1592 + * @param beautyLevel 美颜级别,取值范围0 - 9; 0表示关闭,1 - 9值越大,效果越明显。
  1593 + * @param whitenessLevel 美白级别,取值范围0 - 9;0表示关闭,1 - 9值越大,效果越明显。
  1594 + * @param ruddinessLevel 红润级别,取值范围0 - 9;0表示关闭,1 - 9值越大,效果越明显。
  1595 + */
  1596 +- (void)setBeautyStyle:(TRTCBeautyStyle)beautyStyle beautyLevel:(NSInteger)beautyLevel
  1597 + whitenessLevel:(NSInteger)whitenessLevel ruddinessLevel:(NSInteger)ruddinessLevel
  1598 + __attribute__((deprecated("use getBeautyManager instead")));
  1599 +
  1600 +#if TARGET_OS_IPHONE
  1601 +/**
  1602 + * 15.3 设置大眼级别(企业版有效,其它版本设置此参数无效)
  1603 + *
  1604 + * @deprecated v6.9 版本弃用,请使用 TXBeautyManager 设置美颜功能
  1605 + * @param eyeScaleLevel 大眼级别,取值范围0 - 9;0表示关闭,1 - 9值越大,效果越明显。
  1606 + */
  1607 +- (void)setEyeScaleLevel:(float)eyeScaleLevel __attribute__((deprecated("use getBeautyManager instead")));
  1608 +
  1609 +/**
  1610 + * 15.4 设置瘦脸级别(企业版有效,其它版本设置此参数无效)
  1611 + *
  1612 + * @deprecated v6.9 版本弃用,请使用 TXBeautyManager 设置美颜功能
  1613 + * @param faceScaleLevel 瘦脸级别,取值范围0 - 9;0表示关闭,1 - 9值越大,效果越明显。
  1614 + */
  1615 +- (void)setFaceScaleLevel:(float)faceScaleLevel __attribute__((deprecated("use getBeautyManager instead")));
  1616 +
  1617 +/**
  1618 + * 15.5 设置V脸级别(企业版有效,其它版本设置此参数无效)
  1619 + *
  1620 + * @deprecated v6.9 版本弃用,请使用 TXBeautyManager 设置美颜功能
  1621 + * @param faceVLevel V脸级别,取值范围0 - 9;0表示关闭,1 - 9值越大,效果越明显。
  1622 + */
  1623 +- (void)setFaceVLevel:(float)faceVLevel __attribute__((deprecated("use getBeautyManager instead")));
  1624 +
  1625 +/**
  1626 + * 15.6 设置下巴拉伸或收缩(企业版有效,其它版本设置此参数无效)
  1627 + *
  1628 + * @deprecated v6.9 版本弃用,请使用 TXBeautyManager 设置美颜功能
  1629 + * @param chinLevel 下巴拉伸或收缩级别,取值范围 -9 - 9;0 表示关闭,小于0表示收缩,大于0表示拉伸。
  1630 + */
  1631 +- (void)setChinLevel:(float)chinLevel __attribute__((deprecated("use getBeautyManager instead")));
  1632 +
  1633 +/**
  1634 + * 15.7 设置短脸级别(企业版有效,其它版本设置此参数无效)
  1635 + *
  1636 + * @deprecated v6.9 版本弃用,请使用 TXBeautyManager 设置美颜功能
  1637 + * @param faceShortlevel 短脸级别,取值范围0 - 9;0表示关闭,1 - 9值越大,效果越明显。
  1638 + */
  1639 +- (void)setFaceShortLevel:(float)faceShortlevel __attribute__((deprecated("use getBeautyManager instead")));
  1640 +
  1641 +/**
  1642 + * 15.8 设置瘦鼻级别(企业版有效,其它版本设置此参数无效)
  1643 + *
  1644 + * @deprecated v6.9 版本弃用,请使用 TXBeautyManager 设置美颜功能
  1645 + * @param noseSlimLevel 瘦鼻级别,取值范围0 - 9;0表示关闭,1 - 9值越大,效果越明显。
  1646 + */
  1647 +- (void)setNoseSlimLevel:(float)noseSlimLevel __attribute__((deprecated("use getBeautyManager instead")));
  1648 +
  1649 +/**
  1650 + * 15.9 选择使用哪一款 AI 动效挂件(企业版有效,其它版本设置此参数无效)
  1651 + *
  1652 + * @deprecated v6.9 版本弃用,请使用 TXBeautyManager 设置美颜功能
  1653 + * @param tmplPath 动效文件路径
  1654 + */
  1655 +- (void)selectMotionTmpl:(NSString *)tmplPath __attribute__((deprecated("use getBeautyManager instead")));
  1656 +
  1657 +/**
  1658 + * 15.10 设置动效静音(企业版有效,其它版本设置此参数无效)
  1659 + *
  1660 + * 部分挂件本身会有声音特效,通过此 API 可以关闭特效播放时所带的声音效果。
  1661 + *
  1662 + * @deprecated v6.9 版本弃用,请使用 TXBeautyManager 设置美颜功能
  1663 + * @param motionMute YES:静音;NO:不静音。
  1664 + */
  1665 +- (void)setMotionMute:(BOOL)motionMute __attribute__((deprecated("use getBeautyManager instead")));
  1666 +
  1667 +#endif
  1668 +
  1669 +/// @}
  1670 +
  1671 +@end
  1672 +///@}
  1 +/*
  2 + * Module: TRTC 关键类型定义
  3 + *
  4 + * Function: 分辨率、质量等级等枚举和常量值的定义
  5 + *
  6 + */
  7 +
  8 +#import <Foundation/Foundation.h>
  9 +#if TARGET_OS_IPHONE || TARGET_OS_SIMULATOR
  10 +#import <UIKit/UIKit.h>
  11 +typedef UIView TXView;
  12 +typedef UIImage TXImage;
  13 +typedef UIEdgeInsets TXEdgeInsets;
  14 +#elif TARGET_OS_MAC
  15 +#import <AppKit/AppKit.h>
  16 +typedef NSView TXView;
  17 +typedef NSImage TXImage;
  18 +typedef NSEdgeInsets TXEdgeInsets;
  19 +#endif
  20 +
  21 +///@defgroup TRTCCloudDef_ios 关键类型定义
  22 +///腾讯云视频通话功能的关键类型定义
  23 +///@{
  24 +
  25 +/////////////////////////////////////////////////////////////////////////////////
  26 +//
  27 +// 【(一)视频相关枚举值定义】
  28 +//
  29 +/////////////////////////////////////////////////////////////////////////////////
  30 +
  31 +/**
  32 + * 1.1 视频分辨率
  33 + *
  34 + * 此处仅定义横屏分辨率,如需使用竖屏分辨率(例如360 × 640),需要同时指定 TRTCVideoResolutionMode 为 Portrait。
  35 + */
  36 +typedef NS_ENUM(NSInteger, TRTCVideoResolution) {
  37 + // 宽高比1:1
  38 + TRTCVideoResolution_120_120 = 1, ///< [C] 建议码率80kbps
  39 + TRTCVideoResolution_160_160 = 3, ///< [C] 建议码率100kbps
  40 + TRTCVideoResolution_270_270 = 5, ///< [C] 建议码率200kbps
  41 + TRTCVideoResolution_480_480 = 7, ///< [C] 建议码率350kbps
  42 +
  43 + // 宽高比4:3
  44 + TRTCVideoResolution_160_120 = 50, ///< [C] 建议码率100kbps
  45 + TRTCVideoResolution_240_180 = 52, ///< [C] 建议码率150kbps
  46 + TRTCVideoResolution_280_210 = 54, ///< [C] 建议码率200kbps
  47 + TRTCVideoResolution_320_240 = 56, ///< [C] 建议码率250kbps
  48 + TRTCVideoResolution_400_300 = 58, ///< [C] 建议码率300kbps
  49 + TRTCVideoResolution_480_360 = 60, ///< [C] 建议码率400kbps
  50 + TRTCVideoResolution_640_480 = 62, ///< [C] 建议码率600kbps
  51 + TRTCVideoResolution_960_720 = 64, ///< [C] 建议码率1000kbps
  52 +
  53 + // 宽高比16:9
  54 + TRTCVideoResolution_160_90 = 100, ///< [C] 建议码率100kbps
  55 + TRTCVideoResolution_256_144 = 102, ///< [C] 建议码率150kbps
  56 + TRTCVideoResolution_320_180 = 104, ///< [C] 建议码率250kbps
  57 + TRTCVideoResolution_480_270 = 106, ///< [C] 建议码率350kbps
  58 + TRTCVideoResolution_640_360 = 108, ///< [C] 建议码率550kbps
  59 + TRTCVideoResolution_960_540 = 110, ///< [C] 建议码率850kbps
  60 + TRTCVideoResolution_1280_720 = 112, ///< [C] 摄像头采集 - 建议码率1200kbps
  61 + ///< [S] 屏幕分享 - 建议码率:低清:1000kbps 高清:1600kbps
  62 + TRTCVideoResolution_1920_1080 = 114, ///< [S] 屏幕分享 - 建议码率2000kbps
  63 +};
  64 +
  65 +/**
  66 + * 1.2 视频宽高比模式
  67 + *
  68 + * - 横屏分辨率:TRTCVideoResolution_640_360 + TRTCVideoResolutionModeLandscape = 640 × 360
  69 + * - 竖屏分辨率:TRTCVideoResolution_640_360 + TRTCVideoResolutionModePortrait = 360 × 640
  70 + */
  71 +typedef NS_ENUM(NSInteger, TRTCVideoResolutionMode) {
  72 + TRTCVideoResolutionModeLandscape = 0, ///< 横屏分辨率
  73 + TRTCVideoResolutionModePortrait = 1, ///< 竖屏分辨率
  74 +};
  75 +
  76 +
  77 +/**
  78 + * 1.3 视频流类型
  79 + *
  80 + * TRTC 内部有三种不同的音视频流,分别是:
  81 + * - 主画面:最常用的一条线路,一般用来传输摄像头的视频数据。
  82 + * - 小画面:跟主画面的内容相同,但是分辨率和码率更低。
  83 + * - 辅流画面:一般用于屏幕分享,以及远程播片(例如老师放一段视频给学生)。
  84 + *
  85 + * @note - 如果主播的上行网络和性能比较好,则可以同时送出大小两路画面。
  86 + * @note - SDK 不支持单独开启小画面,小画面必须依附于主画面而存在。
  87 + */
  88 +
  89 +typedef NS_ENUM(NSInteger, TRTCVideoStreamType) {
  90 + TRTCVideoStreamTypeBig = 0, ///< 主画面视频流
  91 + TRTCVideoStreamTypeSmall = 1, ///< 小画面视频流
  92 + TRTCVideoStreamTypeSub = 2, ///< 辅流(屏幕分享)
  93 +
  94 +};
  95 +
  96 +/**
  97 + * 1.4 画质级别
  98 + *
  99 + * TRTC SDK 对画质定义了六种不同的级别,Excellent 表示最好,Down 表示不可用。
  100 + */
  101 +typedef NS_ENUM(NSInteger, TRTCQuality) {
  102 + TRTCQuality_Unknown = 0, ///< 未定义
  103 + TRTCQuality_Excellent = 1, ///< 最好
  104 + TRTCQuality_Good = 2, ///< 好
  105 + TRTCQuality_Poor = 3, ///< 一般
  106 + TRTCQuality_Bad = 4, ///< 差
  107 + TRTCQuality_Vbad = 5, ///< 很差
  108 + TRTCQuality_Down = 6, ///< 不可用
  109 +};
  110 +
  111 +/**
  112 + * 1.5 视频画面填充模式
  113 + *
  114 + * 如果画面的显示分辨率不等于画面的原始分辨率,就需要您设置画面的填充模式:
  115 + * - TRTCVideoFillMode_Fill,图像铺满屏幕,超出显示视窗的视频部分将被裁剪,画面显示可能不完整。
  116 + * - TRTCVideoFillMode_Fit,图像长边填满屏幕,短边区域会被填充黑色,画面的内容完整。
  117 + */
  118 +typedef NS_ENUM(NSInteger, TRTCVideoFillMode) {
  119 + TRTCVideoFillMode_Fill = 0, ///< 图像铺满屏幕,超出显示视窗的视频部分将被裁剪
  120 + TRTCVideoFillMode_Fit = 1, ///< 图像长边填满屏幕,短边区域会被填充黑色
  121 +};
  122 +
  123 +/**
  124 + * 1.6 视频画面旋转方向
  125 + *
  126 + * TRTC SDK 提供了对本地和远程画面的旋转角度设置 API,下列的旋转角度都是指顺时针方向的。
  127 + */
  128 +typedef NS_ENUM(NSInteger, TRTCVideoRotation) {
  129 + TRTCVideoRotation_0 = 0, ///< 不旋转
  130 + TRTCVideoRotation_90 = 1, ///< 顺时针旋转90度
  131 + TRTCVideoRotation_180 = 2, ///< 顺时针旋转180度
  132 + TRTCVideoRotation_270 = 3, ///< 顺时针旋转270度
  133 +};
  134 +
  135 +/**
  136 + * 1.7 美颜(磨皮)算法
  137 + *
  138 + * TRTC SDK 内置多种不同的磨皮算法,您可以选择最适合您产品定位的方案。
  139 + */
  140 +typedef NS_ENUM(NSInteger, TRTCBeautyStyle) {
  141 + TRTCBeautyStyleSmooth = 0, ///< 光滑,适用于美女秀场,效果比较明显。
  142 + TRTCBeautyStyleNature = 1, ///< 自然,磨皮算法更多地保留了面部细节,主观感受上会更加自然。
  143 +};
  144 +
  145 +/**
  146 + * 1.8 视频像素格式
  147 + *
  148 + * TRTC SDK 提供针对视频的自定义采集和自定义渲染功能,在自定义采集功能中,您可以用下列枚举值描述您采集的视频像素格式。
  149 + * 在自定义渲染功能中,您可以指定您期望 SDK 回调的视频像素格式。
  150 + */
  151 +typedef NS_ENUM(NSInteger, TRTCVideoPixelFormat) {
  152 + TRTCVideoPixelFormat_Unknown = 0, ///< 未知
  153 + TRTCVideoPixelFormat_I420 = 1, ///< YUV420P I420
  154 + TRTCVideoPixelFormat_NV12 = 5, ///< YUV420SP NV12
  155 + TRTCVideoPixelFormat_32BGRA = 6, ///< BGRA8888
  156 +};
  157 +
  158 +
  159 +/**
  160 + * 1.9 视频数据包装格式
  161 + *
  162 + * 在自定义采集和自定义渲染功能,您需要用到下列枚举值来指定您希望以什么类型的容器来包装视频数据。
  163 + * - PixelBuffer:直接使用效率最高,iOS 系统提供了众多 API 获取或处理 PixelBuffer。
  164 + * - NSData:仅用于自定义渲染,SDK 帮您做了一次 PixelBuffer 到 NSData 的内存拷贝工作,会有一定的性能消耗。
  165 + */
  166 +typedef NS_ENUM(NSInteger, TRTCVideoBufferType) {
  167 + TRTCVideoBufferType_Unknown = 0, ///< 未知
  168 + TRTCVideoBufferType_PixelBuffer = 1, ///< 直接使用效率最高,iOS 系统提供了众多 API 获取或处理 PixelBuffer。
  169 + TRTCVideoBufferType_NSData = 2, ///< 仅用于自定义渲染,SDK 帮您做了一次 PixelBuffer 到 NSData 的内存拷贝工作,会有一定的性能消耗。
  170 +};
  171 +
  172 +/**
  173 + * 1.10 本地视频预览镜像类型
  174 + *
  175 + * iOS 的本地画面提供下列设置模式
  176 + */
  177 +typedef NS_ENUM(NSUInteger, TRTCLocalVideoMirrorType) {
  178 + TRTCLocalVideoMirrorType_Auto = 0, ///< 前置摄像头镜像,后置摄像头不镜像
  179 + TRTCLocalVideoMirrorType_Enable = 1, ///< 前后置摄像头画面均镜像
  180 + TRTCLocalVideoMirrorType_Disable = 2, ///< 前后置摄像头画面均不镜像
  181 +};
  182 +
  183 +/////////////////////////////////////////////////////////////////////////////////
  184 +//
  185 +// 【(二)网络相关枚举值定义】
  186 +//
  187 +/////////////////////////////////////////////////////////////////////////////////
  188 +
  189 +/**
  190 + * 2.1 应用场景
  191 + *
  192 + * TRTC 可用于视频会议和在线直播等多种应用场景,针对不同的应用场景,TRTC SDK 的内部会进行不同的优化配置:
  193 + * - TRTCAppSceneVideoCall :视频通话场景,适合[1对1视频通话]、[300人视频会议]、[在线问诊]、[视频聊天]、[远程面试]等。
  194 + * - TRTCAppSceneLIVE :视频互动直播,适合[视频低延时直播]、[十万人互动课堂]、[视频直播 PK]、[视频相亲房]、[互动课堂]、[远程培训]、[超大型会议]等。
  195 + * - TRTCAppSceneAudioCall :语音通话场景,适合[1对1语音通话]、[300人语音会议]、[语音聊天]、[语音会议]、[在线狼人杀]等。
  196 + * - TRTCAppSceneVoiceChatRoom:语音互动直播,适合:[语音低延时直播]、[语音直播连麦]、[语聊房]、[K 歌房]、[FM 电台]等。
  197 + */
  198 +typedef NS_ENUM(NSInteger, TRTCAppScene) {
  199 + /// 视频通话场景,支持720P、1080P高清画质,单个房间最多支持300人同时在线,最高支持50人同时发言。<br>
  200 + /// 适合:[1对1视频通话]、[300人视频会议]、[在线问诊]、[视频聊天]、[远程面试]等。
  201 + TRTCAppSceneVideoCall = 0,
  202 +
  203 + /// 视频互动直播,支持平滑上下麦,切换过程无需等待,主播延时小于300ms;支持十万级别观众同时播放,播放延时低至1000ms。<br>
  204 + /// 适合:[视频低延时直播]、[十万人互动课堂]、[视频直播 PK]、[视频相亲房]、[互动课堂]、[远程培训]、[超大型会议]等。<br>
  205 + /// 注意:此场景下,您必须通过 TRTCParams 中的 role 字段指定当前用户的角色。
  206 + TRTCAppSceneLIVE = 1,
  207 +
  208 + /// 语音通话场景,支持 48kHz,支持双声道。单个房间最多支持300人同时在线,最高支持50人同时发言。<br>
  209 + /// 适合:[1对1语音通话]、[300人语音会议]、[语音聊天]、[语音会议]、[在线狼人杀]等。
  210 + TRTCAppSceneAudioCall = 2,
  211 +
  212 + /// 语音互动直播,支持平滑上下麦,切换过程无需等待,主播延时小于300ms;支持十万级别观众同时播放,播放延时低至1000ms。<br>
  213 + /// 适合:[语音低延时直播]、[语音直播连麦]、[语聊房]、[K 歌房]、[FM 电台]等。<br>
  214 + /// 注意:此场景下,您必须通过 TRTCParams 中的 role 字段指定当前用户的角色。
  215 + TRTCAppSceneVoiceChatRoom = 3,
  216 +};
  217 +
  218 +/**
  219 + * 2.2 角色,仅适用于直播场景(TRTCAppSceneLIVE 和 TRTCAppSceneVoiceChatRoom)
  220 + *
  221 + * 在直播场景中,多数用户仅为观众,个别用户是主播,这种角色区分有利于 TRTC 进行更好的定向优化。
  222 + *
  223 + * - Anchor:主播,可以上行视频和音频,一个房间里最多支持50个主播同时上行音视频。
  224 + * - Audience:观众,只能观看,不能上行视频和音频,一个房间里的观众人数没有上限。
  225 + */
  226 +typedef NS_ENUM(NSInteger, TRTCRoleType) {
  227 + TRTCRoleAnchor = 20, ///< 主播
  228 + TRTCRoleAudience = 21, ///< 观众
  229 +};
  230 +
  231 +/**
  232 + * 2.3 流控模式
  233 + *
  234 + * TRTC SDK 内部需要时刻根据网络情况调整内部的编解码器和网络模块,以便能够对网络的变化做出反应。
  235 + * 为了支持快速算法升级,SDK 内部设置了两种不同的流控模式:
  236 + * - ModeServer:云端控制,默认模式,推荐选择。
  237 + * - ModeClient:本地控制,用于 SDK 开发内部调试,客户请勿使用。
  238 + *
  239 + * @note 推荐您使用云端控制,这样每当我们升级 Qos 算法时,您无需升级 SDK 即可体验更好的效果。
  240 + */
  241 +typedef NS_ENUM(NSInteger, TRTCQosControlMode)
  242 +{
  243 + TRTCQosControlModeClient, ///< 客户端控制(用于 SDK 开发内部调试,客户请勿使用)
  244 + TRTCQosControlModeServer, ///< 云端控制 (默认)
  245 +};
  246 +
  247 +/**
  248 + * 2.4 画质偏好
  249 + *
  250 + * 指当 TRTC SDK 在遇到弱网络环境时,您期望“保清晰”或“保流畅”:
  251 + *
  252 + * - Smooth:弱网下保流畅,即在遭遇弱网环境时首先确保声音的流畅和优先发送,画面会变得模糊且会有较多马赛克,但可以保持流畅不卡顿。
  253 + * - Clear:弱网下保清晰,即在遭遇弱网环境时,画面会尽可能保持清晰,但可能会更容易出现卡顿。
  254 + */
  255 +typedef NS_ENUM(NSInteger, TRTCVideoQosPreference)
  256 +{
  257 + TRTCVideoQosPreferenceSmooth = 1, ///< 弱网下保流畅
  258 + TRTCVideoQosPreferenceClear = 2, ///< 弱网下保清晰
  259 +};
  260 +
  261 +/////////////////////////////////////////////////////////////////////////////////
  262 +//
  263 +// 【(三)声音相关枚举值定义】
  264 +//
  265 +/////////////////////////////////////////////////////////////////////////////////
  266 +
  267 +/**
  268 + * 3.1 音频采样率
  269 + *
  270 + * 音频采样率用来衡量声音的保真程度,采样率越高保真程度越好,如果您的应用场景有音乐的存在,推荐使用 TRTCAudioSampleRate48000。
  271 + */
  272 +typedef NS_ENUM(NSInteger, TRTCAudioSampleRate) {
  273 + TRTCAudioSampleRate16000 = 16000, ///< 16k采样率
  274 + TRTCAudioSampleRate32000 = 32000, ///< 32采样率
  275 + TRTCAudioSampleRate44100 = 44100, ///< 44.1k采样率
  276 + TRTCAudioSampleRate48000 = 48000, ///< 48k采样率
  277 +};
  278 +
  279 +/**
  280 + * 3.2 声音播放模式(音频路由)
  281 + *
  282 + * 微信和手机 QQ 里的视频通话功能,都有一个免提模式,开启后就不用把手机贴在耳朵上,这个功能就是基于音频路由实现的。
  283 + * 一般手机都有两个扬声器,设置音频路由的作用就是要决定声音从哪个扬声器播放出来:
  284 + * - Speakerphone:扬声器,位于手机底部,声音偏大,适合外放音乐。
  285 + * - Earpiece:听筒,位于手机顶部,声音偏小,适合通话。
  286 + */
  287 +typedef NS_ENUM(NSInteger, TRTCAudioRoute) {
  288 + TRTCAudioModeSpeakerphone = 0, ///< 扬声器
  289 + TRTCAudioModeEarpiece = 1, ///< 听筒
  290 +};
  291 +
  292 +/**
  293 + * 3.3 声音混响模式
  294 + *
  295 + * 该枚举值应用于直播场景中的混响模式,主要用于秀场直播中。
  296 + */
  297 +typedef NS_ENUM(NSInteger, TRTCReverbType) {
  298 + TRTCReverbType_0 = 0, ///< 关闭混响
  299 + TRTCReverbType_1 = 1, ///< KTV
  300 + TRTCReverbType_2 = 2, ///< 小房间
  301 + TRTCReverbType_3 = 3, ///< 大会堂
  302 + TRTCReverbType_4 = 4, ///< 低沉
  303 + TRTCReverbType_5 = 5, ///< 洪亮
  304 + TRTCReverbType_6 = 6, ///< 金属声
  305 + TRTCReverbType_7 = 7, ///< 磁性
  306 +};
  307 +
  308 +/**
  309 + * 3.4 变声模式
  310 + *
  311 + * 该枚举值应用于直播场景中的变声模式,主要用于秀场直播中。
  312 + */
  313 +typedef NS_ENUM(NSInteger, TRTCVoiceChangerType) {
  314 + TRTCVoiceChangerType_0 = 0, ///< 关闭变声
  315 + TRTCVoiceChangerType_1 = 1, ///< 熊孩子
  316 + TRTCVoiceChangerType_2 = 2, ///< 萝莉
  317 + TRTCVoiceChangerType_3 = 3, ///< 大叔
  318 + TRTCVoiceChangerType_4 = 4, ///< 重金属
  319 + TRTCVoiceChangerType_5 = 5, ///< 感冒
  320 + TRTCVoiceChangerType_6 = 6, ///< 外国人
  321 + TRTCVoiceChangerType_7 = 7, ///< 困兽
  322 + TRTCVoiceChangerType_8 = 8, ///< 死肥仔
  323 + TRTCVoiceChangerType_9 = 9, ///< 强电流
  324 + TRTCVoiceChangerType_10 = 10, ///< 重机械
  325 + TRTCVoiceChangerType_11 = 11, ///< 空灵
  326 +};
  327 +
  328 +/**
  329 + * 3.5 系统音量类型
  330 + *
  331 + * 智能手机一般具备两种系统音量类型,即通话音量类型和媒体音量类型。
  332 + * - 通话音量:手机专门为通话场景设计的音量类型,使用手机自带的回声抵消功能,音质相比媒体音量类型较差,
  333 + * 无法通过音量按键将音量调成零,但是支持蓝牙耳机上的麦克风。
  334 + *
  335 + * - 媒体音量:手机专门为音乐场景设计的音量类型,音质相比于通话音量类型要好,通过通过音量按键可以将音量调成零。
  336 + * 使用媒体音量类型时,如果要开启回声抵消(AEC)功能,SDK 会开启内置的声学处理算法对声音进行二次处理。
  337 + * 在媒体音量模式下,蓝牙耳机无法使用自带的麦克风采集声音,只能使用手机上的麦克风进行声音采集。
  338 + *
  339 + * SDK 目前提供了三种系统音量类型的控制模式,分别为:
  340 + * - Auto:“麦上通话,麦下媒体”,即主播上麦时使用通话音量,观众不上麦则使用媒体音量,适合在线直播场景。
  341 + * 如果您在 enterRoom 时选择的场景为 TRTCAppSceneLIVE 或 TRTCAppSceneVoiceChatRoom,SDK 会自动选择该模式。
  342 + *
  343 + * - VOIP:全程使用通话音量,适合多人会议场景。
  344 + * 如果您在 enterRoom 时选择的场景为 TRTCAppSceneVideoCall 或 TRTCAppSceneAudioCall,SDK 会自动选择该模式。
  345 + *
  346 + * - Media:通话全程使用媒体音量,不常用,适合个别有特殊需求(如主播外接声卡)的应用场景。
  347 + *
  348 + */
  349 +typedef NS_ENUM(NSInteger, TRTCSystemVolumeType) {
  350 + /// “麦上通话,麦下媒体”,即主播上麦时使用通话音量,观众不上麦则使用媒体音量,适合在线直播场景。<br>
  351 + /// 如果您在 enterRoom 时选择的场景为 TRTCAppSceneLIVE 或 TRTCAppSceneVoiceChatRoom,SDK 会自动选择该模式。
  352 + TRTCSystemVolumeTypeAuto = 0,
  353 +
  354 + /// 通话全程使用媒体音量,不常用,适合个别有特殊需求(如主播外接声卡)的应用场景。
  355 + TRTCSystemVolumeTypeMedia = 1,
  356 +
  357 + /// 全程使用通话音量,适合多人会议场景。<br>
  358 + /// 如果您在 enterRoom 时选择的场景为 TRTCAppSceneVideoCall 或 TRTCAppSceneAudioCall 会自动选择该模式。
  359 + TRTCSystemVolumeTypeVOIP = 2,
  360 +};
  361 +
  362 +#pragma mark -
  363 +
  364 +/////////////////////////////////////////////////////////////////////////////////
  365 +//
  366 +// 【(四)更多枚举值定义】
  367 +//
  368 +/////////////////////////////////////////////////////////////////////////////////
  369 +
  370 +/**
  371 + * 4.1 Log 级别
  372 + *
  373 + * 不同的日志等级定义了不同的详实程度和日志数量,推荐一般情况下将日志等级设置为:TRTCLogLevelInfo。
  374 + */
  375 +typedef NS_ENUM(NSInteger, TRTCLogLevel) {
  376 + TRTCLogLevelVerbose = 0, ///< 输出所有级别的 Log
  377 + TRTCLogLevelDebug = 1, ///< 输出 DEBUG,INFO,WARNING,ERROR 和 FATAL 级别的 Log
  378 + TRTCLogLevelInfo = 2, ///< 输出 INFO,WARNING,ERROR 和 FATAL 级别的 Log
  379 + TRTCLogLevelWarn = 3, ///< 只输出WARNING,ERROR 和 FATAL 级别的 Log
  380 + TRTCLogLevelError = 4, ///< 只输出ERROR 和 FATAL 级别的 Log
  381 + TRTCLogLevelFatal = 5, ///< 只输出 FATAL 级别的 Log
  382 + TRTCLogLevelNone = 6, ///< 不输出任何 SDK Log
  383 +};
  384 +
  385 +/**
  386 + * 4.2 重力感应开关
  387 + *
  388 + * 此配置仅适用于 iOS 和 iPad 等移动设备,并且需要配合您当前 UI 的布局模式一起使用:
  389 + * - Disable,表示视频画面不会跟随重力感应方向而调整。
  390 + * - UIAutoLayout,表示 SDK 不会自动调整 LocalVideoView 的旋转方向,而是交给系统进行处理。适用于您的 App 界面已适配重力感应的场景。
  391 + * - UIFixLayout,表示 SDK 自动调整 LocalVideoView 的旋转方向,适用于您的 App 界面暂未适配重力感应的场景。
  392 + */
  393 +typedef NS_ENUM(NSInteger, TRTCGSensorMode) {
  394 + TRTCGSensorMode_Disable = 0, ///< 关闭重力感应
  395 + TRTCGSensorMode_UIAutoLayout = 1, ///< 开启重力感应,需要您的 App 界面已适配重力感应。
  396 + TRTCGSensorMode_UIFixLayout = 2 ///< 开启重力感应,适用于您的 App 界面暂未适配重力感应的场景。
  397 +};
  398 +
  399 +#if TARGET_OS_MAC && !TARGET_OS_IPHONE
  400 +#pragma mark -
  401 +/**
  402 + * 4.3 设备类型(仅 Mac)
  403 + *
  404 + * 在 Mac 上,每一种类型的设备都可能有多个,TRTC SDK 的 Mac 版本提供了一系列函数用来操作这些设备。
  405 + */
  406 +typedef NS_ENUM(NSInteger, TRTCMediaDeviceType) {
  407 + TRTCMediaDeviceTypeUnknown = -1, ///< 未定义
  408 +
  409 + TRTCMediaDeviceTypeAudioInput = 0, ///< 麦克风
  410 + TRTCMediaDeviceTypeAudioOutput = 1, ///< 扬声器或听筒
  411 + TRTCMediaDeviceTypeVideoCamera = 2, ///< 摄像头
  412 +
  413 + TRTCMediaDeviceTypeVideoWindow = 3, ///< 某个窗口(用于屏幕分享)
  414 + TRTCMediaDeviceTypeVideoScreen = 4, ///< 整个屏幕(用于屏幕分享)
  415 +};
  416 +#endif
  417 +
  418 +#if TARGET_OS_MAC && !TARGET_OS_IPHONE
  419 +#pragma mark -
  420 +
  421 +/**
  422 + * 4.4 屏幕分享目标类型(仅 Mac)
  423 + *
  424 + * 该枚举值主要用于 SDK 区分屏幕分享的目标(某一个窗口或整个屏幕)。
  425 + */
  426 +typedef NS_ENUM(NSInteger, TRTCScreenCaptureSourceType) {
  427 + TRTCScreenCaptureSourceTypeUnknown = -1, ///< 未定义
  428 + TRTCScreenCaptureSourceTypeWindow = 0, ///< 该分享目标是某一个Mac窗口
  429 + TRTCScreenCaptureSourceTypeScreen = 1, ///< 该分享目标是整个Mac桌面
  430 +};
  431 +#endif
  432 +
  433 +#pragma mark -
  434 +
  435 +/**
  436 + * 4.5 混流参数配置模式
  437 + *
  438 + */
  439 +typedef NS_ENUM(NSInteger, TRTCTranscodingConfigMode) {
  440 + /// 非法值
  441 + TRTCTranscodingConfigMode_Unknown = 0,
  442 +
  443 + /// 全手动模式,灵活性最高,可以自由组合出各种混流方案,但易用性最差。
  444 + /// 此模式下,您需要填写 TRTCTranscodingConfig 中的所有参数,并需要监听 TRTCCloudDelegate 中的 onUserVideoAvailable() 和 onUserAudioAvailable() 回调,
  445 + /// 以便根据当前房间中各个上麦用户的音视频状态不断地调整 mixUsers 参数,否则会导致混流失败。
  446 + TRTCTranscodingConfigMode_Manual = 1,
  447 +
  448 + /// 纯音频模式,适用于语音通话(AudioCall)和语音聊天室(VoiceChatRoom)等纯音频场景。
  449 + /// 只需要在进房后通过 setMixTranscodingConfig() 接口设置一次,之后 SDK 就会自动把房间内所有上麦用户的声音混流到当前用户的直播流上。
  450 + /// 此模式下,您无需设置 TRTCTranscodingConfig 中的 mixUsers 参数,只需设置 audioSampleRate、audioBitrate 和 audioChannels 等参数。
  451 + TRTCTranscodingConfigMode_Template_PureAudio = 2,
  452 +
  453 + /// 预排版模式,通过占位符提前对各路画面进行排布
  454 + /// 此模式下,您依然需要设置 mixUsers 参数,但可以将 userId 设置为占位符,可选的占位符有:
  455 + /// - "$PLACE_HOLDER_REMOTE$" : 指代远程用户的画面,可以设置多个。
  456 + /// - "$PLACE_HOLDER_LOCAL_MAIN$" : 指代本地摄像头画面,只允许设置一个。
  457 + /// - "$PLACE_HOLDER_LOCAL_SUB$" : 指代本地屏幕分享画面,只允许设置一个。
  458 + /// 但是您可以不需要监听 TRTCCloudDelegate 中的 onUserVideoAvailable() 和 onUserAudioAvailable() 回调进行实时调整,
  459 + /// 只需要在进房成功后调用一次 setMixTranscodingConfig() 即可,之后 SDK 会自动将真实的 userId 补位到您设置的占位符上。
  460 + TRTCTranscodingConfigMode_Template_PresetLayout = 3,
  461 +
  462 + /// 屏幕分享模式,适用于在线教育场景等以屏幕分享为主的应用场景,仅支持 Windows 和 Mac 两个平台的 SDK。
  463 + /// SDK 会先根据您(通过 videoWidth 和 videoHeight 参数)设置的目标分辨率构建一张画布,
  464 + /// 当老师未开启屏幕分享时,SDK 会将摄像头画面等比例拉伸绘制到该画布上;当老师开启屏幕分享之后,SDK 会将屏幕分享画面绘制到同样的画布上。
  465 + /// 这样操作的目的是为了确保混流模块的输出分辨率一致,避免课程回放和网页观看的花屏问题(网页播放器不支持可变分辨率)。
  466 + ///
  467 + /// 由于教学模式下的视频内容以屏幕分享为主,因此同时传输摄像头画面和屏幕分享画面是非常浪费带宽的。
  468 + /// 推荐的做法是直接将摄像头画面通过 setLocalVideoRenderCallback 接口自定义绘制到当前屏幕上。
  469 + /// 在该模式下,您无需设置 TRTCTranscodingConfig 中的 mixUsers 参数,SDK 不会混合学生的画面,以免干扰屏幕分享的效果。
  470 + ///
  471 + /// 您可以将 TRTCTranscodingConfig 中的 width × height 设为 0px × 0px,SDK 会自动根据用户当前屏幕的宽高比计算出一个合适的分辨率:
  472 + /// - 如果老师当前屏幕宽度 <= 1920px,SDK 会使用老师当前屏幕的实际分辨率。
  473 + /// - 如果老师当前屏幕宽度 > 1920px,SDK 会根据当前屏幕宽高比,选择 1920x1080(16:9)、1920x1200(16:10)、1920x1440(4:3) 三种分辨率中的一种。
  474 + TRTCTranscodingConfigMode_Template_ScreenSharing = 4,
  475 +};
  476 +
  477 +
  478 +/////////////////////////////////////////////////////////////////////////////////
  479 +//
  480 +// 【(五)TRTC 核心类型定义】
  481 +//
  482 +/////////////////////////////////////////////////////////////////////////////////
  483 +#pragma mark -
  484 +
  485 +/**
  486 + * 5.1 进房相关参数
  487 + *
  488 + * 只有该参数填写正确,才能顺利调用 enterRoom 进入 roomId 所指定的音视频房间。
  489 + */
  490 +@interface TRTCParams : NSObject
  491 +
  492 +///【字段含义】应用标识 [必填],腾讯云基于 sdkAppId 完成计费统计。
  493 +///【推荐取值】在 [实时音视频控制台](https://console.cloud.tencent.com/rav/) 创建应用后可以在账号信息页面中得到该 ID
  494 +@property (nonatomic, assign) UInt32 sdkAppId;
  495 +
  496 +///【字段含义】用户标识 [必填],当前用户的 userId,相当于登录用户名。
  497 +///【推荐取值】如果一个用户在您的账号系统中的 ID 为“abc”,则 userId 即可设置为“abc”。
  498 +@property (nonatomic, strong, nonnull) NSString* userId;
  499 +
  500 +///【字段含义】用户签名 [必填],当前 userId 对应的验证签名,相当于登录密码。
  501 +///【推荐取值】具体计算方法请参见 [如何计算UserSig](https://cloud.tencent.com/document/product/647/17275)。
  502 +@property (nonatomic, strong, nonnull) NSString* userSig;
  503 +
  504 +///【字段含义】房间号码 [必填],在同一个房间内的用户可以看到彼此并进行视频通话。
  505 +///【推荐取值】可以自定义设置该参数值,但不可重复。如果您的用户帐号 ID (userId)为数字类型,可直接使用创建者的用户 ID 作为 roomId。
  506 +@property (nonatomic, assign) UInt32 roomId;
  507 +
  508 +///【字段含义】直播场景下的角色,仅适用于直播场景(TRTCAppSceneLIVE 和 TRTCAppSceneVoiceChatRoom),通话场景下指定无效。
  509 +///【推荐取值】默认值:主播(TRTCRoleAnchor)
  510 +@property (nonatomic, assign) TRTCRoleType role;
  511 +
  512 +///【字段含义】绑定腾讯云直播 CDN 流 ID[非必填],设置之后,您就可以在腾讯云直播 CDN 上通过标准直播方案(FLV或HLS)播放该用户的音视频流。
  513 +///【推荐取值】限制长度为64字节,可以不填写,一种推荐的方案是使用 “sdkappid_roomid_userid_main” 作为 streamid,这样比较好辨认且不会在您的多个应用中发生冲突。
  514 +///【特殊说明】要使用腾讯云直播 CDN,您需要先在[控制台](https://console.cloud.tencent.com/trtc/) 中的功能配置页开启“启动自动旁路直播”开关。
  515 +///【参考文档】[CDN 旁路直播](https://cloud.tencent.com/document/product/647/16826)。
  516 +@property (nonatomic, strong, nullable) NSString* streamId;
  517 +
  518 +///【字段含义】设置云端录制完成后的回调消息中的 "userdefinerecordid" 字段内容,便于您更方便的识别录制回调。
  519 +///【推荐取值】限制长度为64字节,只允许包含大小写英文字母(a-zA-Z)、数字(0-9)及下划线和连词符。
  520 +///【参考文档】[云端录制](https://cloud.tencent.com/document/product/647/16823)。
  521 +@property (nonatomic, strong, nullable) NSString* userDefineRecordId;
  522 +
  523 +///【字段含义】房间签名 [非必填],当您希望某个房间只能让特定的 userId 进入时,需要使用 privateMapKey 进行权限保护。
  524 +///【推荐取值】仅建议有高级别安全需求的客户使用,更多详情请参见 [进房权限保护](https://cloud.tencent.com/document/product/647/32240)。
  525 +@property (nonatomic, strong, nullable) NSString* privateMapKey;
  526 +
  527 +///【字段含义】业务数据 [非必填],部分高级特性才需要用到此字段。
  528 +///【推荐取值】不建议使用
  529 +@property (nonatomic, strong, nullable) NSString* bussInfo;
  530 +@end
  531 +
  532 +#pragma mark -
  533 +
  534 +/**
  535 + * 5.2 视频编码参数
  536 + *
  537 + * 该设置决定远端用户看到的画面质量(同时也是云端录制出的视频文件的画面质量)。
  538 + */
  539 +@interface TRTCVideoEncParam : NSObject
  540 +
  541 +///【字段含义】视频分辨率
  542 +///【推荐取值】
  543 +/// - 视频通话建议选择360 × 640及以下分辨率,resMode 选择 Portrait。
  544 +/// - 手机直播建议选择540 × 960,resMode 选择 Portrait。
  545 +/// - Window 和 iMac 建议选择640 × 360 及以上分辨率,resMode 选择 Landscape。
  546 +///【特别说明】 TRTCVideoResolution 默认只有横屏模式的分辨率,例如640 × 360。
  547 +/// 如需使用竖屏分辨率,请指定 resMode 为 Portrait,例如640 × 360结合 Portrait 则为360 × 640。
  548 +@property (nonatomic, assign) TRTCVideoResolution videoResolution;
  549 +
  550 +///【字段含义】分辨率模式(横屏分辨率 - 竖屏分辨率)
  551 +///【推荐取值】手机直播建议选择 Portrait,Window 和 Mac 建议选择 Landscape。
  552 +///【特别说明】如果 videoResolution 指定分辨率 640 × 360,resMode 指定模式为 Portrait,则最终编码出的分辨率为360 × 640。
  553 +@property (nonatomic, assign) TRTCVideoResolutionMode resMode;
  554 +
  555 +///【字段含义】视频采集帧率
  556 +///【推荐取值】15fps或20fps,5fps以下,卡顿感明显。10fps以下,会有轻微卡顿感。20fps以上,则过于浪费(电影的帧率为24fps)。
  557 +///【特别说明】很多 Android 手机的前置摄像头并不支持15fps以上的采集帧率,部分过于突出美颜功能的 Android 手机前置摄像头的采集帧率可能低于10fps。
  558 +@property (nonatomic, assign) int videoFps;
  559 +
  560 +///【字段含义】视频上行码率
  561 +///【推荐取值】推荐设置请参考本 TRTCVideoResolution 定义处的注释说明
  562 +///【特别说明】码率太低会导致视频中出现大量马赛克
  563 +@property (nonatomic, assign) int videoBitrate;
  564 +
  565 +///【字段含义】是否允许 SDK 动态调整分辨率,开启后会对云端录制产生影响。
  566 +///【推荐取值】
  567 +/// - 需要开启云端录制的场景建议设置为 NO,中途视频分辨率发生变化后,云端录制出的 MP4 在一般的播放器上都无法正常播放。
  568 +/// - 视频通话模式,若无需云端录制,可以设置为 YES,此时 SDK 会根据当前待带宽情况自动选择合适的分辨率(仅针对 TRTCVideoStreamTypeBig 生效)。
  569 +/// - 默认值:NO。
  570 +///【特别说明】如有云端录制需求,请设置为 NO。
  571 +@property (nonatomic, assign) BOOL enableAdjustRes;
  572 +@end
  573 +
  574 +#pragma mark -
  575 +
  576 +/**
  577 + * 5.3 网络流控相关参数
  578 + *
  579 + * 网络流控相关参数,该设置决定 SDK 在各种网络环境下的调控方向(例如弱网下选择“保清晰”或“保流畅”)
  580 + */
  581 +@interface TRTCNetworkQosParam : NSObject
  582 +
  583 +///【字段含义】弱网下是“保清晰”或“保流畅”
  584 +///【特别说明】
  585 +/// - 弱网下保流畅:在遭遇弱网环境时,画面会变得模糊,且出现较多马赛克,但可以保持流畅不卡顿
  586 +/// - 弱网下保清晰:在遭遇弱网环境时,画面会尽可能保持清晰,但可能会更容易出现卡顿
  587 +@property (nonatomic, assign) TRTCVideoQosPreference preference;
  588 +
  589 +///【字段含义】视频分辨率(云端控制 - 客户端控制)
  590 +///【推荐取值】云端控制
  591 +///【特别说明】
  592 +/// - Server 模式(默认):云端控制模式,若无特殊原因,请直接使用该模式
  593 +/// - Client 模式:客户端控制模式,用于 SDK 开发内部调试,客户请勿使用
  594 +@property (nonatomic, assign) TRTCQosControlMode controlMode;
  595 +@end
  596 +
  597 +#pragma mark -
  598 +
  599 +/**
  600 + * 5.4 视频质量
  601 + *
  602 + * 表示视频质量的好坏,通过这个数值,您可以在 UI 界面上用图标表征 userId 的通话线路质量
  603 + */
  604 +@interface TRTCQualityInfo : NSObject
  605 +/// 用户 ID
  606 +@property (nonatomic, copy, nullable) NSString* userId;
  607 +/// 视频质量
  608 +@property (nonatomic, assign) TRTCQuality quality;
  609 +@end
  610 +
  611 +#pragma mark -
  612 +
  613 +/**
  614 + * 5.5 音量大小
  615 + *
  616 + * 表示语音音量的评估大小,通过这个数值,您可以在 UI 界面上用图标表征 userId 是否有在说话
  617 + */
  618 +@interface TRTCVolumeInfo : NSObject <NSCopying>
  619 +/// 说话者的 userId, nil 为自己
  620 +@property (strong, nonatomic, nullable) NSString *userId;
  621 +/// 说话者的音量, 取值范围0 - 100
  622 +@property (assign, nonatomic) NSUInteger volume;
  623 +@end
  624 +
  625 +#if TARGET_OS_MAC && !TARGET_OS_IPHONE
  626 +#pragma mark -
  627 +
  628 +/**
  629 + * 5.6 媒体设备描述
  630 + *
  631 + * 在 Mac 上,每一种类型的设备都可能有多个,TRTC SDK 的 Mac 版本提供了一系列函数用来操作这些设备。
  632 + */
  633 +@interface TRTCMediaDeviceInfo : NSObject
  634 +/// 设备类型
  635 +@property (assign, nonatomic) TRTCMediaDeviceType type;
  636 +/// 设备ID
  637 +@property (copy, nonatomic, nullable) NSString * deviceId;
  638 +/// 设备名称
  639 +@property (copy, nonatomic, nullable) NSString * deviceName;
  640 +@end
  641 +#endif
  642 +
  643 +#if TARGET_OS_MAC && !TARGET_OS_IPHONE
  644 +#pragma mark -
  645 +
  646 +/**
  647 + * 5.7 屏幕分享目标信息(仅 Mac)
  648 + *
  649 + * 如果您要给您的 App 增加屏幕分享功能,一般需要先显示一个窗口选择界面,用户才可以选择希望分享的窗口。
  650 + * TRTCScreenCaptureSourceInfo 主要用于定义分享窗口的 ID、类型、窗口名称以及缩略图。
  651 + */
  652 +@interface TRTCScreenCaptureSourceInfo : NSObject
  653 +/// 分享类型:需要某个窗口或整个屏幕
  654 +@property (assign, nonatomic) TRTCScreenCaptureSourceType type;
  655 +/// 窗口ID
  656 +@property (copy, nonatomic, nullable) NSString * sourceId;
  657 +/// 窗口名称
  658 +@property (copy, nonatomic, nullable) NSString * sourceName;
  659 +/// 窗口属性
  660 +@property (nonatomic, strong, nullable) NSDictionary * extInfo;
  661 +/// 窗口缩略图
  662 +@property (nonatomic, readonly, nullable) NSImage *thumbnail;
  663 +/// 窗口小图标
  664 +@property (nonatomic, readonly, nullable) NSImage *icon;
  665 +@end
  666 +#endif
  667 +
  668 +#pragma mark -
  669 +
  670 +/**
  671 + * 5.8 网络测速结果
  672 + *
  673 + * 您可以在用户进入房间前通过 TRTCCloud 的 startSpeedTest 接口进行测速 (注意:请不要在通话中调用),
  674 + * 测速结果会每2 - 3秒钟返回一次,每次返回一个 IP 地址的测试结果。
  675 + *
  676 + * @note - quality 是内部通过评估算法测算出的网络质量,loss 越低,rtt 越小,得分便越高。
  677 + * @note - upLostRate 是指上行丢包率。例如,0.3表示每向服务器发送10个数据包可能会在中途丢失3个。
  678 + * @note - downLostRate 是指下行丢包率。例如,0.2表示每从服务器收取10个数据包可能会在中途丢失2个。
  679 + * @note - rtt 是指当前设备到腾讯云服务器的一次网络往返时间,该值越小越好,正常数值范围是10ms - 100ms
  680 + */
  681 +@interface TRTCSpeedTestResult : NSObject
  682 +
  683 +/// 服务器 IP 地址
  684 +@property (strong, nonatomic, nonnull) NSString *ip;
  685 +
  686 +/// 网络质量,内部通过评估算法测算出的网络质量,loss 越低,rtt 越小,得分便越高。
  687 +@property (nonatomic) TRTCQuality quality;
  688 +
  689 +/// 上行丢包率,范围是0 - 1.0,例如,0.3表示每向服务器发送10个数据包可能会在中途丢失3个。
  690 +@property (nonatomic) float upLostRate;
  691 +
  692 +/// 下行丢包率,范围是0 - 1.0,例如,0.2表示每从服务器收取10个数据包可能会在中途丢失2个。
  693 +@property (nonatomic) float downLostRate;
  694 +
  695 +/// 延迟(毫秒),指当前设备到腾讯云服务器的一次网络往返时间,该值越小越好,正常数值范围是10ms - 100ms
  696 +@property (nonatomic) uint32_t rtt;
  697 +@end
  698 +
  699 +#pragma mark -
  700 +
  701 +/**
  702 + * 5.9 视频帧信息
  703 + *
  704 + * TRTCVideoFrame 用来描述一帧视频画面的裸数据,它可以是一帧编码前的画面,也可以是一帧解码后的画面。
  705 + */
  706 +@interface TRTCVideoFrame : NSObject
  707 +
  708 +///【字段含义】视频像素格式
  709 +///【推荐取值】TRTCVideoPixelFormat_NV12
  710 +@property (nonatomic, assign) TRTCVideoPixelFormat pixelFormat;
  711 +
  712 +///【字段含义】视频数据结构类型
  713 +///【推荐取值】TRTCVideoBufferType_PixelBuffer
  714 +@property (nonatomic, assign) TRTCVideoBufferType bufferType;
  715 +
  716 +///【字段含义】bufferType 为 TRTCVideoBufferType_PixelBuffer 时的视频数据。
  717 +@property (nonatomic, assign, nullable) CVPixelBufferRef pixelBuffer;
  718 +
  719 +///【字段含义】bufferType 为 TRTCVideoBufferType_NSData 时的视频数据。
  720 +@property (nonatomic, retain, nullable) NSData* data;
  721 +
  722 +///【字段含义】视频帧的时间戳,单位毫秒
  723 +///【推荐取值】自定义视频采集时可以设置为0,若该参数为0,SDK 会自定填充 timestamp 字段,但请“均匀”地控制 sendCustomVideoData 的调用间隔。
  724 +@property (nonatomic, assign) uint64_t timestamp;
  725 +
  726 +///【字段含义】视频宽度
  727 +///【推荐取值】自定义视频采集时不需要填写。
  728 +@property (nonatomic, assign) uint32_t width;
  729 +
  730 +///【字段含义】视频高度
  731 +///【推荐取值】自定义视频采集时不需要填写。
  732 +@property (nonatomic, assign) uint32_t height;
  733 +
  734 +///【字段含义】视频像素的顺时针旋转角度
  735 +@property (nonatomic, assign) TRTCVideoRotation rotation;
  736 +@end
  737 +
  738 +
  739 +/**
  740 + * 5.10 音频帧数据
  741 + */
  742 +#pragma mark -
  743 +/// 音频帧数据
  744 +@interface TRTCAudioFrame : NSObject
  745 +/// 音频数据
  746 +@property (nonatomic, retain, nonnull) NSData * data;
  747 +/// 采样率
  748 +@property (nonatomic, assign) TRTCAudioSampleRate sampleRate;
  749 +/// 声道数
  750 +@property (nonatomic, assign) int channels;
  751 +/// 时间戳,单位ms
  752 +@property (nonatomic, assign) uint64_t timestamp;
  753 +@end
  754 +
  755 +
  756 +/**
  757 +* 5.11 云端混流中每一路子画面的位置信息
  758 +*
  759 +* TRTCMixUser 用于指定每一路(即每一个 userId)视频画面的具体摆放位置
  760 +*/
  761 +@interface TRTCMixUser : NSObject
  762 +/// 参与混流的 userId
  763 +@property(nonatomic, copy, nonnull) NSString * userId;
  764 +/// 混流的房间, 可填 nil 表示是自己所在的房间
  765 +@property (nonatomic, copy, nullable) NSString * roomID;
  766 +/// 图层位置坐标以及大小,左上角为坐标原点(0,0) (绝对像素值)
  767 +@property(nonatomic, assign) CGRect rect;
  768 +/// 图层层次(1 - 15)不可重复
  769 +@property(nonatomic, assign) int zOrder;
  770 +/// 参与混合的是主路画面(TRTCVideoStreamTypeBig)或屏幕分享(TRTCVideoStreamTypeSub)画面
  771 +@property (nonatomic) TRTCVideoStreamType streamType;
  772 +/// 该用户是不是只开启了音频
  773 +@property (nonatomic, assign) BOOL pureAudio;
  774 +
  775 +@end
  776 +
  777 +
  778 +/**
  779 +* 5.12 云端混流(转码)配置
  780 +*
  781 +* 包括最终编码质量和各路画面的摆放位置
  782 +*/
  783 +@interface TRTCTranscodingConfig : NSObject
  784 +
  785 +///【字段含义】转码config模式
  786 +@property(nonatomic, assign) TRTCTranscodingConfigMode mode;
  787 +
  788 +///【字段含义】腾讯云直播 AppID
  789 +///【推荐取值】请在 [实时音视频控制台](https://console.cloud.tencent.com/rav) 选择已经创建的应用,单击【帐号信息】后,在“直播信息”中获取
  790 +@property (nonatomic) int appId;
  791 +
  792 +///【字段含义】腾讯云直播 bizid
  793 +///【推荐取值】请在 [实时音视频控制台](https://console.cloud.tencent.com/rav) 选择已经创建的应用,单击【帐号信息】后,在“直播信息”中获取
  794 +@property (nonatomic) int bizId;
  795 +
  796 +///【字段含义】最终转码后的视频分辨率的宽度。
  797 +///【推荐取值】推荐值:360px ,如果你是纯音频推流,请将 width × height 设为 0px × 0px,否则混流后会携带一条画布背景的视频流。
  798 +@property(nonatomic, assign) int videoWidth;
  799 +
  800 +///【字段含义】最终转码后的视频分辨率的高度。
  801 +///【推荐取值】推荐值:640px ,如果你是纯音频推流,请将 width × height 设为 0px × 0px,否则混流后会携带一条画布背景的视频流。
  802 +@property(nonatomic, assign) int videoHeight;
  803 +
  804 +///【字段含义】最终转码后的视频分辨率的码率(kbps)。
  805 +///【推荐取值】如果填0,后台会根据videoWidth和videoHeight来估算码率,您也可以参考枚举定义TRTCVideoResolution_640_480的注释。
  806 +@property(nonatomic, assign) int videoBitrate;
  807 +
  808 +///【字段含义】最终转码后的视频分辨率的帧率(FPS)。
  809 +///【推荐取值】默认值:15fps,取值范围是 (0,30]。
  810 +@property(nonatomic, assign) int videoFramerate;
  811 +
  812 +///【字段含义】最终转码后的视频分辨率的关键帧间隔(又称为 GOP)。
  813 +///【推荐取值】默认值:2,单位为秒,取值范围是 [1,8]。
  814 +@property(nonatomic, assign) int videoGOP;
  815 +
  816 +///【字段含义】混合后画面的底色颜色,默认为黑色,格式为十六进制数字,比如:“0x61B9F1” 代表 RGB 分别为(97,158,241)。
  817 +///【推荐取值】默认值:0x000000,黑色
  818 +@property(nonatomic, assign) int backgroundColor;
  819 +
  820 +///【字段含义】最终转码后的音频采样率。
  821 +///【推荐取值】默认值:48000Hz。支持12000HZ、16000HZ、22050HZ、24000HZ、32000HZ、44100HZ、48000HZ。
  822 +@property(nonatomic, assign) int audioSampleRate;
  823 +
  824 +///【字段含义】最终转码后的音频码率。
  825 +///【推荐取值】默认值:64kbps,取值范围是 [32,192]。
  826 +@property(nonatomic, assign) int audioBitrate;
  827 +
  828 +///【字段含义】最终转码后的音频声道数
  829 +///【推荐取值】默认值:1。取值范围为 [1,2] 中的整型。
  830 +@property(nonatomic, assign) int audioChannels;
  831 +
  832 +///【字段含义】每一路子画面的位置信息
  833 +@property(nonatomic, copy, nonnull) NSArray<TRTCMixUser *> * mixUsers;
  834 +@end
  835 +
  836 +#pragma mark -
  837 +
  838 +/**
  839 + * 5.13 CDN 旁路推流参数
  840 + */
  841 +@interface TRTCPublishCDNParam : NSObject
  842 +/// 腾讯云 AppID,请在 [实时音视频控制台](https://console.cloud.tencent.com/rav) 选择已经创建的应用,单击【帐号信息】,在“直播信息”中获取
  843 +@property (nonatomic) int appId;
  844 +
  845 +/// 腾讯云直播 bizid,请在 [实时音视频控制台](https://console.cloud.tencent.com/rav) 选择已经创建的应用,单击【帐号信息】,在“直播信息”中获取
  846 +@property (nonatomic) int bizId;
  847 +
  848 +/// 旁路转推的 URL
  849 +@property (nonatomic, strong, nonnull) NSString * url;
  850 +@end
  851 +
  852 +/**
  853 + * 5.14 录音参数
  854 + *
  855 + * 请正确填写参数,确保录音文件顺利生成。
  856 + */
  857 +@interface TRTCAudioRecordingParams : NSObject
  858 +
  859 +///【字段含义】文件路径(必填),录音文件的保存路径。该路径需要用户自行指定,请确保路径存在且可写。
  860 +///【特别说明】该路径需精确到文件名及格式后缀,格式后缀决定录音文件的格式,目前支持的格式有 PCM、WAV 和 AAC。
  861 +/// 例如,指定路径为 path/to/audio.aac,则会生成一个 AAC 格式的文件。
  862 +/// 请指定一个有读写权限的合法路径,否则录音文件无法生成。
  863 +@property (nonatomic, strong, nonnull) NSString * filePath;
  864 +@end
  865 +
  866 +/**
  867 + * 5.15 音效
  868 + *
  869 + */
  870 +@interface TRTCAudioEffectParam : NSObject
  871 +
  872 ++ (_Nonnull instancetype)new __attribute__((unavailable("Use -initWith:(int)effectId path:(NSString * )path instead")));
  873 +- (_Nonnull instancetype)init __attribute__((unavailable("Use -initWith:(int)effectId path:(NSString *)path instead")));
  874 +
  875 +/// 【字段含义】音效 ID
  876 +/// 【特别说明】SDK 允许播放多路音效,因此需要音效 ID 进行标记,用于控制音效的开始、停止、音量等
  877 +@property(nonatomic, assign) int effectId;
  878 +
  879 +/// 【字段含义】音效文件路径,支持的文件格式:aac, mp3, m4a。
  880 +@property(nonatomic, copy, nonnull) NSString * path;
  881 +
  882 +/// 【字段含义】循环播放次数
  883 +/// 【推荐取值】取值范围为0 - 任意正整数,默认值:0。0表示播放音效一次;1表示播放音效两次;以此类推
  884 +@property(nonatomic, assign) int loopCount;
  885 +
  886 +/// 【字段含义】音效是否上行
  887 +/// 【推荐取值】YES:音效在本地播放的同时,会上行至云端,因此远端用户也能听到该音效;NO:音效不会上行至云端,因此只能在本地听到该音效。默认值:NO
  888 +@property(nonatomic, assign) BOOL publish;
  889 +
  890 +/// 【字段含义】音效音量
  891 +/// 【推荐取值】取值范围为0 - 100;默认值:100
  892 +@property(nonatomic, assign) int volume;
  893 +
  894 +- (_Nonnull instancetype)initWith:(int)effectId path:(NSString * _Nonnull)path;
  895 +@end
  896 +/// @}
  1 +/*
  2 + * Module: TRTCCloudDelegate @ TXLiteAVSDK
  3 + *
  4 + * Function: 腾讯云视频通话功能的事件回调接口
  5 + *
  6 + */
  7 +
  8 +#import <Foundation/Foundation.h>
  9 +#import "TRTCCloudDef.h"
  10 +#import "TXLiteAVCode.h"
  11 +
  12 +NS_ASSUME_NONNULL_BEGIN
  13 +
  14 +@class TRTCCloud;
  15 +@class TRTCStatistics;
  16 +
  17 +
  18 +/// @defgroup TRTCCloudDelegate_ios TRTCCloudDelegate
  19 +/// 腾讯云视频通话功能的事件回调接口
  20 +/// @{
  21 +@protocol TRTCCloudDelegate <NSObject>
  22 +@optional
  23 +
  24 +/////////////////////////////////////////////////////////////////////////////////
  25 +//
  26 +// (一)错误事件和警告事件
  27 +//
  28 +/////////////////////////////////////////////////////////////////////////////////
  29 +/// @name 错误事件和警告事件
  30 +/// @{
  31 +/**
  32 + * 1.1 错误回调:SDK 不可恢复的错误,一定要监听,并分情况给用户适当的界面提示。
  33 + *
  34 + * @param errCode 错误码
  35 + * @param errMsg 错误信息
  36 + * @param extInfo 扩展信息字段,个别错误码可能会带额外的信息帮助定位问题
  37 + */
  38 +- (void)onError:(TXLiteAVError)errCode errMsg:(nullable NSString *)errMsg extInfo:(nullable NSDictionary*)extInfo;
  39 +
  40 +/**
  41 + * 1.2 警告回调:用于告知您一些非严重性问题,例如出现了卡顿或者可恢复的解码失败。
  42 + *
  43 + * @param warningCode 警告码
  44 + * @param warningMsg 警告信息
  45 + * @param extInfo 扩展信息字段,个别警告码可能会带额外的信息帮助定位问题
  46 + */
  47 +- (void)onWarning:(TXLiteAVWarning)warningCode warningMsg:(nullable NSString *)warningMsg extInfo:(nullable NSDictionary*)extInfo;
  48 +
  49 +/// @}
  50 +
  51 +/////////////////////////////////////////////////////////////////////////////////
  52 +//
  53 +// (二)房间事件回调
  54 +//
  55 +/////////////////////////////////////////////////////////////////////////////////
  56 +/// @name 房间事件回调
  57 +/// @{
  58 +/**
  59 + * 2.1 已加入房间的回调
  60 + *
  61 + * 调用 TRTCCloud 中的 enterRoom() 接口执行进房操作后,会收到来自 SDK 的 onEnterRoom(result) 回调:
  62 + *
  63 + * - 如果加入成功,result 会是一个正数(result > 0),代表加入房间的时间消耗,单位是毫秒(ms)。
  64 + * - 如果加入失败,result 会是一个负数(result < 0),代表进房失败的错误码。
  65 + * 进房失败的错误码含义请参见[错误码](https://cloud.tencent.com/document/product/647/32257)。
  66 + *
  67 + * @note 在 Ver6.6 之前的版本,只有进房成功会抛出 onEnterRoom(result) 回调,进房失败由 onError() 回调抛出。
  68 + * 在 Ver6.6 及之后改为:进房成功返回正的 result,进房失败返回负的 result,同时进房失败也会有 onError() 回调抛出。
  69 + *
  70 + * @param result result > 0 时为进房耗时(ms),result < 0 时为进房错误码。
  71 + */
  72 +- (void)onEnterRoom:(NSInteger)result;
  73 +
  74 +/**
  75 + * 2.2 离开房间的事件回调
  76 + *
  77 + * 调用 TRTCCloud 中的 exitRoom() 接口会执行退出房间的相关逻辑,例如释放音视频设备资源和编解码器资源等。
  78 + * 待资源释放完毕,SDK 会通过 onExitRoom() 回调通知到您。
  79 + *
  80 + * 如果您要再次调用 enterRoom() 或者切换到其他的音视频 SDK,请等待 onExitRoom() 回调到来之后再执行相关操作。
  81 + * 否则可能会遇到音频设备(例如 iOS 里的 AudioSession)被占用等各种异常问题。
  82 + *
  83 + * @param reason 离开房间原因,0:主动调用 exitRoom 退房;1:被服务器踢出当前房间;2:当前房间整个被解散。
  84 + */
  85 +- (void)onExitRoom:(NSInteger)reason;
  86 +
  87 +/**
  88 + * 2.3 切换角色的事件回调
  89 + *
  90 + * 调用 TRTCCloud 中的 switchRole() 接口会切换主播和观众的角色,该操作会伴随一个线路切换的过程,
  91 + * 待 SDK 切换完成后,会抛出 onSwitchRole() 事件回调。
  92 + *
  93 + * @param errCode 错误码,ERR_NULL 代表切换成功,其他请参见[错误码](https://cloud.tencent.com/document/product/647/32257)。
  94 + * @param errMsg 错误信息。
  95 + */
  96 +- (void)onSwitchRole:(TXLiteAVError)errCode errMsg:(nullable NSString *)errMsg;
  97 +
  98 +/**
  99 + * 2.4 请求跨房通话(主播 PK)的结果回调
  100 + *
  101 + * 调用 TRTCCloud 中的 connectOtherRoom() 接口会将两个不同房间中的主播拉通视频通话,也就是所谓的“主播PK”功能。
  102 + * 调用者会收到 onConnectOtherRoom() 回调来获知跨房通话是否成功,
  103 + * 如果成功,两个房间中的所有用户都会收到 PK 主播的 onUserVideoAvailable() 回调。
  104 + *
  105 + * @param userId 要 PK 的目标主播 userid。
  106 + * @param errCode 错误码,ERR_NULL 代表切换成功,其他请参见[错误码](https://cloud.tencent.com/document/product/647/32257)。
  107 + * @param errMsg 错误信息。
  108 + */
  109 +- (void)onConnectOtherRoom:(NSString*)userId errCode:(TXLiteAVError)errCode errMsg:(nullable NSString *)errMsg;
  110 +
  111 +/**
  112 + * 2.5 结束跨房通话(主播 PK)的结果回调
  113 + */
  114 +- (void)onDisconnectOtherRoom:(TXLiteAVError)errCode errMsg:(nullable NSString *)errMsg;
  115 +
  116 +/// @}
  117 +
  118 +/////////////////////////////////////////////////////////////////////////////////
  119 +//
  120 +// (三)成员事件回调
  121 +//
  122 +/////////////////////////////////////////////////////////////////////////////////
  123 +/// @name 成员事件回调
  124 +/// @{
  125 +
  126 +/**
  127 + * 3.1 有用户加入当前房间
  128 + *
  129 + * 出于性能方面的考虑,在两种不同的应用场景下,该通知的行为会有差别:
  130 + * - 通话场景(TRTCAppSceneVideoCall 和 TRTCAppSceneAudioCall):该场景下用户没有角色的区别,任何用户进入房间都会触发该通知。
  131 + * - 直播场景(TRTCAppSceneLIVE 和 TRTCAppSceneVoiceChatRoom):该场景不限制观众的数量,如果任何用户进出都抛出回调会引起很大的性能损耗,所以该场景下只有主播进入房间时才会触发该通知,观众进入房间不会触发该通知。
  132 + *
  133 + *
  134 + * @note 注意 onRemoteUserEnterRoom 和 onRemoteUserLeaveRoom 只适用于维护当前房间里的“成员列表”,如果需要显示远程画面,建议使用监听 onUserVideoAvailable() 事件回调。
  135 + *
  136 + * @param userId 用户标识
  137 + */
  138 +- (void)onRemoteUserEnterRoom:(NSString *)userId;
  139 +
  140 +/**
  141 + * 3.2 有用户离开当前房间
  142 + *
  143 + * 与 onRemoteUserEnterRoom 相对应,在两种不同的应用场景下,该通知的行为会有差别:
  144 + * - 通话场景(TRTCAppSceneVideoCall 和 TRTCAppSceneAudioCall):该场景下用户没有角色的区别,任何用户的离开都会触发该通知。
  145 + * - 直播场景(TRTCAppSceneLIVE 和 TRTCAppSceneVoiceChatRoom):只有主播离开房间时才会触发该通知,观众离开房间不会触发该通知。
  146 + *
  147 + * @param userId 用户标识
  148 + * @param reason 离开原因,0表示用户主动退出房间,1表示用户超时退出,2表示被踢出房间。
  149 + */
  150 +- (void)onRemoteUserLeaveRoom:(NSString *)userId reason:(NSInteger)reason;
  151 +
  152 +/**
  153 + * 3.3 用户是否开启摄像头视频
  154 + *
  155 + * 当您收到 onUserVideoAvailable(userid, YES) 通知时,表示该路画面已经有可用的视频数据帧到达。
  156 + * 此时,您需要调用 startRemoteView(userid) 接口加载该用户的远程画面。
  157 + * 然后,您会收到名为 onFirstVideoFrame(userid) 的首帧画面渲染回调。
  158 + *
  159 + * 当您收到 onUserVideoAvailable(userid, NO) 通知时,表示该路远程画面已被关闭,
  160 + * 可能由于该用户调用了 muteLocalVideo() 或 stopLocalPreview()。
  161 + *
  162 + * @param userId 用户标识
  163 + * @param available 画面是否开启
  164 + */
  165 +- (void)onUserVideoAvailable:(NSString *)userId available:(BOOL)available;
  166 +
  167 +/**
  168 + * 3.4 用户是否开启屏幕分享
  169 + *
  170 + * @note 显示辅路画面使用的函数是 startRemoteSubStreamView() 而非 startRemoteView()。
  171 + * @param userId 用户标识
  172 + * @param available 屏幕分享是否开启
  173 + */
  174 +- (void)onUserSubStreamAvailable:(NSString *)userId available:(BOOL)available;
  175 +
  176 +/**
  177 + * 3.5 用户是否开启音频上行
  178 + *
  179 + * @param userId 用户标识
  180 + * @param available 声音是否开启
  181 + */
  182 +- (void)onUserAudioAvailable:(NSString *)userId available:(BOOL)available;
  183 +
  184 +/**
  185 + * 3.6 开始渲染本地或远程用户的首帧画面
  186 + *
  187 + * 如果 userId == nil,代表开始渲染本地采集的摄像头画面,需要您先调用 startLocalPreview 触发。
  188 + * 如果 userId != nil,代表开始渲染远程用户的首帧画面,需要您先调用 startRemoteView 触发。
  189 + *
  190 + * @note 只有当您调用 startLocalPreivew()、startRemoteView() 或 startRemoteSubStreamView() 之后,才会触发该回调。
  191 + *
  192 + * @param userId 本地或远程用户 ID,如果 userId == nil 代表本地,userId != nil 代表远程。
  193 + * @param streamType 视频流类型:摄像头或屏幕分享。
  194 + * @param width 画面宽度
  195 + * @param height 画面高度
  196 + */
  197 +- (void)onFirstVideoFrame:(NSString*)userId streamType:(TRTCVideoStreamType)streamType width:(int)width height:(int)height;
  198 +
  199 +/**
  200 + * 3.7 开始播放远程用户的首帧音频(本地声音暂不通知)
  201 + *
  202 + * @param userId 远程用户 ID。
  203 + */
  204 +- (void)onFirstAudioFrame:(NSString*)userId;
  205 +
  206 +/**
  207 + * 3.8 首帧本地视频数据已经被送出
  208 + *
  209 + * SDK 会在 enterRoom() 并 startLocalPreview() 成功后开始摄像头采集,并将采集到的画面进行编码。
  210 + * 当 SDK 成功向云端送出第一帧视频数据后,会抛出这个回调事件。
  211 + *
  212 + * @param streamType 视频流类型,主画面、小画面或辅流画面(屏幕分享)
  213 + */
  214 +- (void)onSendFirstLocalVideoFrame: (TRTCVideoStreamType)streamType;
  215 +
  216 +/**
  217 + * 3.9 首帧本地音频数据已经被送出
  218 + *
  219 + * SDK 会在 enterRoom() 并 startLocalAudio() 成功后开始麦克风采集,并将采集到的声音进行编码。
  220 + * 当 SDK 成功向云端送出第一帧音频数据后,会抛出这个回调事件。
  221 + */
  222 +- (void)onSendFirstLocalAudioFrame;
  223 +
  224 +/**
  225 + * 3.10 废弃接口:有主播加入当前房间
  226 + *
  227 + * 该回调接口可以被看作是 onRemoteUserEnterRoom 的废弃版本,不推荐使用。请使用 onUserVideoAvailable 或 onRemoteUserEnterRoom 进行替代。
  228 + *
  229 + * @note 该接口已被废弃,不推荐使用
  230 + *
  231 + * @param userId 用户标识
  232 + */
  233 +- (void)onUserEnter:(NSString *)userId DEPRECATED_ATTRIBUTE;
  234 +
  235 +/**
  236 + * 3.11 废弃接口: 有主播离开当前房间
  237 + *
  238 + * 该回调接口可以被看作是 onRemoteUserLeaveRoom 的废弃版本,不推荐使用。请使用 onUserVideoAvailable 或 onRemoteUserEnterRoom 进行替代。
  239 + *
  240 + * @note 该接口已被废弃,不推荐使用
  241 + *
  242 + * @param userId 用户标识
  243 + * @param reason 离开原因。
  244 + */
  245 +- (void)onUserExit:(NSString *)userId reason:(NSInteger)reason DEPRECATED_ATTRIBUTE;
  246 +
  247 +/// @}
  248 +
  249 +/////////////////////////////////////////////////////////////////////////////////
  250 +//
  251 +// (四)统计和质量回调
  252 +//
  253 +/////////////////////////////////////////////////////////////////////////////////
  254 +
  255 +/// @name 统计和质量回调
  256 +/// @{
  257 +
  258 +/**
  259 + * 4.1 网络质量:该回调每2秒触发一次,统计当前网络的上行和下行质量
  260 + *
  261 + * @note userId == nil 代表自己当前的视频质量
  262 + *
  263 + * @param localQuality 上行网络质量
  264 + * @param remoteQuality 下行网络质量
  265 + */
  266 +- (void)onNetworkQuality: (TRTCQualityInfo*)localQuality remoteQuality:(NSArray<TRTCQualityInfo*>*)remoteQuality;
  267 +
  268 +/**
  269 + * 4.2 技术指标统计回调
  270 + *
  271 + * 如果您是熟悉音视频领域相关术语,可以通过这个回调获取 SDK 的所有技术指标。
  272 + * 如果您是首次开发音视频相关项目,可以只关注 onNetworkQuality 回调。
  273 + *
  274 + * @param statistics 统计数据,包括本地和远程的
  275 + * @note 每2秒回调一次
  276 + */
  277 +- (void)onStatistics: (TRTCStatistics *)statistics;
  278 +
  279 +/// @}
  280 +
  281 +/////////////////////////////////////////////////////////////////////////////////
  282 +//
  283 +// (五)服务器事件回调
  284 +//
  285 +/////////////////////////////////////////////////////////////////////////////////
  286 +
  287 +/// @name 服务器事件回调
  288 +/// @{
  289 +
  290 +/**
  291 + * 5.1 SDK 跟服务器的连接断开
  292 + */
  293 +- (void)onConnectionLost;
  294 +
  295 +/**
  296 + * 5.2 SDK 尝试重新连接到服务器
  297 + */
  298 +- (void)onTryToReconnect;
  299 +
  300 +/**
  301 + * 5.3 SDK 跟服务器的连接恢复
  302 + */
  303 +- (void)onConnectionRecovery;
  304 +
  305 +/// @}
  306 +
  307 +/////////////////////////////////////////////////////////////////////////////////
  308 +//
  309 +// (六)硬件设备事件回调
  310 +//
  311 +/////////////////////////////////////////////////////////////////////////////////
  312 +
  313 +/// @name 硬件设备事件回调
  314 +/// @{
  315 +
  316 +/**
  317 + * 6.1 摄像头准备就绪
  318 + */
  319 +- (void)onCameraDidReady;
  320 +
  321 +/**
  322 + * 6.2 麦克风准备就绪
  323 + */
  324 +- (void)onMicDidReady;
  325 +
  326 +#if TARGET_OS_IPHONE
  327 +/**
  328 + * 6.3 音频路由发生变化(仅 iOS),音频路由即声音由哪里输出(扬声器、听筒)
  329 + *
  330 + * @param route 当前音频路由
  331 + * @param fromRoute 变更前的音频路由
  332 + */
  333 +- (void)onAudioRouteChanged:(TRTCAudioRoute)route fromRoute:(TRTCAudioRoute)fromRoute;
  334 +#endif
  335 +
  336 +/**
  337 + * 6.4 用于提示音量大小的回调,包括每个 userId 的音量和远端总音量
  338 + *
  339 + * 您可以通过调用 TRTCCloud 中的 enableAudioVolumeEvaluation 接口来开关这个回调或者设置它的触发间隔。
  340 + * 需要注意的是,调用 enableAudioVolumeEvaluation 开启音量回调后,无论频道内是否有人说话,都会按设置的时间间隔调用这个回调;
  341 + * 如果没有人说话,则 userVolumes 为空,totalVolume 为0。
  342 + *
  343 + * @param userVolumes 所有正在说话的房间成员的音量,取值范围0 - 100。
  344 + * @param totalVolume 所有远端成员的总音量, 取值范围0 - 100。
  345 + * @note userId 为 nil 时表示自己的音量,userVolumes 内仅包含正在说话(音量不为0)的用户音量信息。
  346 + */
  347 +- (void)onUserVoiceVolume:(NSArray<TRTCVolumeInfo *> *)userVolumes totalVolume:(NSInteger)totalVolume;
  348 +
  349 +
  350 +#if !TARGET_OS_IPHONE && TARGET_OS_MAC
  351 +/**
  352 + * 6.5 本地设备通断回调
  353 + *
  354 + * @param deviceId 设备 ID
  355 + * @param deviceType 设备类型
  356 + * @param state 0:设备断开;1:设备连接
  357 + */
  358 +- (void)onDevice:(NSString *)deviceId type:(TRTCMediaDeviceType)deviceType stateChanged:(NSInteger)state;
  359 +
  360 +#endif
  361 +
  362 +/// @}
  363 +
  364 +
  365 +/////////////////////////////////////////////////////////////////////////////////
  366 +//
  367 +// (七)自定义消息的接收回调
  368 +//
  369 +/////////////////////////////////////////////////////////////////////////////////
  370 +
  371 +/// @name 自定义消息的接收回调
  372 +/// @{
  373 +
  374 +/**
  375 + * 7.1 收到自定义消息回调
  376 + *
  377 + * 当房间中的某个用户使用 sendCustomCmdMsg 发送自定义消息时,房间中的其它用户可以通过 onRecvCustomCmdMsg 接口接收消息
  378 + *
  379 + * @param userId 用户标识
  380 + * @param cmdID 命令 ID
  381 + * @param seq 消息序号
  382 + * @param message 消息数据
  383 + */
  384 +- (void)onRecvCustomCmdMsgUserId:(NSString *)userId cmdID:(NSInteger)cmdID seq:(UInt32)seq message:(NSData *)message;
  385 +
  386 +/**
  387 + * 7.2 自定义消息丢失回调
  388 + *
  389 + * 实时音视频使用 UDP 通道,即使设置了可靠传输(reliable),也无法确保100@%不丢失,只是丢消息概率极低,能满足常规可靠性要求。
  390 + * 在发送端设置了可靠运输(reliable)后,SDK 都会通过此回调通知过去时间段内(通常为5s)传输途中丢失的自定义消息数量统计信息。
  391 + *
  392 + * @note 只有在发送端设置了可靠传输(reliable),接收方才能收到消息的丢失回调
  393 + * @param userId 用户标识
  394 + * @param cmdID 命令 ID
  395 + * @param errCode 错误码
  396 + * @param missed 丢失的消息数量
  397 + */
  398 +- (void)onMissCustomCmdMsgUserId:(NSString *)userId cmdID:(NSInteger)cmdID errCode:(NSInteger)errCode missed:(NSInteger)missed;
  399 +
  400 +/**
  401 + * 7.3 收到 SEI 消息的回调
  402 + *
  403 + * 当房间中的某个用户使用 sendSEIMsg 发送数据时,房间中的其它用户可以通过 onRecvSEIMsg 接口接收数据。
  404 + *
  405 + * @param userId 用户标识
  406 + * @param message 数据
  407 + */
  408 +- (void)onRecvSEIMsg:(NSString *)userId message:(NSData*)message;
  409 +
  410 +/// @}
  411 +
  412 +/////////////////////////////////////////////////////////////////////////////////
  413 +//
  414 +// (八)CDN 旁路回调
  415 +//
  416 +/////////////////////////////////////////////////////////////////////////////////
  417 +/// @name CDN 旁路转推回调
  418 +/// @{
  419 +
  420 +/**
  421 + * 8.1 开始向腾讯云的直播 CDN 推流的回调,对应于 TRTCCloud 中的 startPublishing() 接口
  422 + *
  423 + * @param err 0表示成功,其余值表示失败
  424 + * @param errMsg 具体错误原因
  425 + */
  426 +- (void)onStartPublishing:(int)err errMsg:(NSString*)errMsg;
  427 +
  428 +/**
  429 + * 8.2 停止向腾讯云的直播 CDN 推流的回调,对应于 TRTCCloud 中的 stopPublishing() 接口
  430 + *
  431 + * @param err 0表示成功,其余值表示失败
  432 + * @param errMsg 具体错误原因
  433 + */
  434 +- (void)onStopPublishing:(int)err errMsg:(NSString*)errMsg;
  435 +
  436 +/**
  437 + * 8.3 启动旁路推流到 CDN 完成的回调
  438 + *
  439 + * 对应于 TRTCCloud 中的 startPublishCDNStream() 接口
  440 + *
  441 + * @note Start 回调如果成功,只能说明转推请求已经成功告知给腾讯云,如果目标 CDN 有异常,还是有可能会转推失败。
  442 + */
  443 +- (void)onStartPublishCDNStream:(int)err errMsg:(NSString *)errMsg;
  444 +
  445 +/**
  446 + * 8.4 停止旁路推流到 CDN 完成的回调
  447 + *
  448 + * 对应于 TRTCCloud 中的 stopPublishCDNStream() 接口
  449 + *
  450 + */
  451 +- (void)onStopPublishCDNStream:(int)err errMsg:(NSString *)errMsg;
  452 +
  453 +/**
  454 + * 8.5 设置云端的混流转码参数的回调,对应于 TRTCCloud 中的 setMixTranscodingConfig() 接口
  455 + *
  456 + * @param err 0表示成功,其余值表示失败
  457 + * @param errMsg 具体错误原因
  458 + */
  459 +- (void)onSetMixTranscodingConfig:(int)err errMsg:(NSString*)errMsg;
  460 +
  461 +/// @}
  462 +
  463 +/////////////////////////////////////////////////////////////////////////////////
  464 +//
  465 +// (九)音效回调
  466 +//
  467 +/////////////////////////////////////////////////////////////////////////////////
  468 +/// @name 音效回调
  469 +/// @{
  470 +/**
  471 + * 播放音效结束回调
  472 + *
  473 + * @param effectId 音效 ID
  474 + * @param code 0表示播放正常结束;其他表示异常结束
  475 + */
  476 +- (void)onAudioEffectFinished:(int) effectId code:(int) code;
  477 +/// @}
  478 +/////////////////////////////////////////////////////////////////////////////////
  479 +//
  480 +// (十)屏幕分享回调
  481 +//
  482 +/////////////////////////////////////////////////////////////////////////////////
  483 +
  484 +/// @name 屏幕分享回调
  485 +/// @{
  486 +/**
  487 + * 10.1 当屏幕分享开始时,SDK 会通过此回调通知
  488 + */
  489 +- (void)onScreenCaptureStarted;
  490 +
  491 +/**
  492 + * 10.2 当屏幕分享暂停时,SDK 会通过此回调通知
  493 + *
  494 + * @param reason 原因,0:用户主动暂停;1:屏幕窗口不可见暂停
  495 + */
  496 +- (void)onScreenCapturePaused:(int)reason;
  497 +
  498 +/**
  499 + * 10.3 当屏幕分享恢复时,SDK 会通过此回调通知
  500 + *
  501 + * @param reason 恢复原因,0:用户主动恢复;1:屏幕窗口恢复可见从而恢复分享
  502 + */
  503 +- (void)onScreenCaptureResumed:(int)reason;
  504 +
  505 +/**
  506 + * 10.4 当屏幕分享停止时,SDK 会通过此回调通知
  507 + *
  508 + * @param reason 停止原因,0:用户主动停止;1:屏幕窗口关闭导致停止
  509 + */
  510 +- (void)onScreenCaptureStoped:(int)reason;
  511 +/// @}
  512 +@end
  513 +/// @}
  514 +
  515 +/////////////////////////////////////////////////////////////////////////////////
  516 +//
  517 +// (十一)自定义视频渲染回调
  518 +//
  519 +/////////////////////////////////////////////////////////////////////////////////
  520 +#pragma mark - TRTCVideoRenderDelegate
  521 +/// @addtogroup TRTCCloudDelegate_ios
  522 +/// @{
  523 +/**
  524 + * 视频数据帧的自定义处理回调
  525 + */
  526 +@protocol TRTCVideoRenderDelegate <NSObject>
  527 +/**
  528 + * 自定义视频渲染回调
  529 + *
  530 + * @param frame 待渲染的视频帧信息
  531 + * @param userId 视频源的 userId,如果是本地视频回调(setLocalVideoRenderDelegate),该参数可以忽略
  532 + * @param streamType 视频源类型,例如,使用摄像头画面或屏幕分享画面等
  533 + */
  534 +@optional
  535 +- (void) onRenderVideoFrame:(TRTCVideoFrame * _Nonnull)frame userId:(NSString* __nullable)userId streamType:(TRTCVideoStreamType)streamType;
  536 +
  537 +@end
  538 +
  539 +/////////////////////////////////////////////////////////////////////////////////
  540 +//
  541 +// (十二)音频数据回调
  542 +//
  543 +/////////////////////////////////////////////////////////////////////////////////
  544 +/**
  545 + * 声音数据帧的自定义处理回调
  546 + */
  547 +@protocol TRTCAudioFrameDelegate <NSObject>
  548 +@optional
  549 +/**
  550 + * 本地麦克风采集到的音频数据回调
  551 + *
  552 + * @param frame 音频数据
  553 + * @note - 请不要在此回调函数中做任何耗时操作,建议直接拷贝到另一线程进行处理,否则会导致各种声音问题。
  554 + * @note - 此接口回调出的音频数据支持修改。
  555 + * @note - 此接口回调出的音频时间帧长固定为0.02s。
  556 + 由时间帧长转化为字节帧长的公式为【采样率 × 时间帧长 × 声道数 × 采样点位宽】。
  557 + 以SDK默认的音频录制格式48000采样率、单声道、16采样点位宽为例,字节帧长为【48000 × 0.02s × 1 × 16bit = 15360bit = 1920字节】。
  558 + * @note - 此接口回调出的音频数据包含背景音、音效、混响等前处理效果。
  559 + */
  560 +- (void) onCapturedAudioFrame:(TRTCAudioFrame *)frame;
  561 +
  562 +/**
  563 + * 混音前的每一路远程用户的音频数据(例如您要对某一路的语音进行文字转换,必须要使用这里的原始数据,而不是混音之后的数据)
  564 + *
  565 + * @param frame 音频数据
  566 + * @param userId 用户标识
  567 + * @note - 请不要在此回调函数中做任何耗时操作,建议直接拷贝到另一线程进行处理,否则会导致各种声音问题。
  568 + * @note - 此接口回调出的音频数据是只读的,不支持修改。
  569 + */
  570 +- (void) onPlayAudioFrame:(TRTCAudioFrame *)frame userId:(NSString *)userId;
  571 +
  572 +/**
  573 + * 各路音频数据混合后的音频数据
  574 + *
  575 + * @param frame 音频数据
  576 + * @note - 请不要在此回调函数中做任何耗时操作,建议直接拷贝到另一线程进行处理,否则会导致各种声音问题。
  577 + * @note - 此接口回调出的音频数据支持修改。
  578 + * @note - 此接口回调出的音频时间帧长固定为0.02s。
  579 + 由时间帧长转化为字节帧长的公式为【采样率 × 时间帧长 × 声道数 × 采样点位宽】。
  580 + 以SDK默认的音频播放格式48000采样率、双声道、16采样点位宽为例,字节帧长为【48000 × 0.02s × 2 × 16bit = 30720bit = 3840字节】。
  581 + * @note - 此接口回调出的音频数据是各路音频播放数据的混合,不包含耳返的音频数据。
  582 + */
  583 +- (void) onMixedPlayAudioFrame:(TRTCAudioFrame *)frame;
  584 +
  585 +@end
  586 +
  587 +/////////////////////////////////////////////////////////////////////////////////
  588 +//
  589 +// (十三)Log 信息回调
  590 +//
  591 +/////////////////////////////////////////////////////////////////////////////////
  592 +/**
  593 + * 日志相关回调
  594 + *
  595 + * 建议在一个比较早初始化的类中设置回调委托对象,例如 AppDelegate
  596 + */
  597 +@protocol TRTCLogDelegate <NSObject>
  598 +/**
  599 + * 有日志打印时的回调
  600 + *
  601 + * @param log 日志内容
  602 + * @param level 日志等级,参见 TRTCLogLevel
  603 + * @param module 值暂无具体意义,目前为固定值 TXLiteAVSDK
  604 + */
  605 +@optional
  606 +-(void) onLog:(nullable NSString*)log LogLevel:(TRTCLogLevel)level WhichModule:(nullable NSString*)module;
  607 +
  608 +@end
  609 +/// @}
  610 +
  611 +NS_ASSUME_NONNULL_END
  1 +
  2 +/*
  3 + * Module: TRTCStatistics @ TXLiteAVSDK
  4 + *
  5 + * Function: 腾讯云视频通话功能的质量统计相关接口
  6 + *
  7 + */
  8 +///@addtogroup TRTCCloudDef_ios
  9 +///@{
  10 +
  11 +/// 自己本地的音视频统计信息
  12 +@interface TRTCLocalStatistics : NSObject
  13 +
  14 +///视频宽度
  15 +@property (nonatomic, assign) uint32_t width;
  16 +
  17 +///视频高度
  18 +@property (nonatomic, assign) uint32_t height;
  19 +
  20 +///帧率(fps)
  21 +@property (nonatomic, assign) uint32_t frameRate;
  22 +
  23 +///视频发送码率(Kbps)
  24 +@property (nonatomic, assign) uint32_t videoBitrate;
  25 +
  26 +///音频采样率(Hz)
  27 +@property (nonatomic, assign) uint32_t audioSampleRate;
  28 +
  29 +///音频发送码率(Kbps)
  30 +@property (nonatomic, assign) uint32_t audioBitrate;
  31 +
  32 +///流类型(大画面 | 小画面 | 辅路画面)
  33 +@property (nonatomic, assign) TRTCVideoStreamType streamType;
  34 +@end
  35 +
  36 +
  37 +/// 远端成员的音视频统计信息
  38 +@interface TRTCRemoteStatistics : NSObject
  39 +
  40 +/// 用户 ID,指定是哪个用户的视频流
  41 +@property (nonatomic, retain) NSString* userId;
  42 +
  43 +/** 该线路的总丢包率(%)
  44 + *
  45 + * 这个值越小越好,例如,丢包率为0表示网络很好。
  46 + * 丢包率是该线路的 userId 从上行到服务器再到下行的总丢包率。
  47 + * 如果 downLoss 为0,但是 finalLoss 不为0,说明该 userId 上行时出现了无法恢复的丢包。
  48 + */
  49 +@property (nonatomic, assign) uint32_t finalLoss;
  50 +
  51 +///视频宽度
  52 +@property (nonatomic, assign) uint32_t width;
  53 +
  54 +///视频高度
  55 +@property (nonatomic, assign) uint32_t height;
  56 +
  57 +///接收帧率(fps)
  58 +@property (nonatomic, assign) uint32_t frameRate;
  59 +
  60 +///视频码率(Kbps)
  61 +@property (nonatomic, assign) uint32_t videoBitrate;
  62 +
  63 +///音频采样率(Hz)
  64 +@property (nonatomic, assign) uint32_t audioSampleRate;
  65 +
  66 +///音频码率(Kbps)
  67 +@property (nonatomic, assign) uint32_t audioBitrate;
  68 +
  69 +///流类型(大画面 | 小画面 | 辅路画面)
  70 +@property (nonatomic, assign) TRTCVideoStreamType streamType;
  71 +@end
  72 +
  73 +
  74 +/// 统计数据
  75 +@interface TRTCStatistics : NSObject
  76 +
  77 +/** C -> S 上行丢包率(%),
  78 + * 该值越小越好,例如,丢包率为0表示网络很好,
  79 + * 丢包率为30@%则意味着 SDK 向服务器发送的数据包中会有30@%丢失在上行传输中。
  80 + */
  81 +@property (nonatomic, assign) uint32_t upLoss;
  82 +
  83 +/** S -> C 下行丢包率(%),
  84 + * 该值越小越好,例如,丢包率为0表示网络很好,
  85 + * 丢包率为30@%则意味着 SDK 向服务器发送的数据包中会有30@%丢失在下行传输中。
  86 + */
  87 +@property (nonatomic, assign) uint32_t downLoss;
  88 +
  89 +///当前 App 的 CPU 使用率(%)
  90 +@property (nonatomic, assign) uint32_t appCpu;
  91 +
  92 +///当前系统的 CPU 使用率(%)
  93 +@property (nonatomic, assign) uint32_t systemCpu;
  94 +
  95 +/// 延迟(毫秒),
  96 +/// 指 SDK 到腾讯云服务器的一次网络往返时间,该值越小越好。
  97 +/// 一般低于50ms的 rtt 相对理想,而高于100ms的 rtt 会引入较大的通话延时。
  98 +/// 由于数据上下行共享一条网络连接,所以 local 和 remote 的 rtt 相同。
  99 +@property (nonatomic, assign) uint32_t rtt;
  100 +
  101 +/// 总接收字节数(包含信令及音视频)
  102 +@property (nonatomic, assign) uint64_t receivedBytes;
  103 +
  104 +/// 总发送字节数(包含信令及音视频)
  105 +@property (nonatomic, assign) uint64_t sentBytes;
  106 +
  107 +///自己本地的音视频统计信息,可能有主画面、小画面以及辅路画面等多路的情况,因此是一个数组
  108 +@property (nonatomic, strong) NSArray<TRTCLocalStatistics*>* localStatistics;
  109 +
  110 +///远端成员的音视频统计信息,可能有主画面、小画面以及辅路画面等多路的情况,因此是一个数组
  111 +@property (nonatomic, strong) NSArray<TRTCRemoteStatistics*>* remoteStatistics;
  112 +@end
  113 +///@}
  1 +//
  2 +// TXAudioCustomProcessDelegate.h
  3 +// TXLiteAVSDK
  4 +//
  5 +// Created by realingzhou on 2018/1/15.
  6 +// Copyright © 2018年 Tencent. All rights reserved.
  7 +//
  8 +
  9 +#ifndef TXAudioCustomProcessDelegate_h
  10 +#define TXAudioCustomProcessDelegate_h
  11 +#import <Foundation/Foundation.h>
  12 +
  13 +@protocol TXAudioCustomProcessDelegate <NSObject>
  14 +
  15 +/**
  16 + * 原始声音的回调
  17 + * @param data pcm数据
  18 + * @param timeStamp 时间戳
  19 + * @param sampleRate 采样率
  20 + * @param channels 声道数
  21 + * @param withBgm 回调的数据是否包含bgm,当不开启回声消除时,回调的raw pcm会包含bgm
  22 + */
  23 +@optional
  24 +- (void)onRecordRawPcmData:(NSData *)data timeStamp:(unsigned long long)timeStamp sampleRate:(int)sampleRate channels:(int)channels withBgm:(BOOL)withBgm;
  25 +
  26 +/**
  27 + * 经过特效处理的声音回调
  28 + * @param data pcm数据
  29 + * @param timeStamp 时间戳
  30 + * @param sampleRate 采样率
  31 + * @param channels 声道数
  32 + */
  33 +@optional
  34 +- (void)onRecordPcmData:(NSData *)data timeStamp:(unsigned long long)timeStamp sampleRate:(int)sampleRate channels:(int)channels;
  35 +
  36 +@end
  37 +
  38 +#endif /* TXAudioCustomProcessDelegate_h */
  1 +//
  2 +// TXAudioRawDataDelegate.h
  3 +// TXLiteAVSDK
  4 +//
  5 +// Created by realingzhou on 2018/2/24.
  6 +// Copyright © 2018年 Tencent. All rights reserved.
  7 +//
  8 +
  9 +#ifndef TXAudioRawDataDelegate_h
  10 +#define TXAudioRawDataDelegate_h
  11 +
  12 +@protocol TXAudioRawDataDelegate <NSObject>
  13 +
  14 +/**
  15 + * 音频播放信息回调
  16 + *
  17 + * @param sampleRate 采样率
  18 + * @param channels 声道数
  19 + */
  20 +@optional
  21 +- (void)onAudioInfoChanged:(int)sampleRate channels:(int)channels;
  22 +
  23 +/**
  24 + * 音频播放数据回调,数据格式 :PCM
  25 + *
  26 + * <!!!注意!!!> 该函数内不要做耗时操作<!!!注意!!!>
  27 + * 音频播放器会在播放数据的前一刻,调用此函数,同步回调将要播放的数据。因此在函数内部做耗时操作可能会影响播放
  28 + *
  29 + *
  30 + * @param data pcm数据
  31 + * @param timestamp 时间戳。注 :会有连续相同的时间戳回调出来,超过2048字节,时间戳才会变化。
  32 + */
  33 +@optional
  34 +- (void)onPcmDataAvailable:(NSData *)data pts:(unsigned long long)timestamp;
  35 +
  36 +@end
  37 +
  38 +#endif /* TXAudioRawDataDelegate_h */
  1 +//
  2 +// TXBeautyManager.h
  3 +// TXLiteAVSDK
  4 +//
  5 +// Created by cui on 2019/10/24.
  6 +// Copyright © 2019 Tencent. All rights reserved.
  7 +//
  8 +
  9 +#import <Foundation/Foundation.h>
  10 +
  11 +NS_ASSUME_NONNULL_BEGIN
  12 +
  13 +/// @defgroup TXBeautyManager_ios TXBeautyManager
  14 +/// 美颜及动效参数管理
  15 +/// @{
  16 +
  17 +/**
  18 + * 美颜(磨皮)算法
  19 + * SDK 内置了多种不同的磨皮算法,您可以选择最适合您产品定位的方案。
  20 + */
  21 +typedef NS_ENUM(NSInteger, TXBeautyStyle) {
  22 + TXBeautyStyleSmooth = 0, ///< 光滑,适用于美女秀场,效果比较明显。
  23 + TXBeautyStyleNature = 1, ///< 自然,磨皮算法更多地保留了面部细节,主观感受上会更加自然。
  24 + TXBeautyStylePitu = 2 ///< 企业版美颜算法(企业版有效,其它版本设置此参数无效)
  25 +};
  26 +
  27 +/// 美颜及动效参数管理
  28 +@interface TXBeautyManager : NSObject
  29 +
  30 +/**
  31 + * 设置美颜(磨皮)算法
  32 + *
  33 + * SDK 内部集成了两套风格不同的磨皮算法,一套我们取名叫“光滑”,适用于美女秀场,效果比较明显。
  34 + * 另一套我们取名“自然”,磨皮算法更多地保留了面部细节,主观感受上会更加自然。
  35 + *
  36 + * @param beautyStyle 美颜风格,光滑或者自然,光滑风格磨皮更加明显,适合娱乐场景。
  37 + */
  38 +- (void)setBeautyStyle:(TXBeautyStyle)beautyStyle;
  39 +
  40 +/**
  41 + * 设置美颜级别
  42 + * @param level 美颜级别,取值范围0 - 9; 0表示关闭,1 - 9值越大,效果越明显。
  43 + */
  44 +- (void)setBeautyLevel:(float)level;
  45 +
  46 +/**
  47 + * 设置美白级别
  48 + *
  49 + * @param level 美白级别,取值范围0 - 9;0表示关闭,1 - 9值越大,效果越明显。
  50 + */
  51 +- (void)setWhitenessLevel:(float)level;
  52 +
  53 +/**
  54 + * 设置红润级别
  55 + *
  56 + * @param level 红润级别,取值范围0 - 9;0表示关闭,1 - 9值越大,效果越明显。
  57 + */
  58 +- (void)setRuddyLevel:(float)level;
  59 +
  60 +#if TARGET_OS_IPHONE
  61 +/**
  62 + * 设置大眼级别(企业版有效,其它版本设置此参数无效)
  63 + *
  64 + * @param level 大眼级别,取值范围0 - 9;0表示关闭,1 - 9值越大,效果越明显。
  65 + */
  66 +- (void)setEyeScaleLevel:(float)level;
  67 +
  68 +/**
  69 + * 设置瘦脸级别(企业版有效,其它版本设置此参数无效)
  70 + *
  71 + * @param level 瘦脸级别,取值范围0 - 9;0表示关闭,1 - 9值越大,效果越明显。
  72 + */
  73 +- (void)setFaceSlimLevel:(float)level;
  74 +
  75 +/**
  76 + * 设置V脸级别(企业版有效,其它版本设置此参数无效)
  77 + *
  78 + * @param level V脸级别,取值范围0 - 9;0表示关闭,1 - 9值越大,效果越明显。
  79 + */
  80 +- (void)setFaceVLevel:(float)level;
  81 +
  82 +/**
  83 + * 设置下巴拉伸或收缩(企业版有效,其它版本设置此参数无效)
  84 + *
  85 + * @param level 下巴拉伸或收缩级别,取值范围-9 - 9;0 表示关闭,小于0表示收缩,大于0表示拉伸。
  86 + */
  87 +- (void)setChinLevel:(float)level;
  88 +/**
  89 + * 设置短脸级别(企业版有效,其它版本设置此参数无效)
  90 + *
  91 + * @param level 短脸级别,取值范围0 - 9;0表示关闭,1 - 9值越大,效果越明显。
  92 + */
  93 +- (void)setFaceShortLevel:(float)level;
  94 +
  95 +/**
  96 + * 设置瘦鼻级别(企业版有效,其它版本设置此参数无效)
  97 + *
  98 + * @param level 瘦鼻级别,取值范围0 - 9;0表示关闭,1 - 9值越大,效果越明显。
  99 + */
  100 +- (void)setNoseSlimLevel:(float)level;
  101 +
  102 +/**
  103 + * 设置亮眼 (企业版有效,其它版本设置此参数无效)
  104 + *
  105 + * @param level 亮眼级别,取值范围0 - 9;0表示关闭,1 - 9值越大,效果越明显。
  106 + */
  107 +- (void)setEyeLightenLevel:(float)level;
  108 +
  109 +/**
  110 + * 设置白牙 (企业版有效,其它版本设置此参数无效)
  111 + *
  112 + * @param level 白牙级别,取值范围0 - 9;0表示关闭,1 - 9值越大,效果越明显。
  113 + */
  114 +- (void)setToothWhitenLevel:(float)level;
  115 +
  116 +/**
  117 + * 设置祛皱 (企业版有效,其它版本设置此参数无效)
  118 + *
  119 + * @param level 祛皱级别,取值范围0 - 9;0表示关闭,1 - 9值越大,效果越明显。
  120 + */
  121 +- (void)setWrinkleRemoveLevel:(float)level;
  122 +
  123 +/**
  124 + * 设置祛眼袋 (企业版有效,其它版本设置此参数无效)
  125 + *
  126 + * @param level 祛眼袋级别,取值范围0 - 9;0表示关闭,1 - 9值越大,效果越明显。
  127 + */
  128 +- (void)setPounchRemoveLevel:(float)level;
  129 +
  130 +/**
  131 + * 设置法令纹 (企业版有效,其它版本设置此参数无效)
  132 + *
  133 + * @param level 法令纹级别,取值范围0 - 9;0表示关闭,1 - 9值越大,效果越明显。
  134 + */
  135 +- (void)setSmileLinesRemoveLevel:(float)level;
  136 +
  137 +/**
  138 + * 设置发际线 (企业版有效,其它版本设置此参数无效)
  139 + *
  140 + * @param level 发际线级别,取值范围-9 - 9;0表示关闭,小于0表示抬高,大于0表示降低。
  141 + */
  142 +- (void)setForeheadLevel:(float)level;
  143 +
  144 +/**
  145 + * 设置眼距 (企业版有效,其它版本设置此参数无效)
  146 + *
  147 + * @param level 眼距级别,取值范围-9 - 9;0表示关闭,小于0表示拉伸,大于0表示收缩。
  148 + */
  149 +- (void)setEyeDistanceLevel:(float)level;
  150 +
  151 +/**
  152 + * 设置眼角 (企业版有效,其它版本设置此参数无效)
  153 + *
  154 + * @param level 眼角级别,取值范围-9 - 9;0表示关闭,小于0表示降低,大于0表示抬高。
  155 + */
  156 +- (void)setEyeAngleLevel:(float)level;
  157 +
  158 +/**
  159 + * 设置嘴型 (企业版有效,其它版本设置此参数无效)
  160 + *
  161 + * @param level 嘴型级别,取值范围-9 - 9;0表示关闭,小于0表示拉伸,大于0表示收缩。
  162 + */
  163 +- (void)setMouthShapeLevel:(float)level;
  164 +
  165 +/**
  166 + * 设置鼻翼 (企业版有效,其它版本设置此参数无效)
  167 + *
  168 + * @param level 鼻翼级别,取值范围-9 - 9;0表示关闭,小于0表示拉伸,大于0表示收缩。
  169 + */
  170 +- (void)setNoseWingLevel:(float)level;
  171 +
  172 +/**
  173 + * 设置鼻子位置 (企业版有效,其它版本设置此参数无效)
  174 + * @param level 鼻子位置级别,取值范围-9 - 9;0表示关闭,小于0表示抬高,大于0表示降低。
  175 + */
  176 +- (void)setNosePositionLevel:(float)level;
  177 +
  178 +/**
  179 + * 设置嘴唇厚度 (企业版有效,其它版本设置此参数无效)
  180 + * @param level 嘴唇厚度级别,取值范围-9 - 9;0表示关闭,小于0表示拉伸,大于0表示收缩。
  181 + */
  182 +- (void)setLipsThicknessLevel:(float)level;
  183 +
  184 +/**
  185 + * 设置脸型(企业版有效,其它版本设置此参数无效)
  186 + * @param level 美型级别,取值范围0 - 9;0表示关闭,1 - 9值越大,效果越明显。
  187 + */
  188 +- (void)setFaceBeautyLevel:(float)level;
  189 +
  190 +/**
  191 + * 选择 AI 动效挂件(企业版有效,其它版本设置此参数无效)
  192 + *
  193 + * @param tmplName 动效名称
  194 + * @param tmplDir 动效所在目录
  195 + */
  196 +- (void)setMotionTmpl:(nullable NSString *)tmplName inDir:(nullable NSString *)tmplDir;
  197 +
  198 +/**
  199 + * 设置动效静音(企业版有效,其它版本设置此参数无效)
  200 + *
  201 + * 有些挂件本身会有声音特效,通过此 API 可以关闭这些特效播放时所带的声音效果。
  202 + *
  203 + * @param motionMute YES:静音;NO:不静音。
  204 + */
  205 +- (void)setMotionMute:(BOOL)motionMute;
  206 +#endif
  207 +
  208 +@end
  209 +/// @}
  210 +
  211 +NS_ASSUME_NONNULL_END
  1 +#ifndef __TXLITEAVCODE_H__
  2 +#define __TXLITEAVCODE_H__
  3 +
  4 +/////////////////////////////////////////////////////////////////////////////////
  5 +//
  6 +// 错误码
  7 +//
  8 +/////////////////////////////////////////////////////////////////////////////////
  9 +
  10 +typedef enum TXLiteAVError
  11 +{
  12 + /////////////////////////////////////////////////////////////////////////////////
  13 + //
  14 + // 基础错误码
  15 + //
  16 + /////////////////////////////////////////////////////////////////////////////////
  17 + ERR_NULL = 0, ///< 无错误
  18 +
  19 + /////////////////////////////////////////////////////////////////////////////////
  20 + //
  21 + // 进房(enterRoom)相关错误码
  22 + // NOTE: 通过回调函数 TRTCCloudDelegate##onEnterRoom() 和 TRTCCloudDelegate##OnError() 通知
  23 + //
  24 + /////////////////////////////////////////////////////////////////////////////////
  25 + ERR_ROOM_ENTER_FAIL = -3301, ///< 进入房间失败
  26 + ERR_ENTER_ROOM_PARAM_NULL = -3316, ///< 进房参数为空,请检查 enterRoom:appScene: 接口调用是否传入有效的 param
  27 + ERR_SDK_APPID_INVALID = -3317, ///< 进房参数 sdkAppId 错误
  28 + ERR_ROOM_ID_INVALID = -3318, ///< 进房参数 roomId 错误
  29 + ERR_USER_ID_INVALID = -3319, ///< 进房参数 userID 不正确
  30 + ERR_USER_SIG_INVALID = -3320, ///< 进房参数 userSig 不正确
  31 + ERR_ROOM_REQUEST_ENTER_ROOM_TIMEOUT = -3308, ///< 请求进房超时,请检查网络
  32 + ERR_SERVER_INFO_SERVICE_SUSPENDED = -100013, ///< 服务不可用。请检查:套餐包剩余分钟数是否大于0,腾讯云账号是否欠费
  33 +
  34 +
  35 + /////////////////////////////////////////////////////////////////////////////////
  36 + //
  37 + // 退房(exitRoom)相关错误码
  38 + // NOTE: 通过回调函数 TRTCCloudDelegate##OnError() 通知
  39 + //
  40 + /////////////////////////////////////////////////////////////////////////////////
  41 + ERR_ROOM_REQUEST_QUIT_ROOM_TIMEOUT = -3325, ///< 请求退房超时
  42 +
  43 +
  44 + /////////////////////////////////////////////////////////////////////////////////
  45 + //
  46 + // 设备(摄像头、麦克风、扬声器)相关错误码
  47 + // NOTE: 通过回调函数 TRTCCloudDelegate##OnError() 通知
  48 + //
  49 + /////////////////////////////////////////////////////////////////////////////////
  50 + ERR_CAMERA_START_FAIL = -1301, ///< 打开摄像头失败,例如在 Windows 或 Mac 设备,摄像头的配置程序(驱动程序)异常,禁用后重新启用设备,或者重启机器,或者更新配置程序
  51 + ERR_CAMERA_NOT_AUTHORIZED = -1314, ///< 摄像头设备未授权,通常在移动设备出现,可能是权限被用户拒绝了
  52 + ERR_CAMERA_SET_PARAM_FAIL = -1315, ///< 摄像头参数设置出错(参数不支持或其它)
  53 + ERR_CAMERA_OCCUPY = -1316, ///< 摄像头正在被占用中,可尝试打开其他摄像头
  54 + ERR_MIC_START_FAIL = -1302, ///< 打开麦克风失败,例如在 Windows 或 Mac 设备,麦克风的配置程序(驱动程序)异常,禁用后重新启用设备,或者重启机器,或者更新配置程序
  55 + ERR_MIC_NOT_AUTHORIZED = -1317, ///< 麦克风设备未授权,通常在移动设备出现,可能是权限被用户拒绝了
  56 + ERR_MIC_SET_PARAM_FAIL = -1318, ///< 麦克风设置参数失败
  57 + ERR_MIC_OCCUPY = -1319, ///< 麦克风正在被占用中,例如移动设备正在通话时,打开麦克风会失败
  58 + ERR_MIC_STOP_FAIL = -1320, ///< 停止麦克风失败
  59 + ERR_SPEAKER_START_FAIL = -1321, ///< 打开扬声器失败,例如在 Windows 或 Mac 设备,扬声器的配置程序(驱动程序)异常,禁用后重新启用设备,或者重启机器,或者更新配置程序
  60 + ERR_SPEAKER_SET_PARAM_FAIL = -1322, ///< 扬声器设置参数失败
  61 + ERR_SPEAKER_STOP_FAIL = -1323, ///< 停止扬声器失败
  62 +
  63 +
  64 + /////////////////////////////////////////////////////////////////////////////////
  65 + //
  66 + // 屏幕分享相关错误码
  67 + // NOTE: 通过回调函数 TRTCCloudDelegate##OnError() 通知
  68 + //
  69 + /////////////////////////////////////////////////////////////////////////////////
  70 + ERR_SCREEN_CAPTURE_START_FAIL = -1308, ///< 开始录屏失败,如果在移动设备出现,可能是权限被用户拒绝了,如果在 Windows 或 Mac 系统的设备出现,请检查录屏接口的参数是否符合要求
  71 + ERR_SCREEN_CAPTURE_UNSURPORT = -1309, ///< 录屏失败,在 Android 平台,需要5.0以上的系统
  72 + ERR_SERVER_CENTER_NO_PRIVILEDGE_PUSH_SUB_VIDEO = -102015, ///< 没有权限上行辅路
  73 + ERR_SERVER_CENTER_ANOTHER_USER_PUSH_SUB_VIDEO = -102016, ///< 其他用户正在上行辅路
  74 +
  75 +
  76 + /////////////////////////////////////////////////////////////////////////////////
  77 + //
  78 + // 编解码相关错误码
  79 + // NOTE: 通过回调函数 TRTCCloudDelegate##OnError() 通知
  80 + //
  81 + /////////////////////////////////////////////////////////////////////////////////
  82 + ERR_VIDEO_ENCODE_FAIL = -1303, ///< 视频帧编码失败,例如 iOS 设备切换到其他应用时,硬编码器可能被系统释放,再切换回来时,硬编码器重启前,可能会抛出
  83 + ERR_UNSUPPORTED_RESOLUTION = -1305, ///< 不支持的视频分辨率
  84 + ERR_AUDIO_ENCODE_FAIL = -1304, ///< 音频帧编码失败,例如传入自定义音频数据,SDK 无法处理
  85 + ERR_UNSUPPORTED_SAMPLERATE = -1306, ///< 不支持的音频采样率
  86 +
  87 +
  88 + /////////////////////////////////////////////////////////////////////////////////
  89 + //
  90 + // 自定义采集相关错误码
  91 + // NOTE: 通过回调函数 TRTCCloudDelegate##OnError() 通知
  92 + //
  93 + /////////////////////////////////////////////////////////////////////////////////
  94 + ERR_PIXEL_FORMAT_UNSUPPORTED = -1327, ///< 设置的 pixel format 不支持
  95 + ERR_BUFFER_TYPE_UNSUPPORTED = -1328, ///< 设置的 buffer type 不支持
  96 +
  97 +
  98 + /////////////////////////////////////////////////////////////////////////////////
  99 + //
  100 + // CDN 绑定和混流相关错误码
  101 + // NOTE: 通过回调函数 TRTCCloudDelegate##onStartPublishing() 和 TRTCCloudDelegate##onSetMixTranscodingConfig 通知。
  102 + //
  103 + /////////////////////////////////////////////////////////////////////////////////
  104 + ERR_PUBLISH_CDN_STREAM_REQUEST_TIME_OUT = -3321, ///< 旁路转推请求超时
  105 + ERR_CLOUD_MIX_TRANSCODING_REQUEST_TIME_OUT = -3322, ///< 云端混流请求超时
  106 + ERR_PUBLISH_CDN_STREAM_SERVER_FAILED = -3323, ///< 旁路转推回包异常
  107 + ERR_CLOUD_MIX_TRANSCODING_SERVER_FAILED = -3324, ///< 云端混流回包异常
  108 + ERR_ROOM_REQUEST_START_PUBLISHING_TIMEOUT = -3333, ///< 开始向腾讯云的直播 CDN 推流信令超时
  109 + ERR_ROOM_REQUEST_START_PUBLISHING_ERROR = -3334, ///< 开始向腾讯云的直播 CDN 推流信令异常
  110 + ERR_ROOM_REQUEST_STOP_PUBLISHING_TIMEOUT = -3335, ///< 停止向腾讯云的直播 CDN 推流信令超时
  111 + ERR_ROOM_REQUEST_STOP_PUBLISHING_ERROR = -3336, ///< 停止向腾讯云的直播 CDN 推流信令异常
  112 +
  113 +
  114 + /////////////////////////////////////////////////////////////////////////////////
  115 + //
  116 + // 跨房连麦(ConnectOtherRoom)相关错误码
  117 + // NOTE: 通过回调函数 TRTCCloudDelegate##onConnectOtherRoom() 通知。
  118 + //
  119 + /////////////////////////////////////////////////////////////////////////////////
  120 + ERR_ROOM_REQUEST_CONN_ROOM_TIMEOUT = -3326, ///< 请求连麦超时
  121 + ERR_ROOM_REQUEST_DISCONN_ROOM_TIMEOUT = -3327, ///< 请求退出连麦超时
  122 + ERR_ROOM_REQUEST_CONN_ROOM_INVALID_PARAM = -3328, ///< 无效参数
  123 + ERR_CONNECT_OTHER_ROOM_AS_AUDIENCE = -3330, ///< 当前是观众角色,不能请求或断开跨房连麦,需要先 switchRole() 到主播
  124 + ERR_SERVER_CENTER_CONN_ROOM_NOT_SUPPORT = -102031, ///< 不支持跨房间连麦
  125 + ERR_SERVER_CENTER_CONN_ROOM_REACH_MAX_NUM = -102032, ///< 达到跨房间连麦上限
  126 + ERR_SERVER_CENTER_CONN_ROOM_REACH_MAX_RETRY_TIMES = -102033, ///< 跨房间连麦重试次数耗尽
  127 + ERR_SERVER_CENTER_CONN_ROOM_REQ_TIMEOUT = -102034, ///< 跨房间连麦请求超时
  128 + ERR_SERVER_CENTER_CONN_ROOM_REQ = -102035, ///< 跨房间连麦请求格式错误
  129 + ERR_SERVER_CENTER_CONN_ROOM_NO_SIG = -102036, ///< 跨房间连麦无签名
  130 + ERR_SERVER_CENTER_CONN_ROOM_DECRYPT_SIG = -102037, ///< 跨房间连麦签名解密失败
  131 + ERR_SERVER_CENTER_CONN_ROOM_NO_KEY = -102038, ///< 未找到跨房间连麦签名解密密钥
  132 + ERR_SERVER_CENTER_CONN_ROOM_PARSE_SIG = -102039, ///< 跨房间连麦签名解析错误
  133 + ERR_SERVER_CENTER_CONN_ROOM_INVALID_SIG_TIME = -102040, ///< 跨房间连麦签名时间戳错误
  134 + ERR_SERVER_CENTER_CONN_ROOM_SIG_GROUPID = -102041, ///< 跨房间连麦签名不匹配
  135 + ERR_SERVER_CENTER_CONN_ROOM_NOT_CONNED = -102042, ///< 本房间无连麦
  136 + ERR_SERVER_CENTER_CONN_ROOM_USER_NOT_CONNED = -102043, ///< 本用户未发起连麦
  137 + ERR_SERVER_CENTER_CONN_ROOM_FAILED = -102044, ///< 跨房间连麦失败
  138 + ERR_SERVER_CENTER_CONN_ROOM_CANCEL_FAILED = -102045, ///< 取消跨房间连麦失败
  139 + ERR_SERVER_CENTER_CONN_ROOM_CONNED_ROOM_NOT_EXIST = -102046, ///< 被连麦房间不存在
  140 + ERR_SERVER_CENTER_CONN_ROOM_CONNED_REACH_MAX_ROOM = -102047, ///< 被连麦房间达到连麦上限
  141 + ERR_SERVER_CENTER_CONN_ROOM_CONNED_USER_NOT_EXIST = -102048, ///< 被连麦用户不存在
  142 + ERR_SERVER_CENTER_CONN_ROOM_CONNED_USER_DELETED = -102049, ///< 被连麦用户已被删除
  143 + ERR_SERVER_CENTER_CONN_ROOM_CONNED_USER_FULL = -102050, ///< 被连麦用户达到资源上限
  144 + ERR_SERVER_CENTER_CONN_ROOM_INVALID_SEQ = -102051, ///< 连麦请求序号错乱
  145 +
  146 +
  147 + /////////////////////////////////////////////////////////////////////////////////
  148 + //
  149 + // 客户无需关心的内部错误码
  150 + //
  151 + /////////////////////////////////////////////////////////////////////////////////
  152 +
  153 + // - Remove From Head
  154 + ERR_RTMP_PUSH_NET_DISCONNECT = -1307, ///< 直播,推流出现网络断开,且经过多次重试无法恢复
  155 + ERR_RTMP_PUSH_INVALID_ADDRESS = -1313, ///< 直播,推流地址非法,例如不是 RTMP 协议的地址
  156 + ERR_RTMP_PUSH_NET_ALLADDRESS_FAIL = -1324, ///< 直播,连接推流服务器失败(若支持智能选路,IP 全部失败)
  157 + ERR_RTMP_PUSH_NO_NETWORK = -1325, ///< 直播,网络不可用,请确认 Wi-Fi、移动数据或者有线网络是否正常
  158 + ERR_RTMP_PUSH_SERVER_REFUSE = -1326, ///< 直播,服务器拒绝连接请求,可能是该推流地址已经被占用,或者 TXSecret 校验失败,或者是过期了,或者是欠费了
  159 +
  160 + ERR_PLAY_LIVE_STREAM_NET_DISCONNECT = -2301, ///< 直播,网络断连,且经多次重连抢救无效,可以放弃治疗,更多重试请自行重启播放
  161 + ERR_GET_RTMP_ACC_URL_FAIL = -2302, ///< 直播,获取加速拉流的地址失败
  162 + ERR_FILE_NOT_FOUND = -2303, ///< 播放的文件不存在
  163 + ERR_HEVC_DECODE_FAIL = -2304, ///< H265 解码失败
  164 + ERR_VOD_DECRYPT_FAIL = -2305, ///< 点播,音视频流解密失败
  165 + ERR_GET_VODFILE_MEDIAINFO_FAIL = -2306, ///< 点播,获取点播文件信息失败
  166 + ERR_PLAY_LIVE_STREAM_SWITCH_FAIL = -2307, ///< 直播,切流失败(切流可以播放不同画面大小的视频)
  167 + ERR_PLAY_LIVE_STREAM_SERVER_REFUSE = -2308, ///< 直播,服务器拒绝连接请求
  168 + ERR_RTMP_ACC_FETCH_STREAM_FAIL = -2309, ///< 直播,RTMPACC 低延时拉流失败,且经过多次重试无法恢复
  169 +
  170 + ERR_ROOM_HEARTBEAT_FAIL = -3302, ///< 心跳失败,客户端定时向服务器发送数据包,告诉服务器自己活着,这个错误通常是发包超时
  171 + ERR_ROOM_REQUEST_IP_FAIL = -3303, ///< 拉取接口机服务器地址失败
  172 + ERR_ROOM_CONNECT_FAIL = -3304, ///< 连接接口机服务器失败
  173 + ERR_ROOM_REQUEST_AVSEAT_FAIL = -3305, ///< 请求视频位失败
  174 + ERR_ROOM_REQUEST_TOKEN_HTTPS_TIMEOUT = -3306, ///< 请求 token HTTPS 超时,请检查网络是否正常,或网络防火墙是否放行 HTTPS 访问 official.opensso.tencent-cloud.com:443
  175 + ERR_ROOM_REQUEST_IP_TIMEOUT = -3307, ///< 请求 IP 和 sig 超时,请检查网络是否正常,或网络防火墙是否放行 UDP 访问下列 IP 和域名 query.tencent-cloud.com:8000 162.14.23.140:8000 162.14.7.49:8000
  176 + ERR_ROOM_REQUEST_VIDEO_FLAG_TIMEOUT = -3309, ///< 请求视频位超时
  177 + ERR_ROOM_REQUEST_VIDEO_DATA_ROOM_TIMEOUT = -3310, ///< 请求视频数据超时
  178 + ERR_ROOM_REQUEST_CHANGE_ABILITY_TIMEOUT = -3311, ///< 请求修改视频能力项超时
  179 + ERR_ROOM_REQUEST_STATUS_REPORT_TIMEOUT = -3312, ///< 请求状态上报超时
  180 + ERR_ROOM_REQUEST_CLOSE_VIDEO_TIMEOUT = -3313, ///< 请求关闭视频超时
  181 + ERR_ROOM_REQUEST_SET_RECEIVE_TIMEOUT = -3314, ///< 请求接收视频项超时
  182 + ERR_ROOM_REQUEST_TOKEN_INVALID_PARAMETER = -3315, ///< 请求 token 无效参数,请检查 TRTCParams.userSig 是否填写正确
  183 +
  184 + ERR_ROOM_REQUEST_AES_TOKEN_RETURN_ERROR = -3329, ///< 请求 AES TOKEN 时,server 返回的内容是空的
  185 + ERR_ACCIP_LIST_EMPTY = -3331, ///< 请求接口机 IP 返回的列表为空的
  186 + ERR_ROOM_REQUEST_SEND_JSON_CMD_TIMEOUT = -3332, ///< 请求发送Json 信令超时
  187 +
  188 + // Info 服务器(查询接口机 IP), 服务器错误码,数值范围[-100000, -110000]
  189 + ERR_SERVER_INFO_UNPACKING_ERROR = -100000, ///< server 解包错误,可能请求数据被篡改
  190 + ERR_SERVER_INFO_TOKEN_ERROR = -100001, ///< TOKEN 错误
  191 + ERR_SERVER_INFO_ALLOCATE_ACCESS_FAILED = -100002, ///< 分配接口机错误
  192 + ERR_SERVER_INFO_GENERATE_SIGN_FAILED = -100003, ///< 生成签名错误
  193 + ERR_SERVER_INFO_TOKEN_TIMEOUT = -100004, ///< HTTPS token 超时
  194 + ERR_SERVER_INFO_INVALID_COMMAND = -100005, ///< 无效的命令字
  195 + ERR_SERVER_INFO_PRIVILEGE_FLAG_ERROR = -100006, ///< 权限位校验失败
  196 + ERR_SERVER_INFO_GENERATE_KEN_ERROR = -100007, ///< HTTPS 请求时,生成加密 key 错误
  197 + ERR_SERVER_INFO_GENERATE_TOKEN_ERROR = -100008, ///< HTTPS 请求时,生成 token 错误
  198 + ERR_SERVER_INFO_DATABASE = -100009, ///< 数据库查询失败(房间相关存储信息)
  199 + ERR_SERVER_INFO_BAD_ROOMID = -100010, ///< 房间号错误
  200 + ERR_SERVER_INFO_BAD_SCENE_OR_ROLE = -100011, ///< 场景或角色错误
  201 + ERR_SERVER_INFO_ROOMID_EXCHANGE_FAILED = -100012, ///< 房间号转换出错
  202 + ERR_SERVER_INFO_STRGROUP_HAS_INVALID_CHARS = -100014, ///< 房间号非法
  203 + ERR_SERVER_INFO_LACK_SDKAPPID = -100015, ///< 非法SDKAppid
  204 + ERR_SERVER_INFO_INVALID = -100016, ///< 无效请求, 分配接口机失败
  205 + ERR_SERVER_INFO_ECDH_GET_KEY = -100017, ///< 生成公钥失败
  206 + ERR_SERVER_INFO_ECDH_GET_TINYID = -100018, ///< userSig 校验失败,请检查 TRTCParams.userSig 是否填写正确
  207 +
  208 + // Access 接口机
  209 + ERR_SERVER_ACC_TOKEN_TIMEOUT = -101000, ///< token 过期
  210 + ERR_SERVER_ACC_SIGN_ERROR = -101001, ///< 签名错误
  211 + ERR_SERVER_ACC_SIGN_TIMEOUT = -101002, ///< 签名超时
  212 + ERR_SERVER_ACC_ROOM_NOT_EXIST = -101003, ///< 房间不存在
  213 + ERR_SERVER_ACC_ROOMID = -101004, ///< 后台房间标识 roomId 错误
  214 + ERR_SERVER_ACC_LOCATIONID = -101005, ///< 后台用户位置标识 locationId 错误
  215 + ERR_SERVER_ACC_TOKEN_EORROR = -101006, ///< token里面的tinyid和进房信令tinyid不同 或是 进房信令没有token
  216 +
  217 + // Center 服务器(信令和流控处理等任务)
  218 + ERR_SERVER_CENTER_SYSTEM_ERROR = -102000, ///< 后台错误
  219 +
  220 + ERR_SERVER_CENTER_INVALID_ROOMID = -102001, ///< 无效的房间 Id
  221 + ERR_SERVER_CENTER_CREATE_ROOM_FAILED = -102002, ///< 创建房间失败
  222 + ERR_SERVER_CENTER_SIGN_ERROR = -102003, ///< 签名错误
  223 + ERR_SERVER_CENTER_SIGN_TIMEOUT = -102004, ///< 签名过期
  224 + ERR_SERVER_CENTER_ROOM_NOT_EXIST = -102005, ///< 房间不存在
  225 + ERR_SERVER_CENTER_ADD_USER_FAILED = -102006, ///< 房间添加用户失败
  226 + ERR_SERVER_CENTER_FIND_USER_FAILED = -102007, ///< 查找用户失败
  227 + ERR_SERVER_CENTER_SWITCH_TERMINATION_FREQUENTLY = -102008, ///< 频繁切换终端
  228 + ERR_SERVER_CENTER_LOCATION_NOT_EXIST = -102009, ///< locationid 错误
  229 + ERR_SERVER_CENTER_NO_PRIVILEDGE_CREATE_ROOM = -102010, ///< 没有权限创建房间
  230 + ERR_SERVER_CENTER_NO_PRIVILEDGE_ENTER_ROOM = -102011, ///< 没有权限进入房间
  231 + ERR_SERVER_CENTER_INVALID_PARAMETER_SUB_VIDEO = -102012, ///< 辅路抢视频位、申请辅路请求类型参数错误
  232 + ERR_SERVER_CENTER_NO_PRIVILEDGE_PUSH_VIDEO = -102013, ///< 没有权限上视频
  233 + ERR_SERVER_CENTER_ROUTE_TABLE_ERROR = -102014, ///< 没有空闲路由表
  234 + ERR_SERVER_CENTER_NOT_PUSH_SUB_VIDEO = -102017, ///< 当前用户没有上行辅路
  235 + ERR_SERVER_CENTER_USER_WAS_DELETED = -102018, ///< 用户被删除状态
  236 + ERR_SERVER_CENTER_NO_PRIVILEDGE_REQUEST_VIDEO = -102019, ///< 没有权限请求视频
  237 + ERR_SERVER_CENTER_INVALID_PARAMETER = -102023, ///< 进房参数 bussInfo 错误
  238 + ERR_SERVER_CENTER_I_FRAME_UNKNOW_TYPE = -102024, ///< 请求 I 帧未知 opType
  239 + ERR_SERVER_CENTER_I_FRAME_INVALID_PACKET = -102025, ///< 请求 I 帧包格式错误
  240 + ERR_SERVER_CENTER_I_FRAME_DEST_USER_NOT_EXIST = -102026, ///< 请求 I 帧目标用户不存在
  241 + ERR_SERVER_CENTER_I_FRAME_ROOM_TOO_BIG = -102027, ///< 请求 I 帧房间用户太多
  242 + ERR_SERVER_CENTER_I_FRAME_RPS_INVALID_PARAMETER = -102028, ///< 请求 I 帧参数错误
  243 + ERR_SERVER_CENTER_INVALID_ROOM_ID = -102029, ///< 房间号非法
  244 + ERR_SERVER_CENTER_ROOM_ID_TOO_LONG = -102030, ///< 房间号超过限制
  245 + ERR_SERVER_CENTER_ROOM_FULL = -102052, ///< 房间满员
  246 + ERR_SERVER_CENTER_DECODE_JSON_FAIL = -102053, ///< JSON 串解析失败
  247 + ERR_SERVER_CENTER_UNKNOWN_SUB_CMD = -102054, ///< 未定义命令字
  248 + ERR_SERVER_CENTER_INVALID_ROLE = -102055, ///< 未定义角色
  249 + ERR_SERVER_CENTER_REACH_PROXY_MAX = -102056, ///< 代理机超出限制
  250 + ERR_SERVER_CENTER_RECORDID_STORE = -102057, ///< 无法保存用户自定义 recordId
  251 + ERR_SERVER_CENTER_PB_SERIALIZE = -102058, ///< Protobuf 序列化错误
  252 +
  253 + ERR_SERVER_SSO_SIG_EXPIRED = -70001, ///< sig 过期,请尝试重新生成。如果是刚生成,就过期,请检查有效期填写的是否过小,或者填的 0
  254 + ERR_SERVER_SSO_SIG_VERIFICATION_FAILED_1 = -70003, ///< sig 校验失败,请确认下 sig 内容是否被截断,如缓冲区长度不够导致的内容截断
  255 + ERR_SERVER_SSO_SIG_VERIFICATION_FAILED_2 = -70004, ///< sig 校验失败,请确认下 sig 内容是否被截断,如缓冲区长度不够导致的内容截断
  256 + ERR_SERVER_SSO_SIG_VERIFICATION_FAILED_3 = -70005, ///< sig 校验失败,可用工具自行验证生成的 sig 是否正确
  257 + ERR_SERVER_SSO_SIG_VERIFICATION_FAILED_4 = -70006, ///< sig 校验失败,可用工具自行验证生成的 sig 是否正确
  258 + ERR_SERVER_SSO_SIG_VERIFICATION_FAILED_5 = -70007, ///< sig 校验失败,可用工具自行验证生成的 sig 是否正确
  259 + ERR_SERVER_SSO_SIG_VERIFICATION_FAILED_6 = -70008, ///< sig 校验失败,可用工具自行验证生成的 sig 是否正确
  260 + ERR_SERVER_SSO_SIG_VERIFICATION_FAILED_7 = -70009, ///< 用业务公钥验证 sig 失败,请确认生成的 usersig 使用的私钥和 sdkAppId 是否对应
  261 + ERR_SERVER_SSO_SIG_VERIFICATION_FAILED_8 = -70010, ///< sig 校验失败,可用工具自行验证生成的 sig 是否正确
  262 + ERR_SERVER_SSO_SIG_VERIFICATION_ID_NOT_MATCH = -70013, ///< sig 中 identifier 与请求时的 identifier 不匹配,请检查登录时填写的 identifier 与 sig 中的是否一致
  263 + ERR_SERVER_SSO_APPID_NOT_MATCH = -70014, ///< sig 中 sdkAppId 与请求时的 sdkAppId 不匹配,请检查登录时填写的 sdkAppId 与 sig 中的是否一致
  264 + ERR_SERVER_SSO_VERIFICATION_EXPIRED = -70017, ///< 内部第三方票据验证超时,请重试,如多次重试不成功,请@TLS 帐号支持,QQ 3268519604
  265 + ERR_SERVER_SSO_VERIFICATION_FAILED = -70018, ///< 内部第三方票据验证超时,请重试,如多次重试不成功,请@TLS 帐号支持,QQ 3268519604
  266 +
  267 + ERR_SERVER_SSO_APPID_NOT_FOUND = -70020, ///< sdkAppId 未找到,请确认是否已经在腾讯云上配置
  268 + ERR_SERVER_SSO_ACCOUNT_IN_BLACKLIST = -70051, ///< 帐号已被拉入黑名单,请联系 TLS 帐号支持 QQ 3268519604
  269 + ERR_SERVER_SSO_SIG_INVALID = -70052, ///< usersig 已经失效,请重新生成,再次尝试
  270 + ERR_SERVER_SSO_LIMITED_BY_SECURITY = -70114, ///< 安全原因被限制
  271 + ERR_SERVER_SSO_INVALID_LOGIN_STATUS = -70221, ///< 登录状态无效,请使用 usersig 重新鉴权
  272 + ERR_SERVER_SSO_APPID_ERROR = -70252, ///< sdkAppId 填写错误
  273 + ERR_SERVER_SSO_TICKET_VERIFICATION_FAILED = -70346, ///< 票据校验失败,请检查各项参数是否正确
  274 + ERR_SERVER_SSO_TICKET_EXPIRED = -70347, ///< 票据因过期原因校验失败
  275 + ERR_SERVER_SSO_ACCOUNT_EXCEED_PURCHASES = -70398, ///< 创建账号数量超过已购买预付费数量限制
  276 + ERR_SERVER_SSO_INTERNAL_ERROR = -70500, ///< 服务器内部错误,请重试
  277 + // - /Remove From Head
  278 +} TXLiteAVError;
  279 +
  280 +/////////////////////////////////////////////////////////////////////////////////
  281 +//
  282 +// 警告码
  283 +//
  284 +//> 不需要特别关注,但您可以根据其中某些感兴趣的警告码,对当前用户进行相应的提示
  285 +//
  286 +/////////////////////////////////////////////////////////////////////////////////
  287 +
  288 +typedef enum TXLiteAVWarning
  289 +{
  290 + WARNING_HW_ENCODER_START_FAIL = 1103, ///< 硬编码启动出现问题,自动切换到软编码
  291 + WARNING_VIDEO_ENCODER_SW_TO_HW = 1107, ///< 当前 CPU 使用率太高,无法满足软件编码需求,自动切换到硬件编码
  292 + WARNING_INSUFFICIENT_CAPTURE_FPS = 1108, ///< 摄像头采集帧率不足,部分自带美颜算法的 Android 手机上会出现
  293 + WARNING_SW_ENCODER_START_FAIL = 1109, ///< 软编码启动失败
  294 + WARNING_REDUCE_CAPTURE_RESOLUTION = 1110, ///< 摄像头采集分辨率被降低,以满足当前帧率和性能最优解。
  295 + WARNING_VIDEO_FRAME_DECODE_FAIL = 2101, ///< 当前视频帧解码失败
  296 + WARNING_AUDIO_FRAME_DECODE_FAIL = 2102, ///< 当前音频帧解码失败
  297 + WARNING_VIDEO_PLAY_LAG = 2105, ///< 当前视频播放出现卡顿
  298 + WARNING_HW_DECODER_START_FAIL = 2106, ///< 硬解启动失败,采用软解码
  299 + WARNING_VIDEO_DECODER_HW_TO_SW = 2108, ///< 当前流硬解第一个 I 帧失败,SDK 自动切软解
  300 + WARNING_SW_DECODER_START_FAIL = 2109, ///< 软解码器启动失败
  301 + WARNING_VIDEO_RENDER_FAIL = 2110, ///< 视频渲染失败
  302 + WARNING_AUDIO_RECORDING_WRITE_FAIL = 7001, ///< 音频录制写入文件失败
  303 + WARNING_ROOM_DISCONNECT = 5101, ///< 网络断开连接
  304 + WARNING_IGNORE_UPSTREAM_FOR_AUDIENCE = 6001, ///< 当前是观众角色,忽略上行音视频数据
  305 +
  306 + // - Remove From Head
  307 + WARNING_NET_BUSY = 1101, ///< 网络状况不佳:上行带宽太小,上传数据受阻
  308 + WARNING_RTMP_SERVER_RECONNECT = 1102, ///< 直播,网络断连, 已启动自动重连(自动重连连续失败超过三次会放弃)
  309 + WARNING_LIVE_STREAM_SERVER_RECONNECT = 2103, ///< 直播,网络断连, 已启动自动重连(自动重连连续失败超过三次会放弃)
  310 + WARNING_RECV_DATA_LAG = 2104, ///< 网络来包不稳:可能是下行带宽不足,或由于主播端出流不均匀
  311 + WARNING_RTMP_DNS_FAIL = 3001, ///< 直播,DNS 解析失败
  312 + WARNING_RTMP_SEVER_CONN_FAIL = 3002, ///< 直播,服务器连接失败
  313 + WARNING_RTMP_SHAKE_FAIL = 3003, ///< 直播,与 RTMP 服务器握手失败
  314 + WARNING_RTMP_SERVER_BREAK_CONNECT = 3004, ///< 直播,服务器主动断开
  315 + WARNING_RTMP_READ_WRITE_FAIL = 3005, ///< 直播,RTMP 读/写失败,将会断开连接
  316 + WARNING_RTMP_WRITE_FAIL = 3006, ///< 直播,RTMP 写失败(SDK 内部错误码,不会对外抛出)
  317 + WARNING_RTMP_READ_FAIL = 3007, ///< 直播,RTMP 读失败(SDK 内部错误码,不会对外抛出)
  318 + WARNING_RTMP_NO_DATA = 3008, ///< 直播,超过30s 没有数据发送,主动断开连接
  319 + WARNING_PLAY_LIVE_STREAM_INFO_CONNECT_FAIL = 3009, ///< 直播,connect 服务器调用失败(SDK 内部错误码,不会对外抛出)
  320 + WARNING_NO_STEAM_SOURCE_FAIL = 3010, ///< 直播,连接失败,该流地址无视频(SDK 内部错误码,不会对外抛出)
  321 + WARNING_ROOM_RECONNECT = 5102, ///< 网络断连,已启动自动重连
  322 + WARNING_ROOM_NET_BUSY = 5103, ///< 网络状况不佳:上行带宽太小,上传数据受阻
  323 + // - /Remove From Head
  324 +} TXLiteAVWarning;
  325 +
  326 +// - Remove From Head
  327 +/////////////////////////////////////////////////////////////////////////////////
  328 +//
  329 +// (三)事件列表
  330 +//
  331 +/////////////////////////////////////////////////////////////////////////////////
  332 +
  333 +typedef enum TXLiteAVEvent
  334 +{
  335 + EVT_RTMP_PUSH_CONNECT_SUCC = 1001, ///< 直播,已经连接 RTMP 推流服务器
  336 + EVT_RTMP_PUSH_BEGIN = 1002, ///< 直播,已经与 RTMP 服务器握手完毕,开始推流
  337 + EVT_CAMERA_START_SUCC = 1003, ///< 打开摄像头成功
  338 + EVT_SCREEN_CAPTURE_SUCC = 1004, ///< 录屏启动成功
  339 + EVT_UP_CHANGE_RESOLUTION = 1005, ///< 上行动态调整分辨率
  340 + EVT_UP_CHANGE_BITRATE = 1006, ///< 码率动态调整
  341 + EVT_FIRST_FRAME_AVAILABLE = 1007, ///< 首帧画面采集完成
  342 + EVT_START_VIDEO_ENCODER = 1008, ///< 编码器启动成功
  343 + EVT_SNAPSHOT_COMPLETE = 1022, ///< 一帧截图完成
  344 + EVT_CAMERA_REMOVED = 1023, ///< 摄像头设备已被移出(Windows 和 Mac 版 SDK 使用)
  345 + EVT_CAMERA_AVAILABLE = 1024, ///< 摄像头设备重新可用(Windows 和 Mac 版 SDK 使用)
  346 + EVT_CAMERA_CLOSE = 1025, ///< 关闭摄像头完成(Windows 和 Mac 版 SDK 使用)
  347 + EVT_RTMP_PUSH_PUBLISH_START = 1026, ///< 直播,与 RTMP 服务器连接后,收到 NetStream.Publish.Start 消息,表明流发布成功(SDK 内部事件,不会对外抛出)
  348 + EVT_HW_ENCODER_START_SUCC = 1027, ///< 硬编码器启动成功
  349 + EVT_SW_ENCODER_START_SUCC = 1028, ///< 软编码器启动成功
  350 + EVT_LOCAL_RECORD_RESULT = 1029, ///< 本地录制结果
  351 + EVT_LOCAL_RECORD_PROGRESS = 1030, ///< 本地录制状态通知
  352 +
  353 + EVT_PLAY_LIVE_STREAM_CONNECT_SUCC = 2001, ///< 直播,已经连接 RTMP 拉流服务器
  354 + EVT_PLAY_LIVE_STREAM_BEGIN = 2002, ///< 直播,已经与 RTMP 服务器握手完毕,开始拉流
  355 + EVT_RENDER_FIRST_I_FRAME = 2003, ///< 渲染首个视频数据包(IDR)
  356 + EVT_VIDEO_PLAY_BEGIN = 2004, ///< 视频播放开始
  357 + EVT_VIDEO_PLAY_PROGRESS = 2005, ///< 视频播放进度
  358 + EVT_VIDEO_PLAY_END = 2006, ///< 视频播放结束
  359 + EVT_VIDEO_PLAY_LOADING = 2007, ///< 视频播放 loading
  360 + EVT_START_VIDEO_DECODER = 2008, ///< 解码器启动
  361 + EVT_DOWN_CHANGE_RESOLUTION = 2009, ///< 下行视频分辨率改变
  362 + EVT_GET_VODFILE_MEDIAINFO_SUCC = 2010, ///< 点播,获取点播文件信息成功
  363 + EVT_VIDEO_CHANGE_ROTATION = 2011, ///< 视频旋转角度发生改变
  364 + EVT_PLAY_GET_MESSAGE = 2012, ///< 消息事件
  365 + EVT_VOD_PLAY_PREPARED = 2013, ///< 点播,视频加载完毕
  366 + EVT_VOD_PLAY_LOADING_END = 2014, ///< 点播,loading 结束
  367 + EVT_PLAY_LIVE_STREAM_SWITCH_SUCC = 2015, ///< 直播,切流成功(切流可以播放不同画面大小的视频)
  368 + EVT_VOD_PLAY_TCP_CONNECT_SUCC = 2016, ///< 点播,TCP 连接成功(SDK 内部事件,不会对外抛出)
  369 + EVT_VOD_PLAY_FIRST_VIDEO_PACKET = 2017, ///< 点播,收到首帧数据(SDK 内部事件,不会对外抛出)
  370 + EVT_VOD_PLAY_DNS_RESOLVED = 2018, ///< 点播,DNS 解析完成(SDK 内部事件,不会对外抛出)
  371 + EVT_VOD_PLAY_SEEK_COMPLETE = 2019, ///< 点播,视频播放 Seek 完成(SDK 内部事件,不会对外抛出)
  372 + EVT_VIDEO_DECODER_CACHE_TOO_MANY_FRAMES = 2020, ///< 视频解码器缓存帧数过多,超过40帧(SDK 内部事件,不会对外抛出)
  373 + EVT_HW_DECODER_START_SUCC = 2021, ///< 硬解码器启动成功(SDK 内部事件,不会对外抛出)
  374 + EVT_SW_DECODER_START_SUCC = 2022, ///< 软解码器启动成功(SDK 内部事件,不会对外抛出)
  375 + EVT_AUDIO_JITTER_STATE_FIRST_LOADING = 2023, ///< 音频首次加载(SDK 内部事件,不会对外抛出)
  376 + EVT_AUDIO_JITTER_STATE_LOADING = 2024, ///< 音频正在加载(SDK 内部事件,不会对外抛出)
  377 + EVT_AUDIO_JITTER_STATE_PLAYING = 2025, ///< 音频正在播放(SDK 内部事件,不会对外抛出)
  378 + EVT_AUDIO_JITTER_STATE_FIRST_PLAY = 2026, ///< 音频首次播放(SDK 内部事件,不会对外抛出)
  379 + EVT_MIC_START_SUCC = 2027, ///< 麦克风启动成功
  380 + EVT_PLAY_GET_METADATA = 2028, ///< 视频流MetaData事件
  381 + EVT_MIC_RELEASE_SUCC = 2029, ///< 释放麦克风占用
  382 +
  383 + EVT_ROOM_ENTER = 1018, ///< 进入房间成功
  384 + EVT_ROOM_EXIT = 1019, ///< 退出房间
  385 + EVT_ROOM_USERLIST = 1020, ///< 下发房间成员列表(不包括自己)
  386 + EVT_ROOM_NEED_REENTER = 1021, ///< WiFi 切换到4G 会触发断线重连,此时需要重新进入房间(拉取最优的服务器地址)
  387 + EVT_ROOM_ENTER_FAILED = 1022, ///< 自己进入房间失败
  388 + EVT_ROOM_USER_ENTER = 1031, ///< 进房通知
  389 + EVT_ROOM_USER_EXIT = 1032, ///< 退房通知
  390 + EVT_ROOM_USER_VIDEO_STATE = 1033, ///< 视频状态位变化通知
  391 + EVT_ROOM_USER_AUDIO_STATE = 1034, ///< 音频状态位变化通知
  392 +
  393 + EVT_ROOM_REQUEST_IP_SUCC = 8001, ///< 拉取接口机服务器地址成功
  394 + EVT_ROOM_CONNECT_SUCC = 8002, ///< 连接接口机服务器成功
  395 + EVT_ROOM_REQUEST_AVSEAT_SUCC = 8003, ///< 请求视频位成功
  396 +} TXLiteAVEvent;
  397 +// - /Remove From Head
  398 +
  399 +#endif /* __TXLITEAVCODE_H__ */
  1 +//
  2 +// TXLiteAVSDK.h
  3 +// TXLiteAVSDK
  4 +//
  5 +// Created by alderzhang on 2017/6/9.
  6 +// Copyright © 2017年 Tencent. All rights reserved.
  7 +//
  8 +
  9 +
  10 +
  11 +#import <TXLiteAVSDK_TRTC/TRTCCloud.h>
  12 +#import <TXLiteAVSDK_TRTC/TRTCCloudDef.h>
  13 +#import <TXLiteAVSDK_TRTC/TRTCCloudDelegate.h>
  14 +#import <TXLiteAVSDK_TRTC/TRTCStatistics.h>
  15 +#import <TXLiteAVSDK_TRTC/TXAudioCustomProcessDelegate.h>
  16 +#import <TXLiteAVSDK_TRTC/TXAudioRawDataDelegate.h>
  17 +#import <TXLiteAVSDK_TRTC/TXBeautyManager.h>
  18 +#import <TXLiteAVSDK_TRTC/TXLiteAVCode.h>
  19 +#import <TXLiteAVSDK_TRTC/TXLiveAudioSessionDelegate.h>
  20 +#import <TXLiteAVSDK_TRTC/TXLiveBase.h>
  21 +#import <TXLiteAVSDK_TRTC/TXLivePlayConfig.h>
  22 +#import <TXLiteAVSDK_TRTC/TXLivePlayListener.h>
  23 +#import <TXLiteAVSDK_TRTC/TXLivePlayer.h>
  24 +#import <TXLiteAVSDK_TRTC/TXLiveRecordListener.h>
  25 +#import <TXLiteAVSDK_TRTC/TXLiveRecordTypeDef.h>
  26 +#import <TXLiteAVSDK_TRTC/TXLiveSDKEventDef.h>
  27 +#import <TXLiteAVSDK_TRTC/TXLiveSDKTypeDef.h>
  28 +#import <TXLiteAVSDK_TRTC/TXVideoCustomProcessDelegate.h>
  1 +#ifndef TXLiveAudioSessionDelegate_h
  2 +#define TXLiveAudioSessionDelegate_h
  3 +
  4 +#import <AVFoundation/AVFoundation.h>
  5 +
  6 +@protocol TXLiveAudioSessionDelegate <NSObject>
  7 +#if TARGET_OS_IPHONE
  8 +
  9 +@optional
  10 +- (BOOL)setActive:(BOOL)active error:(NSError **)outError;
  11 +
  12 +@optional
  13 +- (BOOL)setMode:(NSString *)mode error:(NSError **)outError;
  14 +
  15 +@optional
  16 +- (BOOL)setCategory:(NSString *)category error:(NSError **)outError;
  17 +
  18 +@optional
  19 +- (BOOL)setCategory:(NSString *)category withOptions:(AVAudioSessionCategoryOptions)options error:(NSError **)outError;
  20 +
  21 +@optional
  22 +- (BOOL)setCategory:(NSString *)category mode:(NSString *)mode options:(AVAudioSessionCategoryOptions)options error:(NSError **)outError;
  23 +@optional
  24 +- (BOOL)setPreferredIOBufferDuration:(NSTimeInterval)duration error:(NSError **)outError;
  25 +
  26 +@optional
  27 +- (BOOL)setPreferredSampleRate:(double)sampleRate error:(NSError **)outError;
  28 +
  29 +@optional
  30 +- (BOOL)overrideOutputAudioPort:(AVAudioSessionPortOverride)portOverride error:(NSError **)outError;
  31 +#endif
  32 +@end
  33 +#endif /* TXLiveAudioSessionDelegate_h */
  1 +#import "TXLiveAudioSessionDelegate.h"
  2 +
  3 +typedef NS_ENUM(NSInteger, TX_Enum_Type_LogLevel) {
  4 + ///输出所有级别的log
  5 + LOGLEVEL_VERBOSE = 0,
  6 + /// 输出 DEBUG,INFO,WARNING,ERROR 和 FATAL 级别的log
  7 + LOGLEVEL_DEBUG = 1,
  8 + /// 输出 INFO,WARNING,ERROR 和 FATAL 级别的log
  9 + LOGLEVEL_INFO = 2,
  10 + /// 只输出WARNING,ERROR 和 FATAL 级别的log
  11 + LOGLEVEL_WARN = 3,
  12 + /// 只输出ERROR 和 FATAL 级别的log
  13 + LOGLEVEL_ERROR = 4,
  14 + /// 只输出 FATAL 级别的log
  15 + LOGLEVEL_FATAL = 5,
  16 + /// 不输出任何sdk log
  17 + LOGLEVEL_NULL = 6,
  18 +};
  19 +
  20 +@protocol TXLiveBaseDelegate <NSObject>
  21 +@optional
  22 +
  23 +/**
  24 + @brief Log回调 
  25 + @discussion
  26 + 1.实现TXLiveBaseDelegate,建议在一个比较早的初始化类中如AppDelegate
  27 + 2.在初始化中设置此回调,eg:[TXLiveBase sharedInstance].delegate = self;
  28 + 3.level类型参见TX_Enum_Type_LogLevel
  29 + 4.module值暂无具体意义,目前为固定值TXLiteAVSDK
  30 + */
  31 +-(void) onLog:(NSString*)log LogLevel:(int)level WhichModule:(NSString*)module;
  32 +
  33 +@end
  34 +
  35 +@interface TXLiveBase : NSObject
  36 +
  37 +/// 通过这个delegate将全部log回调给SDK使用者,由SDK使用者来决定log如何处理
  38 +@property (nonatomic, weak) id<TXLiveBaseDelegate> delegate;
  39 +
  40 ++ (instancetype) sharedInstance;
  41 +
  42 +/** 设置log输出级别
  43 + * @param level 参见 LOGLEVEL
  44 + *
  45 + */
  46 ++ (void) setLogLevel:(TX_Enum_Type_LogLevel)level;
  47 +
  48 +/**
  49 + * 启用或禁用控制台日志打印
  50 + * @param enabled 指定是否启用
  51 + */
  52 ++ (void) setConsoleEnabled:(BOOL)enabled;
  53 +
  54 ++ (void) setAppVersion:(NSString *)verNum;
  55 +
  56 ++ (void)setAudioSessionDelegate:(id<TXLiveAudioSessionDelegate>)delegate;
  57 +
  58 +/// 获取SDK版本信息
  59 ++ (NSString *)getSDKVersionStr;
  60 +
  61 +///  获取pitu版本信息
  62 ++ (NSString *)getPituSDKVersion;
  63 +
  64 +/// 设置appID,云控使用
  65 ++ (void)setAppID:(NSString*)appID;
  66 +
  67 +/// 设置sdk的licence下载url和key
  68 ++ (void)setLicenceURL:(NSString *)url key:(NSString *)key;
  69 +
  70 +/// 获取 Licence 信息
  71 ++ (NSString *)getLicenceInfo;
  72 +@end
  1 +/*
  2 + * Module: TXLivePlayConfig @ TXLiteAVSDK
  3 + *
  4 + * Function: 腾讯云直播播放器的参数配置模块
  5 + *
  6 + * Version: <:Version:>
  7 + */
  8 +
  9 +#import <Foundation/Foundation.h>
  10 +
  11 +/// @defgroup TXLivePlayConfig_ios TXLivePlayConfig
  12 +/// 腾讯云直播播放器的参数配置模块
  13 +/// @{
  14 +
  15 +/**
  16 + * 腾讯云直播播放器的参数配置模块
  17 + *
  18 + * 主要负责 TXLivePlayer 对应的参数设置,其中绝大多数设置项在播放开始之后再设置是无效的。
  19 + */
  20 +@interface TXLivePlayConfig : NSObject
  21 +
  22 +/////////////////////////////////////////////////////////////////////////////////
  23 +//
  24 +// 常用设置项
  25 +//
  26 +/////////////////////////////////////////////////////////////////////////////////
  27 +
  28 +///【字段含义】播放器缓存时间,单位秒,取值需要大于0,默认值:5
  29 +@property(nonatomic, assign) float cacheTime;
  30 +
  31 +///【字段含义】是否自动调整播放器缓存时间,默认值:YES
  32 +/// YES:启用自动调整,自动调整的最大值和最小值可以分别通过修改 maxCacheTime 和 minCacheTime 来设置
  33 +/// NO:关闭自动调整,采用默认的指定缓存时间(1s),可以通过修改 cacheTime 来调整缓存时间
  34 +@property(nonatomic, assign) BOOL bAutoAdjustCacheTime;
  35 +
  36 +///【字段含义】播放器缓存自动调整的最大时间,单位秒,取值需要大于0,默认值:5
  37 +@property(nonatomic, assign) float maxAutoAdjustCacheTime;
  38 +
  39 +///【字段含义】播放器缓存自动调整的最小时间,单位秒,取值需要大于0,默认值为1
  40 +@property(nonatomic, assign) float minAutoAdjustCacheTime;
  41 +
  42 +///【字段含义】播放器视频卡顿报警阈值,单位毫秒
  43 +///【推荐取值】800
  44 +///【特别说明】只有渲染间隔超过这个阈值的卡顿才会有 PLAY_WARNING_VIDEO_PLAY_LAG 通知
  45 +@property(nonatomic, assign) int videoBlockThreshold;
  46 +
  47 +///【字段含义】播放器遭遇网络连接断开时 SDK 默认重试的次数,取值范围1 - 10,默认值:3。
  48 +@property(nonatomic, assign) int connectRetryCount;
  49 +
  50 +///【字段含义】网络重连的时间间隔,单位秒,取值范围3 - 30,默认值:3。
  51 +@property(nonatomic, assign) int connectRetryInterval;
  52 +
  53 +///【字段含义】是否开启回声消除, 默认值为 NO
  54 +@property(nonatomic, assign) BOOL enableAEC;
  55 +
  56 +///【字段含义】是否开启消息通道, 默认值为 NO
  57 +@property(nonatomic, assign) BOOL enableMessage;
  58 +
  59 +///【字段含义】是否开启 MetaData 数据回调,默认值为 NO。
  60 +/// YES:SDK 通过 EVT_PLAY_GET_METADATA 消息抛出视频流的 MetaData 数据;
  61 +/// NO:SDK 不抛出视频流的 MetaData 数据。
  62 +/// 标准直播流都会在最开始的阶段有一个 MetaData 数据头,该数据头支持定制。
  63 +/// 您可以通过 TXLivePushConfig 中的 metaData 属性设置一些自定义数据,再通过 TXLivePlayListener 中的
  64 +/// onPlayEvent(EVT_PLAY_GET_METADATA) 消息接收到这些数据。
  65 +///【特别说明】每条音视频流中只能设置一个 MetaData 数据头,除非断网重连,否则 TXLivePlayer 的 EVT_PLAY_GET_METADATA 消息也只会收到一次。
  66 +@property(nonatomic, assign) BOOL enableMetaData;
  67 +
  68 +///【字段含义】视频渲染对象回调的视频格式,默认值:kCVPixelFormatType_420YpCbCr8Planar
  69 +///【特别说明】支持:kCVPixelFormatType_420YpCbCr8Planar 和 kCVPixelFormatType_420YpCbCr8BiPlanarFullRange
  70 +@property(nonatomic, assign) OSType playerPixelFormatType;
  71 +
  72 +
  73 +/////////////////////////////////////////////////////////////////////////////////
  74 +//
  75 +// 待废弃设置项
  76 +//
  77 +/////////////////////////////////////////////////////////////////////////////////
  78 +
  79 +///【字段含义】是否开启就近选路,待废弃,默认值:YES
  80 +@property(nonatomic, assign) BOOL enableNearestIP;
  81 +
  82 +///【字段含义】RTMP 传输通道的类型,待废弃,默认值为:RTMP_CHANNEL_TYPE_AUTO
  83 +@property (nonatomic, assign) int rtmpChannelType;
  84 +
  85 +#if TARGET_OS_IPHONE
  86 +///【字段含义】视频缓存目录,点播 MP4、HLS 有效
  87 +@property NSString *cacheFolderPath;
  88 +///【字段含义】最多缓存文件个数,默认值:0
  89 +@property int maxCacheItems;
  90 +///【字段含义】自定义 HTTP Headers
  91 +@property NSDictionary *headers;
  92 +#endif
  93 +
  94 +@end
  95 +/// @}
  1 +/*
  2 + * Module: TXLivePlayListener @ TXLiteAVSDK
  3 + *
  4 + * Function: 腾讯云直播播放的回调通知
  5 + *
  6 + * Version: <:Version:>
  7 + */
  8 +
  9 +#import <Foundation/Foundation.h>
  10 +#import "TXLiveSDKTypeDef.h"
  11 +
  12 +/// @defgroup TXLivePlayListener_ios TXLivePlayListener
  13 +/// 腾讯云直播播放的回调通知
  14 +/// @{
  15 +@protocol TXLivePlayListener <NSObject>
  16 +
  17 +/**
  18 + * 直播事件通知
  19 + * @param EvtID 参见 TXLiveSDKEventDef.h
  20 + * @param param 参见 TXLiveSDKTypeDef.h
  21 + */
  22 +- (void)onPlayEvent:(int)EvtID withParam:(NSDictionary *)param;
  23 +
  24 +/**
  25 + * 网络状态通知
  26 + * @param param 参见 TXLiveSDKTypeDef.h
  27 + */
  28 +- (void)onNetStatus:(NSDictionary *)param;
  29 +
  30 +@end
  31 +/// @}
  1 +/*
  2 + *
  3 + * Module: TXLivePlayer @ TXLiteAVSDK
  4 + *
  5 + * Function: 腾讯云直播播放器
  6 + *
  7 + * Version: <:Version:>
  8 + */
  9 +
  10 +#import <Foundation/Foundation.h>
  11 +#import "TXLiveSDKTypeDef.h"
  12 +#import "TXLivePlayListener.h"
  13 +#import "TXLivePlayConfig.h"
  14 +#import "TXVideoCustomProcessDelegate.h"
  15 +#import "TXLiveRecordTypeDef.h"
  16 +#import "TXLiveRecordListener.h"
  17 +#import "TXAudioRawDataDelegate.h"
  18 +
  19 +/// @defgroup TXLivePlayer_ios TXLivePlayer
  20 +/// 腾讯云直播播放器接口类
  21 +/// @{
  22 +
  23 +/**
  24 + * 支持的直播和点播类型
  25 + *
  26 + * @note 新版本的点播 SDK,推荐参考 TXVodPlayer.h
  27 + */
  28 +typedef NS_ENUM(NSInteger, TX_Enum_PlayType) {
  29 + /// RTMP 直播
  30 + PLAY_TYPE_LIVE_RTMP = 0,
  31 + /// FLV 直播
  32 + PLAY_TYPE_LIVE_FLV = 1,
  33 +#if TARGET_OS_IPHONE
  34 + /// FLV 点播
  35 + PLAY_TYPE_VOD_FLV = 2,
  36 + /// HLS 点播
  37 + PLAY_TYPE_VOD_HLS = 3,
  38 + /// MP4点播
  39 + PLAY_TYPE_VOD_MP4 = 4,
  40 +#endif
  41 + /// RTMP 直播加速播放
  42 + PLAY_TYPE_LIVE_RTMP_ACC = 5,
  43 +#if TARGET_OS_IPHONE
  44 + /// 本地视频文件
  45 + PLAY_TYPE_LOCAL_VIDEO = 6,
  46 +#endif
  47 +};
  48 +
  49 +
  50 +/**
  51 + * 视频播放器
  52 + *
  53 + * 主要负责将直播流的音视频画面进行解码和本地渲染,包含如下技术特点:
  54 + * - 针对腾讯云的拉流地址,可使用低延时拉流,实现直播连麦等相关场景。
  55 + * - 针对腾讯云的拉流地址,可使用直播时移功能,能够实现直播观看与时移观看的无缝切换。
  56 + * - 支持自定义的音视频数据处理,让您可以根据项目需要处理直播流中的音视频数据后,进行渲染以及播放。
  57 + */
  58 +@interface TXLivePlayer : NSObject
  59 +
  60 +/////////////////////////////////////////////////////////////////////////////////
  61 +//
  62 +// (一)SDK 基础函数
  63 +//
  64 +/////////////////////////////////////////////////////////////////////////////////
  65 +
  66 +/// @name SDK 基础函数
  67 +/// @{
  68 +/**
  69 + * 1.1 设置播放回调,见 “TXLivePlayListener.h” 文件中的详细定义
  70 + */
  71 +@property(nonatomic, weak) id <TXLivePlayListener> delegate;
  72 +
  73 +/**
  74 + * 1.2 设置视频处理回调,见 “TXVideoCustomProcessDelegate.h” 文件中的详细定义
  75 + */
  76 +@property(nonatomic, weak) id <TXVideoCustomProcessDelegate> videoProcessDelegate;
  77 +
  78 +/**
  79 + * 1.3 设置音频处理回调,见 “TXAudioRawDataDelegate.h” 文件中的详细定义
  80 + */
  81 +@property(nonatomic, weak) id <TXAudioRawDataDelegate> audioRawDataDelegate;
  82 +
  83 +/**
  84 + * 1.4 是否开启硬件加速,默认值:NO
  85 + */
  86 +@property(nonatomic, assign) BOOL enableHWAcceleration;
  87 +
  88 +/**
  89 + * 1.5 设置 TXLivePlayConfig 播放配置项,见 “TXLivePlayConfig.h” 文件中的详细定义
  90 + */
  91 +@property(nonatomic, copy) TXLivePlayConfig *config;
  92 +
  93 +
  94 +#if TARGET_OS_IPHONE
  95 +/**
  96 + * 1.6 设置短视频录制回调,见 “TXLiveRecordListener.h” 文件中的详细定义
  97 + */
  98 +@property (nonatomic, weak) id<TXLiveRecordListener> recordDelegate;
  99 +
  100 +/**
  101 + * 1.7 startPlay 后是否立即播放,默认 YES,只有点播有效
  102 + */
  103 +@property BOOL isAutoPlay;
  104 +#endif
  105 +
  106 +/// @}
  107 +
  108 +/////////////////////////////////////////////////////////////////////////////////
  109 +//
  110 +// (二)播放基础接口
  111 +//
  112 +/////////////////////////////////////////////////////////////////////////////////
  113 +
  114 +/// @name 播放基础接口
  115 +/// @{
  116 +/**
  117 + * 2.1 创建 Video 渲染 View,该控件承载着视频内容的展示。
  118 + *
  119 + * 变更历史:1.5.2版本将参数 frame 废弃,设置此参数无效,控件大小与参数 view 的大小保持一致,如需修改控件的大小及位置,请调整父 view 的大小及位置。 参考文档:[绑定渲染界面](https://www.qcloud.com/doc/api/258/4736#step-3.3A-.E7.BB.91.E5.AE.9A.E6.B8.B2.E6.9F.93.E7.95.8C.E9.9D.A2)
  120 + *
  121 + * @param frame Widget 在父 view 中的 frame
  122 + * @param view 父 view
  123 + * @param idx Widget 在父 view 上 的层级位置
  124 + */
  125 +- (void)setupVideoWidget:(CGRect)frame containView:(TXView *)view insertIndex:(unsigned int)idx;
  126 +
  127 +/*
  128 + * 修改 VideoWidget frame
  129 + * 变更历史:1.5.2版本将此方法废弃,调用此方法无效,如需修改控件的大小及位置,请调整父 view 的大小及位置
  130 + * 参考文档:https://www.qcloud.com/doc/api/258/4736#step-3.3A-.E7.BB.91.E5.AE.9A.E6.B8.B2.E6.9F.93.E7.95.8C.E9.9D.A2
  131 + */
  132 +//- (void)resetVideoWidgetFrame:(CGRect)frame;
  133 +
  134 +/**
  135 + * 2.2 移除 Video 渲染 Widget
  136 + */
  137 +- (void)removeVideoWidget;
  138 +
  139 +/**
  140 + * 2.3 启动从指定 URL 播放 RTMP 音视频流
  141 + *
  142 + * @param url 完整的 URL(如果播放的是本地视频文件,这里传本地视频文件的完整路径)
  143 + * @param playType 播放类型
  144 + * @return 0表示成功,其它为失败
  145 + */
  146 +- (int)startPlay:(NSString *)url type:(TX_Enum_PlayType)playType;
  147 +
  148 +/**
  149 + * 2.4 停止播放音视频流
  150 + *
  151 + * @return 0:成功;其它:失败
  152 + */
  153 +- (int)stopPlay;
  154 +
  155 +/**
  156 + * 2.5 是否正在播放
  157 + *
  158 + * @return YES 拉流中,NO 没有拉流
  159 + */
  160 +- (BOOL)isPlaying;
  161 +
  162 +/**
  163 + * 2.6 暂停播放
  164 + *
  165 + * 适用于点播,直播(此接口会暂停数据拉流,不会销毁播放器,暂停后,播放器会显示最后一帧数据图像)
  166 + */
  167 +- (void)pause;
  168 +
  169 +/**
  170 + * 2.6 继续播放,适用于点播,直播
  171 + */
  172 +- (void)resume;
  173 +
  174 +/// @}
  175 +
  176 +/////////////////////////////////////////////////////////////////////////////////
  177 +//
  178 +// (三)视频相关接口
  179 +//
  180 +/////////////////////////////////////////////////////////////////////////////////
  181 +
  182 +/// @name 视频相关接口
  183 +/// @{
  184 +/**
  185 + * 3.1 设置画面的方向
  186 + *
  187 + * @param rotation 方向
  188 + * @see TX_Enum_Type_HomeOrientation
  189 + */
  190 +- (void)setRenderRotation:(TX_Enum_Type_HomeOrientation)rotation;
  191 +
  192 +/**
  193 + * 3.2 设置画面的裁剪模式
  194 + *
  195 + * @param renderMode 裁剪
  196 + * @see TX_Enum_Type_RenderMode
  197 + */
  198 +- (void)setRenderMode:(TX_Enum_Type_RenderMode)renderMode;
  199 +
  200 +#if TARGET_OS_IPHONE
  201 +/**
  202 + * 3.3 截屏
  203 + *
  204 + * @param snapshotCompletionBlock 通过回调返回当前图像
  205 + */
  206 +- (void)snapshot:(void (^)(TXImage *))snapshotCompletionBlock;
  207 +#endif
  208 +
  209 +/// @}
  210 +
  211 +/////////////////////////////////////////////////////////////////////////////////
  212 +//
  213 +// (四)音频相关接口
  214 +//
  215 +/////////////////////////////////////////////////////////////////////////////////
  216 +
  217 +/// @name 音频相关接口
  218 +/// @{
  219 +/**
  220 + * 4.1 设置静音
  221 + */
  222 +- (void)setMute:(BOOL)bEnable;
  223 +
  224 +/**
  225 + * 4.2 设置音量
  226 + *
  227 + * @param volume 音量大小,取值范围0 - 100
  228 + */
  229 +- (void)setVolume:(int)volume;
  230 +
  231 +#if TARGET_OS_IPHONE
  232 +/**
  233 + * 4.3 设置声音播放模式(切换扬声器,听筒)
  234 + * @param audioRoute 声音播放模式
  235 + */
  236 ++ (void)setAudioRoute:(TXAudioRouteType)audioRoute;
  237 +#endif
  238 +
  239 +/**
  240 + * 4.4 设置音量大小回调接口
  241 + *
  242 + * @param volumeEvaluationListener 音量大小回调接口,音量取值范围0 - 100
  243 + */
  244 +- (void)setAudioVolumeEvaluationListener:(void(^)(int))volumeEvaluationListener;
  245 +
  246 +/**
  247 + * 4.5 启用音量大小提示
  248 + *
  249 + * 开启后会在 volumeEvaluationListener 中获取到 SDK 对音量大小值的评估。
  250 + *
  251 + * @param interval 决定了 volumeEvaluationListener 回调的触发间隔,单位为ms,最小间隔为100ms,如果小于等于0则会关闭回调,建议设置为300ms;
  252 + */
  253 +- (void)enableAudioVolumeEvaluation:(NSUInteger)interval;
  254 +
  255 +/// @}
  256 +
  257 +/////////////////////////////////////////////////////////////////////////////////
  258 +//
  259 +// (五)直播时移相关接口
  260 +//
  261 +/////////////////////////////////////////////////////////////////////////////////
  262 +
  263 +/// @name 直播时移相关接口
  264 +/// @{
  265 +/**
  266 + * 5.1 直播时移准备,拉取该直播流的起始播放时间。
  267 + *
  268 + * 使用时移功能需在播放开始后调用此方法,否则时移失败。时移的使用请参考文档 [超级播放器](https://cloud.tencent.com/document/product/881/20208#.E6.97.B6.E7.A7.BB.E6.92.AD.E6.94.BE)
  269 + *
  270 + * @warning 非腾讯云直播地址不能时移
  271 + *
  272 + * @param domain 时移域名
  273 + * @param bizId 流 bizId
  274 + *
  275 + * @return 0:OK;-1:无播放地址;-2:appId 未配置
  276 + */
  277 +- (int)prepareLiveSeek:(NSString*)domain bizId:(NSInteger)bizId;
  278 +
  279 +/**
  280 + * 5.2 停止时移播放,返回直播
  281 + *
  282 + * @return 0:成功;其它:失败
  283 + */
  284 +- (int)resumeLive;
  285 +
  286 +#if TARGET_OS_IPHONE
  287 +/**
  288 + * 5.3 播放跳转到音视频流某个时间
  289 + * @param time 流时间,单位为秒
  290 + * @return 0:成功;其它:失败
  291 + */
  292 +- (int)seek:(float)time;
  293 +#endif
  294 +
  295 +/// @}
  296 +
  297 +/////////////////////////////////////////////////////////////////////////////////
  298 +//
  299 +// (六)视频录制相关接口
  300 +//
  301 +/////////////////////////////////////////////////////////////////////////////////
  302 +
  303 +/// @name 视频录制相关接口
  304 +/// @{
  305 +#if TARGET_OS_IPHONE
  306 +/**
  307 + * 6.1 开始录制短视频
  308 + *
  309 + * @param recordType 参见 TXRecordType 定义
  310 + * @return 0:成功;1:正在录制短视频;-2:videoRecorder 初始化失败。
  311 + */
  312 +- (int)startRecord:(TXRecordType)recordType;
  313 +
  314 +/**
  315 + * 6.2 结束录制短视频
  316 + *
  317 + * @return 0:成功;1:不存在录制任务;-2:videoRecorder 未初始化。
  318 + */
  319 +- (int)stopRecord;
  320 +
  321 +/**
  322 + * 6.3 设置播放速率
  323 + *
  324 + * @param rate 正常速度为1.0;小于为慢速;大于为快速。最大建议不超过2.0
  325 + */
  326 +- (void)setRate:(float)rate;
  327 +#endif
  328 +
  329 +/// @}
  330 +
  331 +/////////////////////////////////////////////////////////////////////////////////
  332 +//
  333 +// (七)更多实用接口
  334 +//
  335 +/////////////////////////////////////////////////////////////////////////////////
  336 +
  337 +/// @name 更多实用接口
  338 +/// @{
  339 +/**
  340 + * 7.1 设置状态浮层 view 在渲染 view 上的边距
  341 + *
  342 + * @param margin 边距
  343 + */
  344 +- (void)setLogViewMargin:(TXEdgeInsets)margin;
  345 +
  346 +/**
  347 + * 7.2 是否显示播放状态统计及事件消息浮层 view
  348 + *
  349 + * @param isShow 是否显示
  350 + */
  351 +- (void)showVideoDebugLog:(BOOL)isShow;
  352 +
  353 +/**
  354 + * 7.3 FLV 直播无缝切换
  355 + *
  356 + * @param playUrl 播放地址
  357 + * @return 0:成功;其它:失败
  358 + * @warning playUrl 必须是当前播放直播流的不同清晰度,切换到无关流地址可能会失败
  359 + */
  360 +- (int)switchStream:(NSString *)playUrl;
  361 +
  362 +/**
  363 + * 7.4 调用实验性 API 接口
  364 + *
  365 + * @note 该接口用于调用一些实验性功能
  366 + * @param jsonStr 接口及参数描述的 JSON 字符串
  367 + */
  368 +- (void)callExperimentalAPI:(NSString*)jsonStr;
  369 +
  370 +/// @}
  371 +
  372 +@end
  373 +/// @}
  1 +#import "TXLiveRecordTypeDef.h"
  2 +
  3 +
  4 +/**
  5 + * 短视频录制回调定义
  6 + */
  7 +@protocol TXLiveRecordListener <NSObject>
  8 +@optional
  9 +
  10 +/**
  11 + * 短视频录制进度
  12 + */
  13 +-(void) onRecordProgress:(NSInteger)milliSecond;
  14 +
  15 +/**
  16 + * 短视频录制完成
  17 + */
  18 +-(void) onRecordComplete:(TXRecordResult*)result;
  19 +
  20 +/**
  21 + * 短视频录制事件通知
  22 + */
  23 +-(void) onRecordEvent:(NSDictionary*)evt;
  24 +
  25 +@end
  26 +
  27 +
  1 +#import <Foundation/Foundation.h>
  2 +#import "TXLiveSDKTypeDef.h"
  3 +
  4 +/// PlayRecord 录制类型定义
  5 +typedef NS_ENUM(NSInteger, TXRecordType)
  6 +{
  7 + ///视频源为正在播放的视频流
  8 + RECORD_TYPE_STREAM_SOURCE = 1,
  9 +};
  10 +
  11 +
  12 +
  13 +/// 录制结果错误码定义
  14 +typedef NS_ENUM(NSInteger, TXRecordResultCode)
  15 +{
  16 + /// 录制成功(业务层主动结束录制)
  17 + RECORD_RESULT_OK = 0,
  18 + /// 录制成功(sdk自动结束录制,可能原因:1,app进入后台,2,app被闹钟或电话打断,3,网络断连接)
  19 + RECORD_RESULT_OK_INTERRUPT = 1,
  20 + /// 录制失败
  21 + RECORD_RESULT_FAILED = 1001,
  22 +};
  23 +
  24 +
  25 +/// 录制结果
  26 +@interface TXRecordResult : NSObject
  27 +/// 错误码
  28 +@property (nonatomic, assign) TXRecordResultCode retCode;
  29 +/// 错误描述信息
  30 +@property (nonatomic, strong) NSString* descMsg;
  31 +/// 视频文件path
  32 +@property (nonatomic, strong) NSString* videoPath;
  33 +/// 视频封面
  34 +@property (nonatomic, strong) TXImage* coverImage;
  35 +@end
  36 +
  1 +#ifndef __TX_LIVE_SDK_EVENT_DEF_H__
  2 +#define __TX_LIVE_SDK_EVENT_DEF_H__
  3 +
  4 +#include "TXLiteAVCode.h"
  5 +
  6 +enum EventID
  7 +{
  8 + /**********************************************************************************
  9 + * 推流事件列表
  10 + **********************************************************************************/
  11 + PUSH_EVT_CONNECT_SUCC = EVT_RTMP_PUSH_CONNECT_SUCC, ///< 直播: 已经连接RTMP推流服务器
  12 + PUSH_EVT_PUSH_BEGIN = EVT_RTMP_PUSH_BEGIN, ///< 直播: 已经与RTMP服务器握手完毕,开始推流
  13 + PUSH_EVT_OPEN_CAMERA_SUCC = EVT_CAMERA_START_SUCC, ///< 打开摄像头成功
  14 + PUSH_EVT_CHANGE_RESOLUTION = EVT_UP_CHANGE_RESOLUTION, ///< 推流动态调整分辨率
  15 + PUSH_EVT_CHANGE_BITRATE = EVT_UP_CHANGE_BITRATE, ///< 推流动态调整码率
  16 + PUSH_EVT_FIRST_FRAME_AVAILABLE = EVT_FIRST_FRAME_AVAILABLE, ///< 首帧画面采集完成
  17 + PUSH_EVT_START_VIDEO_ENCODER = EVT_START_VIDEO_ENCODER, ///< 编码器启动
  18 + PUSH_EVT_ROOM_IN = EVT_ROOM_ENTER, ///< 已经在webrtc房间里面,进房成功后通知
  19 + PUSH_EVT_ROOM_IN_FAILED = EVT_ROOM_ENTER_FAILED, ///< 进房失败通知
  20 + PUSH_EVT_ROOM_OUT = EVT_ROOM_EXIT, ///< 不在webrtc房间里面,进房失败或者中途退出房间时通知
  21 + PUSH_EVT_ROOM_USERLIST = EVT_ROOM_USERLIST, ///< 下发webrtc房间成员列表(不包括自己)
  22 + PUSH_EVT_ROOM_NEED_REENTER = EVT_ROOM_NEED_REENTER, ///< WiFi切换到4G会触发断线重连,此时需要重新进入webrtc房间(拉取最优的服务器地址)
  23 + PUSH_EVT_ROOM_USER_ENTER = EVT_ROOM_USER_ENTER, ///< 进房通知
  24 + PUSH_EVT_ROOM_USER_EXIT = EVT_ROOM_USER_EXIT, ///< 退房通知
  25 + PUSH_EVT_ROOM_USER_VIDEO_STATE = EVT_ROOM_USER_VIDEO_STATE, ///< 视频状态位变化通知
  26 + PUSH_EVT_ROOM_USER_AUDIO_STATE = EVT_ROOM_USER_AUDIO_STATE, ///< 音频状态位变化通知
  27 +
  28 + PUSH_ERR_OPEN_CAMERA_FAIL = ERR_CAMERA_START_FAIL, ///< 打开摄像头失败
  29 + PUSH_ERR_OPEN_MIC_FAIL = ERR_MIC_START_FAIL, ///< 打开麦克风失败
  30 + PUSH_ERR_VIDEO_ENCODE_FAIL = ERR_VIDEO_ENCODE_FAIL, ///< 视频编码失败
  31 + PUSH_ERR_AUDIO_ENCODE_FAIL = ERR_AUDIO_ENCODE_FAIL, ///< 音频编码失败
  32 + PUSH_ERR_UNSUPPORTED_RESOLUTION = ERR_UNSUPPORTED_RESOLUTION, ///< 不支持的视频分辨率
  33 + PUSH_ERR_UNSUPPORTED_SAMPLERATE = ERR_UNSUPPORTED_SAMPLERATE, ///< 不支持的音频采样率
  34 + PUSH_ERR_NET_DISCONNECT = ERR_RTMP_PUSH_NET_DISCONNECT, ///< 网络断连,且经多次重连抢救无效,可以放弃治疗,更多重试请自行重启推流
  35 + PUSH_ERR_AUDIO_SYSTEM_NOT_WORK = -1308, ///< 系统异常,录音失败
  36 + PUSH_ERR_INVALID_ADDRESS = ERR_RTMP_PUSH_INVALID_ADDRESS, ///< 推流地址非法
  37 +
  38 + PUSH_WARNING_NET_BUSY = WARNING_NET_BUSY, ///< 网络状况不佳:上行带宽太小,上传数据受阻
  39 + PUSH_WARNING_RECONNECT = WARNING_RTMP_SERVER_RECONNECT, ///< 网络断连, 已启动自动重连 (自动重连连续失败超过三次会放弃)
  40 + PUSH_WARNING_HW_ACCELERATION_FAIL = WARNING_HW_ENCODER_START_FAIL, ///< 硬编码启动失败,采用软编码
  41 + PUSH_WARNING_VIDEO_ENCODE_FAIL = 1104, ///< 视频编码失败,非致命错,内部会重启编码器
  42 + PUSH_WARNING_BEAUTYSURFACE_VIEW_INIT_FAIL = 1105, ///< 视频编码码率异常,警告
  43 + PUSH_WARNING_VIDEO_ENCODE_BITRATE_OVERFLOW = 1106, ///< 视频编码码率异常,警告
  44 + PUSH_WARNING_DNS_FAIL = WARNING_RTMP_DNS_FAIL, ///< RTMP -DNS解析失败
  45 + PUSH_WARNING_SEVER_CONN_FAIL = WARNING_RTMP_SEVER_CONN_FAIL, ///< RTMP服务器连接失败
  46 + PUSH_WARNING_SHAKE_FAIL = WARNING_RTMP_SHAKE_FAIL, ///< RTMP服务器握手失败
  47 + PUSH_WARNING_SERVER_DISCONNECT = WARNING_RTMP_SERVER_BREAK_CONNECT, ///< RTMP服务器主动断开,请检查推流地址的合法性或防盗链有效期
  48 + PUSH_WARNING_READ_WRITE_FAIL = WARNING_RTMP_READ_WRITE_FAIL, ///< RTMP 读/写失败,将会断开连接。
  49 +
  50 + /*内部事件*/INNER_EVT_SET_BITRATE_4_SCREEN_CAPTURE = 100001, ///< 动态设置录屏编码码率
  51 + /*内部事件*/INNER_EVT_BGM_PLAY_FINISH = 100002, ///< BGM播放完毕
  52 +
  53 +
  54 +
  55 + /**********************************************************************************
  56 + * 播放事件列表
  57 + **********************************************************************************/
  58 + PLAY_EVT_CONNECT_SUCC = EVT_PLAY_LIVE_STREAM_CONNECT_SUCC, ///< 直播,已经连接RTMP拉流服务器
  59 + PLAY_EVT_RTMP_STREAM_BEGIN = EVT_PLAY_LIVE_STREAM_BEGIN, ///< 直播,已经与RTMP服务器握手完毕,开始拉流
  60 + PLAY_EVT_RCV_FIRST_I_FRAME = EVT_RENDER_FIRST_I_FRAME, ///< 渲染首个视频数据包(IDR)
  61 + PLAY_EVT_PLAY_BEGIN = EVT_VIDEO_PLAY_BEGIN, ///< 视频播放开始
  62 + PLAY_EVT_PLAY_PROGRESS = EVT_VIDEO_PLAY_PROGRESS, ///< 视频播放进度
  63 + PLAY_EVT_PLAY_END = EVT_VIDEO_PLAY_END, ///< 视频播放结束
  64 + PLAY_EVT_PLAY_LOADING = EVT_VIDEO_PLAY_LOADING, ///< 视频播放loading
  65 + PLAY_EVT_START_VIDEO_DECODER = EVT_START_VIDEO_DECODER, ///< 解码器启动
  66 + PLAY_EVT_CHANGE_RESOLUTION = EVT_DOWN_CHANGE_RESOLUTION, ///< 视频分辨率改变
  67 + PLAY_EVT_GET_PLAYINFO_SUCC = EVT_GET_VODFILE_MEDIAINFO_SUCC, ///< 获取点播文件信息成功
  68 + PLAY_EVT_CHANGE_ROTATION = EVT_VIDEO_CHANGE_ROTATION, ///< MP4视频旋转角度
  69 + PLAY_EVT_GET_MESSAGE = EVT_PLAY_GET_MESSAGE, ///< 消息事件
  70 + PLAY_EVT_VOD_PLAY_PREPARED = EVT_VOD_PLAY_PREPARED, ///< 点播,视频加载完毕
  71 + PLAY_EVT_VOD_LOADING_END = EVT_VOD_PLAY_LOADING_END, ///< 点播,loading结束
  72 + PLAY_EVT_STREAM_SWITCH_SUCC = EVT_PLAY_LIVE_STREAM_SWITCH_SUCC, ///< 直播,切流成功(切流可以播放不同画面大小的视频)
  73 + PLAY_EVT_GET_METADATA = EVT_PLAY_GET_METADATA, ///< TXLivePlayer 接收到视频流中的 metadata 头信息(一条视频流仅触发一次)
  74 +
  75 +
  76 + PLAY_ERR_NET_DISCONNECT = ERR_PLAY_LIVE_STREAM_NET_DISCONNECT, ///< 直播,网络断连,且经多次重连抢救无效,可以放弃治疗,更多重试请自行重启播放
  77 +
  78 + PLAY_ERR_GET_RTMP_ACC_URL_FAIL = ERR_GET_RTMP_ACC_URL_FAIL, ///< 直播,获取加速拉流地址失败。这是由于您传给 liveplayer 的加速流地址中没有携带 txTime 和 txSecret 签名,或者是签名计算的不对。出现这个错误时,liveplayer 会放弃拉取加速流转而拉取 CDN 上的视频流,从而导致延迟很大。
  79 + PLAY_ERR_FILE_NOT_FOUND = ERR_FILE_NOT_FOUND, ///< 播放文件不存在
  80 + PLAY_ERR_HEVC_DECODE_FAIL = ERR_HEVC_DECODE_FAIL, ///< H265解码失败
  81 + PLAY_ERR_HLS_KEY = ERR_VOD_DECRYPT_FAIL, ///< HLS解码key获取失败
  82 + PLAY_ERR_GET_PLAYINFO_FAIL = ERR_GET_VODFILE_MEDIAINFO_FAIL, ///< 获取点播文件信息失败
  83 + PLAY_ERR_STREAM_SWITCH_FAIL = ERR_PLAY_LIVE_STREAM_SWITCH_FAIL, ///< 直播,切流失败(切流可以播放不同画面大小的视频)
  84 +
  85 + PLAY_WARNING_VIDEO_DECODE_FAIL = WARNING_VIDEO_FRAME_DECODE_FAIL, ///< 当前视频帧解码失败
  86 + PLAY_WARNING_AUDIO_DECODE_FAIL = WARNING_AUDIO_FRAME_DECODE_FAIL, ///< 当前音频帧解码失败
  87 + PLAY_WARNING_RECONNECT = WARNING_LIVE_STREAM_SERVER_RECONNECT, ///< 网络断连, 已启动自动重连 (自动重连连续失败超过三次会放弃)
  88 + PLAY_WARNING_RECV_DATA_LAG = WARNING_RECV_DATA_LAG, ///< 网络来包不稳:可能是下行带宽不足,或由于主播端出流不均匀
  89 + PLAY_WARNING_VIDEO_PLAY_LAG = WARNING_VIDEO_PLAY_LAG, ///< 当前视频播放出现卡顿(用户直观感受)
  90 + PLAY_WARNING_HW_ACCELERATION_FAIL = WARNING_HW_DECODER_START_FAIL, ///< 硬解启动失败,采用软解
  91 + PLAY_WARNING_VIDEO_DISCONTINUITY = 2107, ///< 当前视频帧不连续,可能丢帧
  92 + PLAY_WARNING_FIRST_IDR_HW_DECODE_FAIL = WARNING_VIDEO_DECODER_HW_TO_SW, ///< 当前流硬解第一个I帧失败,SDK自动切软解
  93 + PLAY_WARNING_DNS_FAIL = WARNING_RTMP_DNS_FAIL, ///< RTMP -DNS解析失败
  94 + PLAY_WARNING_SEVER_CONN_FAIL = WARNING_RTMP_SEVER_CONN_FAIL, ///< RTMP服务器连接失败
  95 + PLAY_WARNING_SHAKE_FAIL = WARNING_RTMP_SHAKE_FAIL, ///< RTMP服务器握手失败
  96 + PLAY_WARNING_SERVER_DISCONNECT = WARNING_RTMP_SERVER_BREAK_CONNECT, ///< RTMP服务器主动断开
  97 + PLAY_WARNING_READ_WRITE_FAIL = WARNING_RTMP_READ_WRITE_FAIL, ///< RTMP 读/写失败,将会断开连接。
  98 +
  99 + /*UGC*/UGC_WRITE_FILE_FAIL = 4001, ///< UGC写文件失败
  100 +};
  101 +
  102 +#endif // __TX_LIVE_SDK_TYPE_DEF_H__