wangguolei

3.1.4.10211533

Showing 29 changed files with 2996 additions and 447 deletions

Too many changes to show.

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

1 Pod::Spec.new do |s| 1 Pod::Spec.new do |s|
2 s.name = "HHVDoctorSDK" 2 s.name = "HHVDoctorSDK"
3 - s.version = "3.1.4.092217" 3 + s.version = "3.1.4.10211533"
4 s.summary = "和缓视频医生 SDK" 4 s.summary = "和缓视频医生 SDK"
5 5
6 s.description = <<-DESC 6 s.description = <<-DESC
This diff could not be displayed because it is too large.
This diff could not be displayed because it is too large.
  1 +/*
  2 +* Module: 网络音频包UDT自定义数据回调
  3 +*
  4 +* Function: 给客户回调发送前、接收后的 UDT 自定义数据
  5 +*
  6 +*/
  7 +#ifndef LITEAV_ITRTCAUDIOPACKETLISTENER_H
  8 +#define LITEAV_ITRTCAUDIOPACKETLISTENER_H
  9 +
  10 +#include <stdio.h>
  11 +#include "TXLiteAVBuffer.h"
  12 +
  13 +namespace liteav {
  14 + struct TRTCAudioPacket {
  15 + const char *userId;
  16 + liteav::TXLiteAVBuffer* extraData;
  17 + };
  18 +
  19 + class ITRTCAudioPacketListener {
  20 + public:
  21 + virtual ~ITRTCAudioPacketListener() {}
  22 + /*网络层接收到音频数据包*/
  23 + virtual bool onRecvAudioPacket(TRTCAudioPacket &data) { return false; }
  24 + /*网络层即将发送的音频数据包*/
  25 + virtual bool onSendAudioPacket(TRTCAudioPacket &data) { return false; }
  26 + };
  27 +}
  28 +
  29 +
  30 +#endif //LITEAV_ITRTCAUDIOPACKETLISTENER_H
This diff could not be displayed because it is too large.
This diff could not be displayed because it is too large.
1 -/* 1 +/**
2 * Module: TRTCCloudDelegate @ TXLiteAVSDK 2 * Module: TRTCCloudDelegate @ TXLiteAVSDK
3 - *  
4 - * Function: 腾讯云视频通话功能的事件回调接口  
5 - * 3 + * Function: 腾讯云实时音视频的事件回调接口
6 */ 4 */
7 - 5 +/// @defgroup TRTCCloudDelegate_ios TRTCCloudDelegate
  6 +/// 腾讯云实时音视频的事件回调接口
  7 +/// @{
8 #import <Foundation/Foundation.h> 8 #import <Foundation/Foundation.h>
9 #import "TRTCCloudDef.h" 9 #import "TRTCCloudDef.h"
10 #import "TXLiteAVCode.h" 10 #import "TXLiteAVCode.h"
@@ -14,58 +14,61 @@ NS_ASSUME_NONNULL_BEGIN @@ -14,58 +14,61 @@ NS_ASSUME_NONNULL_BEGIN
14 @class TRTCCloud; 14 @class TRTCCloud;
15 @class TRTCStatistics; 15 @class TRTCStatistics;
16 16
17 -  
18 -/// @defgroup TRTCCloudDelegate_ios TRTCCloudDelegate  
19 -/// 腾讯云视频通话功能的事件回调接口  
20 -/// @{  
21 @protocol TRTCCloudDelegate <NSObject> 17 @protocol TRTCCloudDelegate <NSObject>
22 @optional 18 @optional
23 19
24 ///////////////////////////////////////////////////////////////////////////////// 20 /////////////////////////////////////////////////////////////////////////////////
25 // 21 //
26 -// (一)错误事件和警告事件 22 +// 错误和警告事件
27 // 23 //
28 ///////////////////////////////////////////////////////////////////////////////// 24 /////////////////////////////////////////////////////////////////////////////////
29 -/// @name 错误事件和警告事件 25 +/// @name 错误和警告事件
30 /// @{ 26 /// @{
  27 +
31 /** 28 /**
32 - * 1.1 错误回调:SDK 不可恢复的错误,一定要监听,并分情况给用户适当的界面提示。 29 + * 1.1 错误事件回调
  30 + *
  31 + * 错误事件,表示 SDK 抛出的不可恢复的错误,比如进入房间失败或设备开启失败等。
  32 + * 参考文档:[错误码表](https://cloud.tencent.com/document/product/647/32257)
33 * 33 *
34 * @param errCode 错误码 34 * @param errCode 错误码
35 * @param errMsg 错误信息 35 * @param errMsg 错误信息
36 * @param extInfo 扩展信息字段,个别错误码可能会带额外的信息帮助定位问题 36 * @param extInfo 扩展信息字段,个别错误码可能会带额外的信息帮助定位问题
37 */ 37 */
38 -- (void)onError:(TXLiteAVError)errCode errMsg:(nullable NSString *)errMsg extInfo:(nullable NSDictionary*)extInfo; 38 +- (void)onError:(TXLiteAVError)errCode errMsg:(nullable NSString *)errMsg extInfo:(nullable NSDictionary *)extInfo;
39 39
40 /** 40 /**
41 - * 1.2 警告回调:用于告知您一些非严重性问题,例如出现了卡顿或者可恢复的解码失败。 41 + * 1.2 警告事件回调
  42 + *
  43 + * 警告事件,表示 SDK 抛出的提示性问题,比如视频出现卡顿或 CPU 使用率太高等。
  44 + * 参考文档:[错误码表](https://cloud.tencent.com/document/product/647/32257)
42 * 45 *
43 * @param warningCode 警告码 46 * @param warningCode 警告码
44 * @param warningMsg 警告信息 47 * @param warningMsg 警告信息
45 * @param extInfo 扩展信息字段,个别警告码可能会带额外的信息帮助定位问题 48 * @param extInfo 扩展信息字段,个别警告码可能会带额外的信息帮助定位问题
46 */ 49 */
47 -- (void)onWarning:(TXLiteAVWarning)warningCode warningMsg:(nullable NSString *)warningMsg extInfo:(nullable NSDictionary*)extInfo; 50 +- (void)onWarning:(TXLiteAVWarning)warningCode warningMsg:(nullable NSString *)warningMsg extInfo:(nullable NSDictionary *)extInfo;
48 51
49 /// @} 52 /// @}
50 -  
51 ///////////////////////////////////////////////////////////////////////////////// 53 /////////////////////////////////////////////////////////////////////////////////
52 // 54 //
53 -// (二)房间事件回调 55 +// 房间相关事件回调
54 // 56 //
55 ///////////////////////////////////////////////////////////////////////////////// 57 /////////////////////////////////////////////////////////////////////////////////
56 -/// @name 房间事件回调 58 +/// @name 房间相关事件回调
57 /// @{ 59 /// @{
  60 +
58 /** 61 /**
59 - * 2.1 已加入房间的回调  
60 - *  
61 - * 调用 TRTCCloud 中的 enterRoom() 接口执行进房操作后,会收到来自 SDK 的 onEnterRoom(result) 回调: 62 + * 2.1 进入房间成功与否的事件回调
62 * 63 *
63 - * - 如果加入成功,result 会是一个正数(result > 0),代表加入房间的时间消耗,单位是毫秒(ms)。  
64 - * - 如果加入失败,result 会是一个负数(result < 0),代表进房失败的错误码。  
65 - * 进房失败的错误码含义请参见[错误码](https://cloud.tencent.com/document/product/647/32257)。 64 + * 调用 TRTCCloud 中的 enterRoom() 接口执行进房操作后,会收到来自 TRTCCloudDelegate 的 onEnterRoom(result) 回调:
  65 + * - 如果加入成功,回调 result 会是一个正数(result > 0),代表进入房间所消耗的时间,单位是毫秒(ms)。
  66 + * - 如果加入失败,回调 result 会是一个负数(result < 0),代表失败原因的错误码。
  67 + * 进房失败的错误码含义请参见[错误码表](https://cloud.tencent.com/document/product/647/32257)。
66 * 68 *
67 - * @note 在 Ver6.6 之前的版本,只有进房成功会抛出 onEnterRoom(result) 回调,进房失败由 onError() 回调抛出。  
68 - * 在 Ver6.6 及之后改为:进房成功返回正的 result,进房失败返回负的 result,同时进房失败也会有 onError() 回调抛出。 69 + * @note
  70 + * 1. 在 Ver6.6 之前的版本,只有进房成功会抛出 onEnterRoom(result) 回调,进房失败由 onError() 回调抛出。
  71 + * 2. 在 Ver6.6 之后的版本:无论进房成功或失败,均会抛出 onEnterRoom(result) 回调,同时进房失败也会有 onError() 回调抛出。
69 * 72 *
70 * @param result result > 0 时为进房耗时(ms),result < 0 时为进房错误码。 73 * @param result result > 0 时为进房耗时(ms),result < 0 时为进房错误码。
71 */ 74 */
@@ -75,12 +78,12 @@ NS_ASSUME_NONNULL_BEGIN @@ -75,12 +78,12 @@ NS_ASSUME_NONNULL_BEGIN
75 * 2.2 离开房间的事件回调 78 * 2.2 离开房间的事件回调
76 * 79 *
77 * 调用 TRTCCloud 中的 exitRoom() 接口会执行退出房间的相关逻辑,例如释放音视频设备资源和编解码器资源等。 80 * 调用 TRTCCloud 中的 exitRoom() 接口会执行退出房间的相关逻辑,例如释放音视频设备资源和编解码器资源等。
78 - * 待资源释放完毕,SDK 会通过 onExitRoom() 回调通知到您。 81 + * 待 SDK 占用的所有资源释放完毕后,SDK 会抛出 onExitRoom() 回调通知到您。
79 * 82 *
80 - * 如果您要再次调用 enterRoom() 或者切换到其他的音视频 SDK,请等待 onExitRoom() 回调到来之后再执行相关操作。  
81 - * 否则可能会遇到音频设备(例如 iOS 里的 AudioSession)被占用等各种异常问题。 83 + * 如果您要再次调用 enterRoom() 或者切换到其他的音视频 SDK,请等待 onExitRoom() 回调到来后再执行相关操作。
  84 + * 否则可能会遇到例如摄像头、麦克风设备被强占等各种异常问题。
82 * 85 *
83 - * @param reason 离开房间原因,0:主动调用 exitRoom 退;1:被服务器踢出当前房间;2:当前房间整个被解散。 86 + * @param reason 离开房间原因,0:主动调用 exitRoom 退出房间;1:被服务器踢出当前房间;2:当前房间整个被解散。
84 */ 87 */
85 - (void)onExitRoom:(NSInteger)reason; 88 - (void)onExitRoom:(NSInteger)reason;
86 89
@@ -96,285 +99,370 @@ NS_ASSUME_NONNULL_BEGIN @@ -96,285 +99,370 @@ NS_ASSUME_NONNULL_BEGIN
96 - (void)onSwitchRole:(TXLiteAVError)errCode errMsg:(nullable NSString *)errMsg; 99 - (void)onSwitchRole:(TXLiteAVError)errCode errMsg:(nullable NSString *)errMsg;
97 100
98 /** 101 /**
99 - * 2.4 请求跨房通话(主播 PK)的结果回调 102 + * 2.4 切换房间的结果回调
  103 + *
  104 + * 调用 TRTCCloud 中的 switchRoom() 接口可以让用户快速地从一个房间切换到另一个房间,
  105 + * 待 SDK 切换完成后,会抛出 onSwitchRoom() 事件回调。
  106 + *
  107 + * @param errCode 错误码,ERR_NULL 代表切换成功,其他请参见[错误码](https://cloud.tencent.com/document/product/647/32257)。
  108 + * @param errMsg 错误信息。
  109 + */
  110 +- (void)onSwitchRoom:(TXLiteAVError)errCode errMsg:(nullable NSString *)errMsg;
  111 +
  112 +/**
  113 + * 2.5 请求跨房通话的结果回调
100 * 114 *
101 * 调用 TRTCCloud 中的 connectOtherRoom() 接口会将两个不同房间中的主播拉通视频通话,也就是所谓的“主播PK”功能。 115 * 调用 TRTCCloud 中的 connectOtherRoom() 接口会将两个不同房间中的主播拉通视频通话,也就是所谓的“主播PK”功能。
102 * 调用者会收到 onConnectOtherRoom() 回调来获知跨房通话是否成功, 116 * 调用者会收到 onConnectOtherRoom() 回调来获知跨房通话是否成功,
103 - * 如果成功,两个房间中的所有用户都会收到 PK 主播的 onUserVideoAvailable() 回调。 117 + * 如果成功,两个房间中的所有用户都会收到来自另一个房间中的 PK 主播的 onUserVideoAvailable() 回调。
104 * 118 *
105 - * @param userId 要 PK 的目标主播 userid 119 + * @param userId 要跨房通话的另一个房间中的主播的用户 ID
106 * @param errCode 错误码,ERR_NULL 代表切换成功,其他请参见[错误码](https://cloud.tencent.com/document/product/647/32257)。 120 * @param errCode 错误码,ERR_NULL 代表切换成功,其他请参见[错误码](https://cloud.tencent.com/document/product/647/32257)。
107 * @param errMsg 错误信息。 121 * @param errMsg 错误信息。
108 */ 122 */
109 -- (void)onConnectOtherRoom:(NSString*)userId errCode:(TXLiteAVError)errCode errMsg:(nullable NSString *)errMsg; 123 +- (void)onConnectOtherRoom:(NSString *)userId errCode:(TXLiteAVError)errCode errMsg:(nullable NSString *)errMsg;
110 124
111 /** 125 /**
112 - * 2.5 结束跨房通话(主播 PK)的结果回调 126 + * 2.6 结束跨房通话的结果回调
113 */ 127 */
114 - (void)onDisconnectOtherRoom:(TXLiteAVError)errCode errMsg:(nullable NSString *)errMsg; 128 - (void)onDisconnectOtherRoom:(TXLiteAVError)errCode errMsg:(nullable NSString *)errMsg;
115 129
116 /// @} 130 /// @}
117 -  
118 ///////////////////////////////////////////////////////////////////////////////// 131 /////////////////////////////////////////////////////////////////////////////////
119 // 132 //
120 -// (三)成员事件回调 133 +// 用户相关事件回调
121 // 134 //
122 ///////////////////////////////////////////////////////////////////////////////// 135 /////////////////////////////////////////////////////////////////////////////////
123 -/// @name 成员事件回调 136 +/// @name 用户相关事件回调
124 /// @{ 137 /// @{
125 138
126 /** 139 /**
127 * 3.1 有用户加入当前房间 140 * 3.1 有用户加入当前房间
128 * 141 *
129 - * 出于性能方面的考虑,在两种不同的应用场景下,该通知的行为会有差别:  
130 - * - 通话场景(TRTCAppSceneVideoCall 和 TRTCAppSceneAudioCall):该场景下用户没有角色的区别,任何用户进入房间都会触发该通知。  
131 - * - 直播场景(TRTCAppSceneLIVE 和 TRTCAppSceneVoiceChatRoom):该场景不限制观众的数量,如果任何用户进出都抛出回调会引起很大的性能损耗,所以该场景下只有主播进入房间时才会触发该通知,观众进入房间不会触发该通知。  
132 - * 142 + * 出于性能方面的考虑,在 TRTC 两种不同的应用场景(即 AppScene,在 enterRoom 时通过第二个参数指定)下,该通知的行为会有差别:
  143 + * - 直播类场景(TRTCAppSceneLIVE 和 TRTCAppSceneVoiceChatRoom):该场景下的用户区分主播和观众两种角色,只有主播进入房间时才会触发该通知,观众进入房间时不会触发该通知。
  144 + * - 通话类场景(TRTCAppSceneVideoCall 和 TRTCAppSceneAudioCall):该场景下的用户没有角色的区分(可认为都是主播),任何用户进入房间都会触发该通知。
133 * 145 *
134 - * @note 注意 onRemoteUserEnterRoom 和 onRemoteUserLeaveRoom 只适用于维护当前房间里的“成员列表”,如果需要显示远程画面,建议使用监听 onUserVideoAvailable() 事件回调。  
135 - *  
136 - * @param userId 用户标识 146 + * @note
  147 + * 1. 事件回调 onRemoteUserEnterRoom 和 onRemoteUserLeaveRoom 只适用于维护当前房间里的“用户列表”,有此事件回调不代表一定有视频画面。
  148 + * 2. 如果需要显示远程画面,请监听代表某个用户是否有视频画面的 onUserVideoAvailable() 事件回调。
  149 + * @param userId 远端用户的用户标识
137 */ 150 */
138 - (void)onRemoteUserEnterRoom:(NSString *)userId; 151 - (void)onRemoteUserEnterRoom:(NSString *)userId;
139 152
140 /** 153 /**
141 * 3.2 有用户离开当前房间 154 * 3.2 有用户离开当前房间
142 * 155 *
143 - * 与 onRemoteUserEnterRoom 相对应,在两种不同的应用场景下,该通知的行为会有差别:  
144 - * - 通话场景(TRTCAppSceneVideoCall 和 TRTCAppSceneAudioCall):该场景下用户没有角色的区别,任何用户的离开都会触发该通知。  
145 - * - 直播场景(TRTCAppSceneLIVE 和 TRTCAppSceneVoiceChatRoom):只有主播离开房间时才会触发该通知,观众离开房间不会触发该通知。 156 + * 与 onRemoteUserEnterRoom 相对应,在两种不同的应用场景(即 AppScene,在 enterRoom 时通过第二个参数指定)下,该通知的行为会有差别:
  157 + * - 直播类场景(TRTCAppSceneLIVE 和 TRTCAppSceneVoiceChatRoom):只有主播离开房间时才会触发该通知,观众离开房间不会触发该通知。
  158 + * - 通话类场景(TRTCAppSceneVideoCall 和 TRTCAppSceneAudioCall):该场景下用户没有角色的区别,任何用户的离开都会触发该通知。
146 * 159 *
147 - * @param userId 用户标识 160 + * @param userId 远端用户的用户标识
148 * @param reason 离开原因,0表示用户主动退出房间,1表示用户超时退出,2表示被踢出房间。 161 * @param reason 离开原因,0表示用户主动退出房间,1表示用户超时退出,2表示被踢出房间。
149 */ 162 */
150 - (void)onRemoteUserLeaveRoom:(NSString *)userId reason:(NSInteger)reason; 163 - (void)onRemoteUserLeaveRoom:(NSString *)userId reason:(NSInteger)reason;
151 164
152 /** 165 /**
153 - * 3.3 用户是否开启摄像头视频 166 + * 3.3 某远端用户发布/取消了主路视频画面
154 * 167 *
155 - * 当您收到 onUserVideoAvailable(userid, YES) 通知时,表示该路画面已经有可用的视频数据帧到达。  
156 - * 此时,您需要调用 startRemoteView(userid) 接口加载该用户的远程画面。  
157 - * 然后,您会收到名为 onFirstVideoFrame(userid) 的首帧画面渲染回调。 168 + * “主路画面”一般被用于承载摄像头画面。当您收到 onUserVideoAvailable(userId, true) 通知时,表示该路画面已经有可播放的视频帧到达。
  169 + * 此时,您需要调用 {@link startRemoteView} 接口订阅该用户的远程画面,订阅成功后,您会继续收到该用户的首帧画面渲染回调 onFirstVideoFrame(userid)。
158 * 170 *
159 - * 当您收到 onUserVideoAvailable(userid, NO) 通知时,表示该路远程画面已被关闭,  
160 - * 可能由于该用户调用了 muteLocalVideo() 或 stopLocalPreview()。 171 + * 当您收到 onUserVideoAvailable(userId, false) 通知时,表示该路远程画面已经被关闭,关闭的原因可能是该用户调用了 {@link muteLocalVideo} 或 {@link stopLocalPreview}。
161 * 172 *
162 - * @param userId 用户标识  
163 - * @param available 画面是否开启 173 + * @param userId 远端用户的用户标识
  174 + * @param available 该用户是否发布(或取消发布)了主路视频画面,true: 发布;false:取消发布。
164 */ 175 */
165 - (void)onUserVideoAvailable:(NSString *)userId available:(BOOL)available; 176 - (void)onUserVideoAvailable:(NSString *)userId available:(BOOL)available;
166 177
167 /** 178 /**
168 - * 3.4 用户是否开启屏幕分享 179 + * 3.4 某远端用户发布/取消了辅路视频画面
169 * 180 *
170 - * @note 显示辅路画面使用的函数是 startRemoteSubStreamView() 而非 startRemoteView()。  
171 - * @param userId 用户标识  
172 - * @param available 屏幕分享是否开启 181 + * “辅路画面”一般被用于承载屏幕分享的画面。当您收到 onUserSubStreamAvailable(userId, true) 通知时,表示该路画面已经有可播放的视频帧到达。
  182 + * 此时,您需要调用 {@link startRemoteSubStreamView} 接口订阅该用户的远程画面,订阅成功后,您会继续收到该用户的首帧画面渲染回调 onFirstVideoFrame(userid)。
  183 + *
  184 + * @note 显示辅路画面使用的函数是 {@link startRemoteSubStreamView} 而非 {@link startRemoteView}。
  185 + *
  186 + * @param userId 远端用户的用户标识
  187 + * @param available 该用户是否发布(或取消发布)了辅路视频画面,true: 发布;false:取消发布。
173 */ 188 */
174 - (void)onUserSubStreamAvailable:(NSString *)userId available:(BOOL)available; 189 - (void)onUserSubStreamAvailable:(NSString *)userId available:(BOOL)available;
175 190
176 /** 191 /**
177 - * 3.5 用户是否开启音频上行 192 + * 3.5 某远端用户发布/取消了自己的音频
178 * 193 *
179 - * @param userId 用户标识  
180 - * @param available 声音是否开启 194 + * 当您收到 onUserAudioAvailable(userId, true) 通知时,表示该用户发布了自己的声音,此时 SDK 的表现为:
  195 + * - 在自动订阅模式下,您无需做任何操作,SDK 会自动播放该用户的声音。
  196 + * - 在手动订阅模式下,您可以通过 {@link muteRemoteAudio}(userid, false) 来播放该用户的声音。
  197 + *
  198 + * @note SDK 默认使用自动订阅模式,您可以通过 {@link setDefaultStreamRecvMode} 设置为手动订阅,但需要在您进入房间之前调用才生效。
  199 + *
  200 + * @param userId 远端用户的用户标识
  201 + * @param available 该用户是否发布(或取消发布)了自己的音频,true: 发布;false:取消发布。
181 */ 202 */
182 - (void)onUserAudioAvailable:(NSString *)userId available:(BOOL)available; 203 - (void)onUserAudioAvailable:(NSString *)userId available:(BOOL)available;
183 204
184 /** 205 /**
185 - * 3.6 开始渲染本地或远程用户的首帧画面 206 + * 3.6 SDK 开始渲染自己本地或远端用户的首帧画面
186 * 207 *
187 - * 如果 userId == nil,代表开始渲染本地采集的摄像头画面,需要您先调用 startLocalPreview 触发。  
188 - * 如果 userId != nil,代表开始渲染远程用户的首帧画面,需要您先调用 startRemoteView 触发。 208 + * SDK 会在渲染自己本地或远端用户的首帧画面时抛出该事件,您可以通过回调事件中的 userId 参数来判断事件来自于“本地”还是来自于“远端”。
  209 + * - 如果 userId 为空值,代表 SDK 已经开始渲染自己本地的视频画面,不过前提是您已经调用了 {@link startLocalPreview} 或 {@link startScreenCapture}。
  210 + * - 如果 userId 不为空,代表 SDK 已经开始渲染远端用户的视频画面,不过前提是您已经调用了 {@link startRemoteView} 订阅了该用户的视频画面。
189 * 211 *
190 - * @note 只有当您调用 startLocalPreivew()、startRemoteView() 或 startRemoteSubStreamView() 之后,才会触发该回调。 212 + * @note
  213 + * 1. 只有当您调用了 {@link startLocalPreview} 或 {@link startScreenCapture} 之后,才会触发自己本地的首帧画面事件回调。
  214 + * 2. 只有当您调用了 {@link startRemoteView} 或 {@link startRemoteSubStreamView} 之后,才会触发远端用户的首帧画面事件回调。
191 * 215 *
192 - * @param userId 本地或远程用户 ID,如果 userId == nil 代表本地,userId != nil 代表远程。  
193 - * @param streamType 视频流类型:摄像头或屏幕分享。  
194 - * @param width 画面宽度  
195 - * @param height 画面高度 216 + * @param userId 本地或远端的用户标识,如果 userId 为空值代表自己本地的首帧画面已到来,userId 不为空则代表远端用户的首帧画面已到来。
  217 + * @param streamType 视频流类型:主路(Main)一般用于承载摄像头画面,辅路(Sub)一般用于承载屏幕分享画面。
  218 + * @param width 画面的宽度。
  219 + * @param height 画面的高度。
196 */ 220 */
197 -- (void)onFirstVideoFrame:(NSString*)userId streamType:(TRTCVideoStreamType)streamType width:(int)width height:(int)height; 221 +- (void)onFirstVideoFrame:(NSString *)userId streamType:(TRTCVideoStreamType)streamType width:(int)width height:(int)height;
198 222
199 /** 223 /**
200 - * 3.7 开始播放远程用户的首帧音频(本地声音暂不通知) 224 + * 3.7 SDK 开始播放远端用户的首帧音频
  225 + *
  226 + * SDK 会在播放远端用户的首帧音频时抛出该事件,本地音频的首帧事件暂不抛出。
201 * 227 *
202 - * @param userId 远程用户 ID。 228 + * @param userId 远端用户的用户标识
203 */ 229 */
204 -- (void)onFirstAudioFrame:(NSString*)userId; 230 +- (void)onFirstAudioFrame:(NSString *)userId;
205 231
206 /** 232 /**
207 - * 3.8 首帧本地视频数据已经被送出 233 + * 3.8 自己本地的首个视频帧已被发布出去
208 * 234 *
209 - * SDK 会在 enterRoom() 并 startLocalPreview() 成功后开始摄像头采集,并将采集到的画面进行编码。  
210 - * 当 SDK 成功向云端送出第一帧视频数据后,会抛出这个回调事件。 235 + * 当您成功进入房间并通过 {@link startLocalPreview} 或 {@link startScreenCapture} 开启本地视频采集之后(开启采集和进入房间的先后顺序无影响),
  236 + * SDK 就会开始进行视频编码,并通过自身的网络模块向云端发布自己本地的视频数据。
  237 + * 当 SDK 成功地向云端送出自己的第一帧视频数据帧以后,就会抛出 onSendFirstLocalVideoFrame 事件回调。
211 * 238 *
212 - * @param streamType 视频流类型,主画面、小画面或辅流画面(屏幕分享) 239 + * @param streamType 视频流类型:主路(Main)一般用于承载摄像头画面,辅路(Sub)一般用于承载屏幕分享画面。
213 */ 240 */
214 -- (void)onSendFirstLocalVideoFrame: (TRTCVideoStreamType)streamType; 241 +- (void)onSendFirstLocalVideoFrame:(TRTCVideoStreamType)streamType;
215 242
216 /** 243 /**
217 - * 3.9 首帧本地音频数据已经被送出 244 + * 3.9 自己本地的首个音频帧已被发布出去
218 * 245 *
219 - * SDK 会在 enterRoom() 并 startLocalAudio() 成功后开始麦克风采集,并将采集到的声音进行编码。  
220 - * 当 SDK 成功向云端送出第一帧音频数据后,会抛出这个回调事件。 246 + * 当您成功进入房间并通过 {@link startLocalAudio} 开启本地音频采集之后(开启采集和进入房间的先后顺序无影响),
  247 + * SDK 就会开始进行音频编码,并通过自身的网络模块向云端发布自己本地的音频数据。
  248 + * 当 SDK 成功地向云端送出自己的第一帧音频数据帧以后,就会抛出 onSendFirstLocalAudioFrame 事件回调。
221 */ 249 */
222 - (void)onSendFirstLocalAudioFrame; 250 - (void)onSendFirstLocalAudioFrame;
223 251
224 /** 252 /**
225 - * 3.10 废弃接口:有主播加入当前房间  
226 - *  
227 - * 该回调接口可以被看作是 onRemoteUserEnterRoom 的废弃版本,不推荐使用。请使用 onUserVideoAvailable 或 onRemoteUserEnterRoom 进行替代。  
228 - *  
229 - * @note 该接口已被废弃,不推荐使用 253 + * 3.10 远端视频状态变化的事件回调
230 * 254 *
  255 + * 您可以通过此事件回调获取远端每一路画面的播放状态(包括 Playing、Loading 和 Stopped 三种状态),从而进行相应的 UI 展示。
231 * @param userId 用户标识 256 * @param userId 用户标识
  257 + * @param streamType 视频流类型:主路(Main)一般用于承载摄像头画面,辅路(Sub)一般用于承载屏幕分享画面。
  258 + * @param status 视频状态:包括 Playing、Loading 和 Stopped 三种状态。
  259 + * @param reason 视频状态改变的原因
  260 + * @param extrainfo 额外信息
232 */ 261 */
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; 262 +- (void)onRemoteVideoStatusUpdated:(NSString *)userId streamType:(TRTCVideoStreamType)streamType streamStatus:(TRTCAVStatusType)status reason:(TRTCAVStatusChangeReason)reason extrainfo:(nullable NSDictionary *)info;
246 263
247 /// @} 264 /// @}
248 -  
249 ///////////////////////////////////////////////////////////////////////////////// 265 /////////////////////////////////////////////////////////////////////////////////
250 // 266 //
251 -// (四)统计和质量回调 267 +// 网络和技术指标统计回调
252 // 268 //
253 ///////////////////////////////////////////////////////////////////////////////// 269 /////////////////////////////////////////////////////////////////////////////////
254 -  
255 -/// @name 统计和质量回调 270 +/// @name 网络和技术指标统计回调
256 /// @{ 271 /// @{
257 272
258 /** 273 /**
259 - * 4.1 网络质量:该回调每2秒触发一次,统计当前网络的上行和下行质量 274 + * 4.1 网络质量的实时统计回调
  275 + *
  276 + * 该统计回调每间隔2秒抛出一次,用于通知 SDK 感知到的当前网络的上行和下行质量。
  277 + * SDK 会使用一组内嵌的自研算法对当前网络的延迟高低、带宽大小以及稳定情况进行评估,并计算出一个的评估结果:
  278 + * 如果评估结果为 1(Excellent) 代表当前的网络情况非常好,如果评估结果为 6(Down)代表当前网络无法支撑 TRTC 的正常通话。
260 * 279 *
261 - * @note userId == nil 代表自己当前的视频质量 280 + * @note 回调参数 localQuality 和 remoteQuality 中的 userId 如果为空置,代表本组数据统计的是自己本地的网络质量,否则是代表远端用户的网络质量。
262 * 281 *
263 * @param localQuality 上行网络质量 282 * @param localQuality 上行网络质量
264 * @param remoteQuality 下行网络质量 283 * @param remoteQuality 下行网络质量
265 */ 284 */
266 -- (void)onNetworkQuality: (TRTCQualityInfo*)localQuality remoteQuality:(NSArray<TRTCQualityInfo*>*)remoteQuality; 285 +- (void)onNetworkQuality:(TRTCQualityInfo *)localQuality remoteQuality:(NSArray<TRTCQualityInfo *> *)remoteQuality;
267 286
268 /** 287 /**
269 - * 4.2 技术指标统计回调 288 + * 4.2 音视频技术指标的实时统计回调
270 * 289 *
271 - * 如果您是熟悉音视频领域相关术语,可以通过这个回调获取 SDK 的所有技术指标。  
272 - * 如果您是首次开发音视频相关项目,可以只关注 onNetworkQuality 回调。 290 + * 该统计回调每间隔2秒抛出一次,用于通知 SDK 内部音频、视频以及网络相关的专业技术指标,这些信息在 {@link TRTCStatistics} 均有罗列:
  291 + * - 视频统计信息:视频的分辨率(resolution)、帧率(FPS)和比特率(bitrate)等信息。
  292 + * - 音频统计信息:音频的采样率(samplerate)、声道(channel)和比特率(bitrate)等信息。
  293 + * - 网络统计信息:SDK 和云端一次往返(SDK => Cloud => SDK)的网络耗时(rtt)、丢包率(loss)、上行流量(sentBytes)和下行流量(receivedBytes)等信息。
273 * 294 *
274 - * @param statistics 统计数据,包括本地和远程的  
275 - * @note 每2秒回调一次 295 + * @note 如果您只需要获知当前网络质量的好坏,并不需要花太多时间研究本统计回调,更推荐您使用 {@link onNetworkQuality} 来解决问题。
  296 + * @param statistics 统计数据,包括自己本地的统计信息和远端用户的统计信息,详情请参考 {@link TRTCStatistics}。
276 */ 297 */
277 -- (void)onStatistics: (TRTCStatistics *)statistics; 298 +- (void)onStatistics:(TRTCStatistics *)statistics;
278 299
279 /// @} 300 /// @}
280 -  
281 ///////////////////////////////////////////////////////////////////////////////// 301 /////////////////////////////////////////////////////////////////////////////////
282 // 302 //
283 -// (五)服务器事件回调 303 +// 与云端连接情况的事件回调
284 // 304 //
285 ///////////////////////////////////////////////////////////////////////////////// 305 /////////////////////////////////////////////////////////////////////////////////
286 -  
287 -/// @name 服务器事件回调 306 +/// @name 与云端连接情况的事件回调
288 /// @{ 307 /// @{
289 308
290 /** 309 /**
291 - * 5.1 SDK 跟服务器的连接断开 310 + * 5.1 SDK 与云端的连接已经断开
  311 + *
  312 + * SDK 会在跟云端的连接断开时抛出此事件回调,导致断开的原因大多是网络不可用或者网络切换所致,比如用户在通话中走进电梯时就可能会遇到此事件。
  313 + * 在抛出此事件之后,SDK 会努力跟云端重新建立连接,重连过程中会抛出 {@link onTryToReconnect},连接恢复后会抛出 {@link onConnectionRecovery} 。
  314 + * 所以,SDK 会在如下三个连接相关的事件中按如下规律切换:
  315 + * <pre>
  316 + * [onConnectionLost] =====> [onTryToReconnect] =====> [onConnectionRecovery]
  317 + * /|\ |
  318 + * |------------------------------------------------------|
  319 + * </pre>
292 */ 320 */
293 - (void)onConnectionLost; 321 - (void)onConnectionLost;
294 322
295 /** 323 /**
296 - * 5.2 SDK 尝试重新连接到服务器 324 + * 5.2 SDK 正在尝试重新连接到云端
  325 + *
  326 + * SDK 会在跟云端的连接断开时抛出 {@link onConnectionLost},之后会努力跟云端重新建立连接并抛出本事件,连接恢复后会抛出 {@link onConnectionRecovery}。
297 */ 327 */
298 - (void)onTryToReconnect; 328 - (void)onTryToReconnect;
299 329
300 /** 330 /**
301 - * 5.3 SDK 跟服务器的连接恢复 331 + * 5.3 SDK 与云端的连接已经恢复
  332 + *
  333 + * SDK 会在跟云端的连接断开时抛出 {@link onConnectionLost},之后会努力跟云端重新建立连接并抛出{@link onTryToReconnect},连接恢复后会抛出本事件回调。
302 */ 334 */
303 - (void)onConnectionRecovery; 335 - (void)onConnectionRecovery;
304 336
305 /// @} 337 /// @}
306 -  
307 ///////////////////////////////////////////////////////////////////////////////// 338 /////////////////////////////////////////////////////////////////////////////////
308 // 339 //
309 -// (六)硬件设备事件回调 340 +// 硬件设备相关事件回调
310 // 341 //
311 ///////////////////////////////////////////////////////////////////////////////// 342 /////////////////////////////////////////////////////////////////////////////////
312 -  
313 -/// @name 硬件设备事件回调 343 +/// @name 硬件设备相关事件回调
314 /// @{ 344 /// @{
315 345
316 /** 346 /**
317 * 6.1 摄像头准备就绪 347 * 6.1 摄像头准备就绪
  348 + *
  349 + * 当您调用 {@link startLocalPreivew} 之后,SDK 会尝试启动摄像头,如果摄像头能够启动成功就会抛出本事件。
  350 + * 如果启动失败,大概率是因为当前应用没有获得访问摄像头的权限,或者摄像头当前正在被其他程序独占使用中。
  351 + * 您可以通过捕获 {@link onError} 事件回调获知这些异常情况并通过 UI 界面提示用户。
318 */ 352 */
319 - (void)onCameraDidReady; 353 - (void)onCameraDidReady;
320 354
321 /** 355 /**
322 * 6.2 麦克风准备就绪 356 * 6.2 麦克风准备就绪
  357 + *
  358 + * 当您调用 {@link startLocalAudio} 之后,SDK 会尝试启动麦克风,如果麦克风能够启动成功就会抛出本事件。
  359 + * 如果启动失败,大概率是因为当前应用没有获得访问麦克风的权限,或者麦克风当前正在被其他程序独占使用中。
  360 + * 您可以通过捕获 {@link onError} 事件回调获知这些异常情况并通过 UI 界面提示用户。
323 */ 361 */
324 - (void)onMicDidReady; 362 - (void)onMicDidReady;
325 363
326 -#if TARGET_OS_IPHONE  
327 /** 364 /**
328 - * 6.3 音频路由发生变化(仅 iOS),音频路由即声音由哪里输出(扬声器、听筒) 365 + * 6.3 当前音频路由发生变化(仅适用于移动设备)
  366 + *
  367 + * 所谓“音频路由”,是指声音是从手机的扬声器还是从听筒中播放出来,音频路由变化也就是声音的播放位置发生了变化。
  368 + * - 当音频路由为听筒时,声音比较小,只有将耳朵凑近才能听清楚,隐私性较好,适合用于接听电话。
  369 + * - 当音频路由为扬声器时,声音比较大,不用将手机贴脸也能听清,因此可以实现“免提”的功能。
329 * 370 *
330 - * @param route 当前音频路由  
331 - * @param fromRoute 变更前的音频路由 371 + * @param route 音频路由,即声音由哪里输出(扬声器、听筒)。
  372 + * @param fromRoute 变更前的音频路由。
332 */ 373 */
  374 +#if TARGET_OS_IPHONE
333 - (void)onAudioRouteChanged:(TRTCAudioRoute)route fromRoute:(TRTCAudioRoute)fromRoute; 375 - (void)onAudioRouteChanged:(TRTCAudioRoute)route fromRoute:(TRTCAudioRoute)fromRoute;
334 #endif 376 #endif
335 377
336 /** 378 /**
337 - * 6.4 用于提示音量大小的回调,包括每个 userId 的音量和远端总音量 379 + * 6.4 音量大小的反馈回调
338 * 380 *
339 - * 您可以通过调用 TRTCCloud 中的 enableAudioVolumeEvaluation 接口来开关这个回调或者设置它的触发间隔。  
340 - * 需要注意的是,调用 enableAudioVolumeEvaluation 开启音量回调后,无论频道内是否有人说话,都会按设置的时间间隔调用这个回调;  
341 - * 如果没有人说话,则 userVolumes 为空,totalVolume 为0。 381 + * SDK 可以评估每一路音频的音量大小,并每隔一段时间抛出该事件回调,您可以根据音量大小在 UI 上做出相应的提示,比如“波形图”或“音量槽”。
  382 + * 要完成这个功能, 您需要先调用 {@link enableAudioVolumeEvaluation} 开启这个能力并设定事件抛出的时间间隔。
  383 + * 需要补充说明的是,无论当前房间中是否有人说话,SDK 都会按照您设定的时间间隔定时抛出此事件回调,只不过当没有人说话时,userVolumes 为空,totalVolume 为 0。
342 * 384 *
343 - * @param userVolumes 所有正在说话的房间成员的音量,取值范围0 - 100。  
344 - * @param totalVolume 所有远端成员的总音量, 取值范围0 - 100。  
345 - * @note userId 为 nil 时表示自己的音量,userVolumes 内仅包含正在说话(音量不为0)的用户音量信息。 385 + * @note userVolumes 为一个数组,对于数组中的每一个元素,当 userId 为空时表示本地麦克风采集的音量大小,当 userId 不为空时代表远端用户的音量大小。
  386 + *
  387 + * @param userVolumes 是一个数组,用于承载所有正在说话的用户的音量大小,取值范围 0 - 100。
  388 + * @param totalVolume 所有远端用户的总音量大小, 取值范围 0 - 100。
346 */ 389 */
347 - (void)onUserVoiceVolume:(NSArray<TRTCVolumeInfo *> *)userVolumes totalVolume:(NSInteger)totalVolume; 390 - (void)onUserVoiceVolume:(NSArray<TRTCVolumeInfo *> *)userVolumes totalVolume:(NSInteger)totalVolume;
348 391
349 -  
350 -#if !TARGET_OS_IPHONE && TARGET_OS_MAC  
351 /** 392 /**
352 - * 6.5 本地设备通断回调 393 + * 6.5 本地设备的通断状态发生变化(仅适用于桌面系统)
  394 + *
  395 + * 当本地设备(包括摄像头、麦克风以及扬声器)被插入或者拔出时,SDK 便会抛出此事件回调。
353 * 396 *
354 * @param deviceId 设备 ID 397 * @param deviceId 设备 ID
355 * @param deviceType 设备类型 398 * @param deviceType 设备类型
356 - * @param state 0:设备断开;1:设备连接 399 + * @param state 通断状态,0:设备断开;1:设备连接。
357 */ 400 */
  401 +#if !TARGET_OS_IPHONE && TARGET_OS_MAC
358 - (void)onDevice:(NSString *)deviceId type:(TRTCMediaDeviceType)deviceType stateChanged:(NSInteger)state; 402 - (void)onDevice:(NSString *)deviceId type:(TRTCMediaDeviceType)deviceType stateChanged:(NSInteger)state;
  403 +#endif
359 404
  405 +/**
  406 + * 6.6 当前麦克风的系统采集音量发生变化
  407 + *
  408 + * 在 Mac 或 Windows 这样的桌面操作系统上,用户可以在设置中心找到声音相关的设置面板,并设置麦克风的采集音量大小。
  409 + * 用户将麦克风的采集音量设置得越大,麦克风采集到的声音的原始音量也就会越大,反之就会越小。
  410 + * 在有些型号的键盘以及笔记本电脑上,用户还可以通过按下“禁用麦克风”按钮(图标是一个话筒上上叠加了一道代表禁用的斜线)来将麦克风静音。
  411 + *
  412 + * 当用户通过系统设置界面或者通过键盘上的快捷键设定操作系统的麦克风采集音量时,SDK 便会抛出此事件。
  413 + *
  414 + * @note 您需要调用 {@link enableAudioVolumeEvaluation} 接口并设定(interval>0)开启次事件回调,设定(interval == 0)关闭此事件回调。
  415 + *
  416 + * @param volume 系统采集音量,取值范围 0 - 100,用户可以在系统的声音设置面板上进行拖拽调整。
  417 + * @param muted 麦克风是否被用户禁用了:true 被禁用,false 被启用。
  418 + */
  419 +#if !TARGET_OS_IPHONE && TARGET_OS_MAC
  420 +- (void)onAudioDeviceCaptureVolumeChanged:(NSInteger)volume muted:(BOOL)muted;
360 #endif 421 #endif
361 422
362 -/// @} 423 +/**
  424 + * 6.7 当前系统的播放音量发生变化
  425 + *
  426 + * 在 Mac 或 Windows 这样的桌面操作系统上,用户可以在设置中心找到声音相关的设置面板,并设置系统的播放音量大小。
  427 + * 在有些型号的键盘以及笔记本电脑上,用户还可以通过按下“静音”按钮(图标是一个喇叭上叠加了一道代表禁用的斜线)来将系统静音。
  428 + *
  429 + * 当用户通过系统设置界面或者通过键盘上的快捷键设定操作系统的播放音量时,SDK 便会抛出此事件。
  430 + *
  431 + * @note 您需要调用 {@link enableAudioVolumeEvaluation} 接口并设定(interval>0)开启次事件回调,设定(interval == 0)关闭此事件回调。
  432 + *
  433 + * @param volume 系统播放音量,取值范围 0 - 100,用户可以在系统的声音设置面板上进行拖拽调整。
  434 + * @param muted 系统是否被用户静音了:true 被静音,false 已恢复。
  435 + */
  436 +#if !TARGET_OS_IPHONE && TARGET_OS_MAC
  437 +- (void)onAudioDevicePlayoutVolumeChanged:(NSInteger)volume muted:(BOOL)muted;
  438 +#endif
363 439
  440 +/**
  441 + * 6.8 系统声音采集是否被成功开启的事件回调(仅适用于 Mac 系统)
  442 + *
  443 + * 在 Mac 系统上,您可以通过调用 {@link startSystemAudioLoopback} 为当前系统安装一个音频驱动,并让 SDK 通过该音频驱动捕获当前 Mac 系统播放出的声音。
  444 + * 当用于播片教学或音乐直播中,比如老师端可以使用此功能,让 SDK 能够采集老师所播放的电影中的声音,使同房间的学生端也能听到电影中的声音。
  445 + * SDK 会将统声音采集是否被成功开启的结果,通过本事件回调抛出,需要您关注参数中的错误码。
  446 + *
  447 + * @param err ERR_NULL 表示成功,其余值表示失败。
  448 + */
  449 +#if !TARGET_OS_IPHONE && TARGET_OS_MAC
  450 +- (void)onSystemAudioLoopbackError:(TXLiteAVError)err;
  451 +#endif
364 452
  453 +/// @}
365 ///////////////////////////////////////////////////////////////////////////////// 454 /////////////////////////////////////////////////////////////////////////////////
366 // 455 //
367 -// (七)自定义消息的接收回调 456 +// 自定义消息的接收事件回调
368 // 457 //
369 ///////////////////////////////////////////////////////////////////////////////// 458 /////////////////////////////////////////////////////////////////////////////////
370 -  
371 -/// @name 自定义消息的接收回调 459 +/// @name 自定义消息的接收事件回调
372 /// @{ 460 /// @{
373 461
374 /** 462 /**
375 - * 7.1 收到自定义消息回调 463 + * 7.1 收到自定义消息的事件回调
376 * 464 *
377 - * 当房间中的某个用户使用 sendCustomCmdMsg 发送自定义消息时,房间中的其它用户可以通过 onRecvCustomCmdMsg 接口接收消息 465 + * 当房间中的某个用户使用 {@link sendCustomCmdMsg} 发送自定义 UDP 消息时,房间中的其它用户可以通过 onRecvCustomCmdMsg 事件回调接收到该条消息。
378 * 466 *
379 * @param userId 用户标识 467 * @param userId 用户标识
380 * @param cmdID 命令 ID 468 * @param cmdID 命令 ID
@@ -384,9 +472,9 @@ NS_ASSUME_NONNULL_BEGIN @@ -384,9 +472,9 @@ NS_ASSUME_NONNULL_BEGIN
384 - (void)onRecvCustomCmdMsgUserId:(NSString *)userId cmdID:(NSInteger)cmdID seq:(UInt32)seq message:(NSData *)message; 472 - (void)onRecvCustomCmdMsgUserId:(NSString *)userId cmdID:(NSInteger)cmdID seq:(UInt32)seq message:(NSData *)message;
385 473
386 /** 474 /**
387 - * 7.2 自定义消息丢失回调 475 + * 7.2 自定义消息丢失的事件回调
388 * 476 *
389 - * 实时音视频使用 UDP 通道,即使设置了可靠传输(reliable),也无法确保100@%不丢失,只是丢消息概率极低,能满足常规可靠性要求。 477 + * 当您使用 {@link sendCustomCmdMsg} 发送自定义 UDP 消息时,即使设置了可靠传输(reliable),也无法确保100@%不丢失,只是丢消息概率极低,能满足常规可靠性要求。
390 * 在发送端设置了可靠运输(reliable)后,SDK 都会通过此回调通知过去时间段内(通常为5s)传输途中丢失的自定义消息数量统计信息。 478 * 在发送端设置了可靠运输(reliable)后,SDK 都会通过此回调通知过去时间段内(通常为5s)传输途中丢失的自定义消息数量统计信息。
391 * 479 *
392 * @note 只有在发送端设置了可靠传输(reliable),接收方才能收到消息的丢失回调 480 * @note 只有在发送端设置了可靠传输(reliable),接收方才能收到消息的丢失回调
@@ -400,212 +488,395 @@ NS_ASSUME_NONNULL_BEGIN @@ -400,212 +488,395 @@ NS_ASSUME_NONNULL_BEGIN
400 /** 488 /**
401 * 7.3 收到 SEI 消息的回调 489 * 7.3 收到 SEI 消息的回调
402 * 490 *
403 - * 当房间中的某个用户使用 sendSEIMsg 发送数据时,房间中的其它用户可以通过 onRecvSEIMsg 接口接收数据 491 + * 当房间中的某个用户使用 {@link sendSEIMsg} 借助视频数据帧发送 SEI 消息时,房间中的其它用户可以通过 onRecvSEIMsg 事件回调接收到该条消息
404 * 492 *
405 * @param userId 用户标识 493 * @param userId 用户标识
406 * @param message 数据 494 * @param message 数据
407 */ 495 */
408 -- (void)onRecvSEIMsg:(NSString *)userId message:(NSData*)message; 496 +- (void)onRecvSEIMsg:(NSString *)userId message:(NSData *)message;
409 497
410 /// @} 498 /// @}
411 -  
412 ///////////////////////////////////////////////////////////////////////////////// 499 /////////////////////////////////////////////////////////////////////////////////
413 // 500 //
414 -// (八)CDN 旁路回调 501 +// CDN 相关事件回调
415 // 502 //
416 ///////////////////////////////////////////////////////////////////////////////// 503 /////////////////////////////////////////////////////////////////////////////////
417 -/// @name CDN 旁路转推回调 504 +/// @name CDN 相关事件回调
418 /// @{ 505 /// @{
419 506
420 /** 507 /**
421 - * 8.1 开始向腾讯云的直播 CDN 推流的回调,对应于 TRTCCloud 中的 startPublishing() 接口 508 + * 8.1 开始向腾讯云直播 CDN 上发布音视频流的事件回调
  509 + *
  510 + * 当您调用 {@link startPublishing} 开始向腾讯云直播 CDN 上发布音视频流时,SDK 会立刻将这一指令同步给云端服务器。
  511 + * 随后 SDK 会收到来自云端服务器的处理结果,并将指令的执行结果通过本事件回调通知给您。
422 * 512 *
423 * @param err 0表示成功,其余值表示失败 513 * @param err 0表示成功,其余值表示失败
424 * @param errMsg 具体错误原因 514 * @param errMsg 具体错误原因
425 */ 515 */
426 -- (void)onStartPublishing:(int)err errMsg:(NSString*)errMsg; 516 +- (void)onStartPublishing:(int)err errMsg:(NSString *)errMsg;
427 517
428 /** 518 /**
429 - * 8.2 停止向腾讯云的直播 CDN 推流的回调,对应于 TRTCCloud 中的 stopPublishing() 接口 519 + * 8.2 停止向腾讯云直播 CDN 上发布音视频流的事件回调
  520 + *
  521 + * 当您调用 {@link stopPublishing} 停止向腾讯云直播 CDN 上发布音视频流时,SDK 会立刻将这一指令同步给云端服务器。
  522 + * 随后 SDK 会收到来自云端服务器的处理结果,并将指令的执行结果通过本事件回调通知给您。
430 * 523 *
431 * @param err 0表示成功,其余值表示失败 524 * @param err 0表示成功,其余值表示失败
432 * @param errMsg 具体错误原因 525 * @param errMsg 具体错误原因
433 */ 526 */
434 -- (void)onStopPublishing:(int)err errMsg:(NSString*)errMsg; 527 +- (void)onStopPublishing:(int)err errMsg:(NSString *)errMsg;
435 528
436 /** 529 /**
437 - * 8.3 启动旁路推流到 CDN 完成的回调 530 + * 8.3 开始向非腾讯云 CDN 上发布音视频流的事件回调
438 * 531 *
439 - * 对应于 TRTCCloud 中的 startPublishCDNStream() 接口 532 + * 当您调用 {@link startPublishCDNStream} 开始向非腾讯云直播 CDN 上发布音视频流时,SDK 会立刻将这一指令同步给云端服务器。
  533 + * 随后 SDK 会收到来自云端服务器的处理结果,并将指令的执行结果通过本事件回调通知给您。
440 * 534 *
441 - * @note Start 回调如果成功,只能说明转推请求已经成功告知给腾讯云,如果目标 CDN 有异常,还是有可能会转推失败。 535 + * @note 当您收到成功的事件回调时,只是说明您的发布指令已经同步到腾讯云后台服务器,但如果目标 CDN 厂商的服务器不接收该条视频流,依然可能导致发布失败。
  536 + * @param err 0表示成功,其余值表示失败
  537 + * @param errMsg 具体错误原因
442 */ 538 */
443 - (void)onStartPublishCDNStream:(int)err errMsg:(NSString *)errMsg; 539 - (void)onStartPublishCDNStream:(int)err errMsg:(NSString *)errMsg;
444 540
445 /** 541 /**
446 - * 8.4 停止旁路推流到 CDN 完成的回调 542 + * 8.4 停止向非腾讯云 CDN 上发布音视频流的事件回调
447 * 543 *
448 - * 对应于 TRTCCloud 中的 stopPublishCDNStream() 接口 544 + * 当您调用 {@link stopPublishCDNStream} 开始向非腾讯云直播 CDN 上发布音视频流时,SDK 会立刻将这一指令同步给云端服务器。
  545 + * 随后 SDK 会收到来自云端服务器的处理结果,并将指令的执行结果通过本事件回调通知给您。
449 * 546 *
  547 + * @param err 0表示成功,其余值表示失败
  548 + * @param errMsg 具体错误原因
450 */ 549 */
451 - (void)onStopPublishCDNStream:(int)err errMsg:(NSString *)errMsg; 550 - (void)onStopPublishCDNStream:(int)err errMsg:(NSString *)errMsg;
452 551
453 /** 552 /**
454 - * 8.5 设置云端的混流转码参数的回调,对应于 TRTCCloud 中的 setMixTranscodingConfig() 接口 553 + * 8.5 设置云端混流的排版布局和转码参数的事件回调
455 * 554 *
456 - * @param err 0表示成功,其余值表示失败  
457 - * @param errMsg 具体错误原因 555 + * 当您调用 {@link setMixTranscodingConfig} 调整云端混流的排版布局和转码参数时,SDK 会立刻将这一调整指令同步给云端服务器。
  556 + * 随后 SDK 会收到来自云端服务器的处理结果,并将指令的执行结果通过本事件回调通知给您。
  557 + *
  558 + * @param err 错误码:0表示成功,其余值表示失败。
  559 + * @param errMsg 具体的错误原因。
458 */ 560 */
459 -- (void)onSetMixTranscodingConfig:(int)err errMsg:(NSString*)errMsg; 561 +- (void)onSetMixTranscodingConfig:(int)err errMsg:(NSString *)errMsg;
460 562
461 /// @} 563 /// @}
462 -  
463 ///////////////////////////////////////////////////////////////////////////////// 564 /////////////////////////////////////////////////////////////////////////////////
464 // 565 //
465 -// (九)音效回调 566 +// 屏幕分享相关事件回调
466 // 567 //
467 ///////////////////////////////////////////////////////////////////////////////// 568 /////////////////////////////////////////////////////////////////////////////////
468 -/// @name 音效回调 569 +/// @name 屏幕分享相关事件回调
469 /// @{ 570 /// @{
  571 +
  572 +/**
  573 + * 9.1 屏幕分享开启的事件回调
  574 + *
  575 + * 当您通过 {@link startScreenCapture} 等相关接口启动屏幕分享时,SDK 便会抛出此事件回调。
  576 + */
  577 +- (void)onScreenCaptureStarted;
  578 +
  579 +/**
  580 + * 9.2 屏幕分享暂停的事件回调
  581 + *
  582 + * 当您通过 {@link pauseScreenCapture} 暂停屏幕分享时,SDK 便会抛出此事件回调。
  583 + * @param reason 原因。
  584 + * - 0:用户主动暂停。
  585 + * - 1:注意此字段的含义在 MAC 和 Windows 平台有稍微差异。屏幕窗口不可见暂停(Mac)。表示设置屏幕分享参数导致的暂停(Windows)。
  586 + * - 2:表示屏幕分享窗口被最小化导致的暂停(仅 Windows)。
  587 + * - 3:表示屏幕分享窗口被隐藏导致的暂停(仅 Windows)。
  588 + */
  589 +- (void)onScreenCapturePaused:(int)reason;
  590 +
470 /** 591 /**
471 - * 播放音效结束回调 592 + * 9.3 屏幕分享恢复的事件回调
472 * 593 *
473 - * @param effectId 音效 ID  
474 - * @param code 0表示播放正常结束;其他表示异常结束 594 + * 当您通过 {@link resumeScreenCapture} 恢复屏幕分享时,SDK 便会抛出此事件回调。
  595 + * @param reason 恢复原因。
  596 + * - 0:用户主动恢复。
  597 + * - 1:注意此字段的含义在 MAC 和 Windows 平台有稍微差异。屏幕窗口恢复可见从而恢复分享(Mac)。屏幕分享参数设置完毕后自动恢复(Windows)
  598 + * - 2:表示屏幕分享窗口从最小化被恢复(仅 Windows)。
  599 + * - 3:表示屏幕分享窗口从隐藏被恢复(仅 Windows)。
475 */ 600 */
476 -- (void)onAudioEffectFinished:(int) effectId code:(int) code; 601 +- (void)onScreenCaptureResumed:(int)reason;
  602 +
  603 +/**
  604 + * 9.4 屏幕分享停止的事件回调
  605 + *
  606 + * 当您通过 {@link stopScreenCapture} 停止屏幕分享时,SDK 便会抛出此事件回调。
  607 + * @param reason 停止原因,0:用户主动停止;1:屏幕窗口关闭导致停止;2:表示屏幕分享的显示屏状态变更(如接口被拔出、投影模式变更等)。
  608 + */
  609 +- (void)onScreenCaptureStoped:(int)reason;
  610 +
477 /// @} 611 /// @}
478 ///////////////////////////////////////////////////////////////////////////////// 612 /////////////////////////////////////////////////////////////////////////////////
479 // 613 //
480 -// (十)屏幕分享回调 614 +// 本地录制和本地截图的事件回调
481 // 615 //
482 ///////////////////////////////////////////////////////////////////////////////// 616 /////////////////////////////////////////////////////////////////////////////////
483 -  
484 -/// @name 屏幕分享回调 617 +/// @name 本地录制和本地截图的事件回调
485 /// @{ 618 /// @{
  619 +
486 /** 620 /**
487 - * 10.1 当屏幕分享开始时,SDK 会通过此回调通知 621 + * 10.1 本地录制任务已经开始的事件回调
  622 + *
  623 + * 当您调用 {@link startLocalRecording} 启动本地媒体录制任务时,SDK 会抛出该事件回调,用于通知您录制任务是否已经顺利启动。
  624 + * @param errCode 错误码 0:初始化录制成功;-1:初始化录制失败;-2: 文件后缀名有误。
  625 + * @param storagePath 录制文件存储路径
488 */ 626 */
489 -- (void)onScreenCaptureStarted; 627 +- (void)onLocalRecordBegin:(NSInteger)errCode storagePath:(NSString *)storagePath;
490 628
491 /** 629 /**
492 - * 10.2 当屏幕分享暂停时,SDK 会通过此回调通知 630 + * 10.2 本地录制任务正在进行中的进展事件回调
  631 + *
  632 + * 当您调用 {@link startLocalRecording} 成功启动本地媒体录制任务后,SDK 变会定时地抛出本事件回调。
  633 + * 您可通过捕获该事件回调来获知录制任务的健康状况。
  634 + * 您可以在 {@link startLocalRecording} 时设定本事件回调的抛出间隔。
493 * 635 *
494 - * @param reason 原因,0:用户主动暂停;1:屏幕窗口不可见暂停 636 + * @param duration 已经录制的累计时长,单位毫秒
  637 + * @param storagePath 录制文件存储路径
495 */ 638 */
496 -- (void)onScreenCapturePaused:(int)reason; 639 +- (void)onLocalRecording:(NSInteger)duration storagePath:(NSString *)storagePath;
497 640
498 /** 641 /**
499 - * 10.3 当屏幕分享恢复时,SDK 会通过此回调通知 642 + * 10.3 本地录制任务已经结束的事件回调
500 * 643 *
501 - * @param reason 恢复原因,0:用户主动恢复;1:屏幕窗口恢复可见从而恢复分享 644 + * 当您调用 {@link stopLocalRecording} 停止本地媒体录制任务时,SDK 会抛出该事件回调,用于通知您录制任务的最终结果。
  645 + * @param errCode 错误码 0:录制成功;-1:录制失败;-2:切换分辨率或横竖屏导致录制结束。
  646 + * @param storagePath 录制文件存储路径
502 */ 647 */
503 -- (void)onScreenCaptureResumed:(int)reason; 648 +- (void)onLocalRecordComplete:(NSInteger)errCode storagePath:(NSString *)storagePath;
  649 +
  650 +/// @}
  651 +/////////////////////////////////////////////////////////////////////////////////
  652 +//
  653 +// 废弃的事件回调(建议使用对应的新回调)
  654 +//
  655 +/////////////////////////////////////////////////////////////////////////////////
  656 +/// @name 废弃的事件回调(建议使用对应的新回调)
  657 +/// @{
504 658
505 /** 659 /**
506 - * 10.4 当屏幕分享停止时,SDK 会通过此回调通知 660 + * 有主播加入当前房间(已废弃)
507 * 661 *
508 - * @param reason 停止原因,0:用户主动停止;1:屏幕窗口关闭导致停止 662 + * @deprecated 新版本开始不推荐使用,建议使用 {@link onRemoteUserEnterRoom} 替代之。
509 */ 663 */
510 -- (void)onScreenCaptureStoped:(int)reason;  
511 -/// @}  
512 -@end 664 +- (void)onUserEnter:(NSString *)userId __attribute__((deprecated("use onRemoteUserLeaveRoom instead")));
  665 +
  666 +/**
  667 + * 有主播离开当前房间(已废弃)
  668 + *
  669 + * @deprecated 新版本开始不推荐使用,建议使用 {@link onRemoteUserLeaveRoom} 替代之。
  670 + */
  671 +- (void)onUserExit:(NSString *)userId reason:(NSInteger)reason __attribute__((deprecated("use onRemoteUserLeaveRoom instead")));
  672 +
  673 +/**
  674 + * 音效播放已结束(已废弃)
  675 + *
  676 + * @deprecated 新版本开始不推荐使用,建议使用 {@link ITXAudioEffectManager} 接口替代之。
  677 + * 新的接口中不再区分背景音乐和音效,而是统一用 {@link startPlayMusic} 取代之。
  678 + */
  679 +- (void)onAudioEffectFinished:(int)effectId code:(int)code __attribute__((deprecated("use ITXAudioEffectManager.startPlayMusic instead")));
  680 +
513 /// @} 681 /// @}
  682 +@end // End of class TRTCCloudDelegate
514 683
515 ///////////////////////////////////////////////////////////////////////////////// 684 /////////////////////////////////////////////////////////////////////////////////
516 // 685 //
517 -// (十一)自定义视频渲染回调 686 +// 视频数据自定义回调
518 // 687 //
519 ///////////////////////////////////////////////////////////////////////////////// 688 /////////////////////////////////////////////////////////////////////////////////
520 -#pragma mark - TRTCVideoRenderDelegate  
521 -/// @addtogroup TRTCCloudDelegate_ios 689 +/// @name 视频数据自定义回调
522 /// @{ 690 /// @{
523 -/**  
524 - * 视频数据帧的自定义处理回调  
525 - */ 691 +
526 @protocol TRTCVideoRenderDelegate <NSObject> 692 @protocol TRTCVideoRenderDelegate <NSObject>
  693 +
527 /** 694 /**
528 * 自定义视频渲染回调 695 * 自定义视频渲染回调
529 * 696 *
  697 + * 当您设置了本地或者远端的视频自定义渲染回调之后,SDK 就会将原本要交给渲染控件进行渲染的视频帧通过此回调接口抛送给您,以便于您进行自定义渲染。
530 * @param frame 待渲染的视频帧信息 698 * @param frame 待渲染的视频帧信息
531 * @param userId 视频源的 userId,如果是本地视频回调(setLocalVideoRenderDelegate),该参数可以忽略 699 * @param userId 视频源的 userId,如果是本地视频回调(setLocalVideoRenderDelegate),该参数可以忽略
532 - * @param streamType 视频源类型,例如,使用摄像头画面或屏幕分享画面等 700 + * @param streamType 频流类型:主路(Main)一般用于承载摄像头画面,辅路(Sub)一般用于承载屏幕分享画面。
  701 + */
  702 +@optional
  703 +- (void)onRenderVideoFrame:(TRTCVideoFrame *_Nonnull)frame userId:(NSString *__nullable)userId streamType:(TRTCVideoStreamType)streamType;
  704 +
  705 +@end // End of class TRTCVideoRenderDelegate
  706 +
  707 +@protocol TRTCVideoFrameDelegate <NSObject>
  708 +
  709 +/**
  710 + * 用于对接第三方美颜组件的视频处理回调
  711 + *
  712 + * 如果您选购了第三方美颜组件,就需要在 TRTCCloud 中设置第三方美颜回调,之后 TRTC 就会将原本要进行预处理的视频帧通过此回调接口抛送给您。
  713 + * 之后您就可以将 TRTC 抛出的视频帧交给第三方美颜组件进行图像处理,由于抛出的数据是可读且可写的,因此第三方美颜的处理结果也可以同步给 TRTC 进行后续的编码和发送。
  714 + *
  715 + * @param srcFrame 用于承载 TRTC 采集到的摄像头画面
  716 + * @param dstFrame 用于接收第三方美颜处理过的视频画面
  717 + * @note 目前仅支持 OpenGL 纹理方案( PC 仅支持 TRTCVideoBufferType_Buffer 格式)。
  718 + *
  719 + * 情况一:美颜组件自身会产生新的纹理
  720 + * 如果您使用的美颜组件会在处理图像的过程中产生一帧全新的纹理(用于承载处理后的图像),那请您在回调函数中将 dstFrame.textureId 设置为新纹理的 ID:
  721 + * <pre>
  722 + * uint32_t onProcessVideoFrame(TRTCVideoFrame * _Nonnull)srcFrame dstFrame:(TRTCVideoFrame * _Nonnull)dstFrame{
  723 + * self.frameID += 1;
  724 + * dstFrame.pixelBuffer = [[FURenderer shareRenderer] renderPixelBuffer:srcFrame.pixelBuffer
  725 + * withFrameId:self.frameID
  726 + * items:self.renderItems
  727 + * itemCount:self.renderItems.count];
  728 + * return 0;
  729 + * }
  730 + * </pre>
  731 + *
  732 + *
  733 + * 情况二:美颜组件需要您提供目标纹理
  734 + * 如果您使用的第三方美颜模块并不生成新的纹理,而是需要您设置给该模块一个输入纹理和一个输出纹理,则可以考虑如下方案:
  735 + * ```ObjectiveC
  736 + * uint32_t onProcessVideoFrame(TRTCVideoFrame * _Nonnull)srcFrame dstFrame:(TRTCVideoFrame * _Nonnull)dstFrame{
  737 + * thirdparty_process(srcFrame.textureId, srcFrame.width, srcFrame.height, dstFrame.textureId);
  738 + * return 0;
  739 + * }
  740 + * ```
  741 + * ```java
  742 + * int onProcessVideoFrame(TRTCCloudDef.TRTCVideoFrame srcFrame, TRTCCloudDef.TRTCVideoFrame dstFrame) {
  743 + * thirdparty_process(srcFrame.texture.textureId, srcFrame.width, srcFrame.height, dstFrame.texture.textureId);
  744 + * return 0;
  745 + * }
  746 + * ```
533 */ 747 */
534 @optional 748 @optional
535 -- (void) onRenderVideoFrame:(TRTCVideoFrame * _Nonnull)frame userId:(NSString* __nullable)userId streamType:(TRTCVideoStreamType)streamType; 749 +- (uint32_t)onProcessVideoFrame:(TRTCVideoFrame *_Nonnull)srcFrame dstFrame:(TRTCVideoFrame *_Nonnull)dstFrame;
536 750
537 -@end 751 +/**
  752 + * SDK 内部 OpenGL 环境被销的通知
  753 + */
  754 +@optional
  755 +- (void)onGLContextDestory;
538 756
  757 +@end // End of class TRTCVideoFrameDelegate
  758 +
  759 +/// @}
539 ///////////////////////////////////////////////////////////////////////////////// 760 /////////////////////////////////////////////////////////////////////////////////
540 // 761 //
541 -// (十二)音频数据回调 762 +// 音频数据自定义回调
542 // 763 //
543 ///////////////////////////////////////////////////////////////////////////////// 764 /////////////////////////////////////////////////////////////////////////////////
544 -/**  
545 - * 声音数据帧的自定义处理回调  
546 - */ 765 +/// @name 音频数据自定义回调
  766 +/// @{
  767 +
547 @protocol TRTCAudioFrameDelegate <NSObject> 768 @protocol TRTCAudioFrameDelegate <NSObject>
548 @optional 769 @optional
  770 +
  771 +/**
  772 + * 本地麦克风采集到的原始音频数据回调
  773 + *
  774 + * 当您设置完音频数据自定义回调之后,SDK 内部会把刚从麦克风采集到的原始音频数据,以 PCM 格式的形式通过本接口回调给您。
  775 + * - 此接口回调出的音频时间帧长固定为0.02s,格式为 PCM 格式。
  776 + * - 由时间帧长转化为字节帧长的公式为【采样率 × 时间帧长 × 声道数 × 采样点位宽】。
  777 + * - 以 TRTC 默认的音频录制格式48000采样率、单声道、16采样点位宽为例,字节帧长为【48000 × 0.02s × 1 × 16bit = 15360bit = 1920字节】。
  778 + *
  779 + * @param frame PCM 格式的音频数据帧
  780 + * @note
  781 + * 1. 请不要在此回调函数中做任何耗时操作,由于 SDK 每隔 20ms 就要处理一帧音频数据,如果您的处理时间超过 20ms,就会导致声音异常。
  782 + * 2. 此接口回调出的音频数据是可读写的,也就是说您可以在回调函数中同步修改音频数据,但请保证处理耗时。
  783 + * 3. 此接口回调出的音频数据**不包含**背景音、音效、混响等前处理效果,延迟极低。
  784 + */
  785 +- (void)onCapturedRawAudioFrame:(TRTCAudioFrame *)frame;
  786 +
549 /** 787 /**
550 - * 本地麦克风采集到的音频数据回调 788 + * 本地采集并经过音频模块前处理后的音频数据回调
  789 + *
  790 + * 当您设置完音频数据自定义回调之后,SDK 内部会把刚采集到并经过前处理(ANS、AEC、AGC)之后的数据,以 PCM 格式的形式通过本接口回调给您。
  791 + * - 此接口回调出的音频时间帧长固定为0.02s,格式为 PCM 格式。
  792 + * - 由时间帧长转化为字节帧长的公式为【采样率 × 时间帧长 × 声道数 × 采样点位宽】。
  793 + * - 以 TRTC 默认的音频录制格式48000采样率、单声道、16采样点位宽为例,字节帧长为【48000 × 0.02s × 1 × 16bit = 15360bit = 1920字节】。
  794 + *
  795 + * 特殊说明:
  796 + * 您可以通过设置接口中的 `TRTCAudioFrame.extraData` 字段,达到传输信令的目的。
  797 + * 由于音频帧头部的数据块不能太大,建议您写入 `extraData` 时,尽量将信令控制在几个字节的大小,如果超过 100 个字节,写入的数据不会被发送。
  798 + * 房间内其他用户可以通过 {@link TRTCAudioFrameDelegate} 中的 `onRemoteUserAudioFrame` 中的 `TRTCAudioFrame.extraData` 字段回调接收数据。
551 * 799 *
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 - 此接口回调出的音频数据包含背景音、音效、混响等前处理效果。 800 + * @param frame PCM 格式的音频数据帧
  801 + * @note
  802 + * 1. 请不要在此回调函数中做任何耗时操作,由于 SDK 每隔 20ms 就要处理一帧音频数据,如果您的处理时间超过 20ms,就会导致声音异常。
  803 + * 2. 此接口回调出的音频数据是可读写的,也就是说您可以在回调函数中同步修改音频数据,但请保证处理耗时。
  804 + * 3. 此接口回调出的数据已经经过了回声抑制(AEC)处理,但声音的延迟相比于 {@link onCapturedRawAudioFrame} 要高一些。
559 */ 805 */
560 -- (void) onCapturedAudioFrame:(TRTCAudioFrame *)frame; 806 +- (void)onLocalProcessedAudioFrame:(TRTCAudioFrame *)frame;
561 807
562 /** 808 /**
563 - * 混音前的每一路远程用户的音频数据(例如您要对某一路的语音进行文字转换,必须要使用这里的原始数据,而不是混音之后的数据) 809 + * 混音前的每一路远程用户的音频数据
564 * 810 *
565 - * @param frame 音频数据 811 + * 当您设置完音频数据自定义回调之后,SDK 内部会把远端的每一路原始数据,在最终混音之前,以 PCM 格式的形式通过本接口回调给您。
  812 + * - 此接口回调出的音频时间帧长固定为0.02s,格式为 PCM 格式。
  813 + * - 由时间帧长转化为字节帧长的公式为【采样率 × 时间帧长 × 声道数 × 采样点位宽】。
  814 + * - 以 TRTC 默认的音频录制格式48000采样率、单声道、16采样点位宽为例,字节帧长为【48000 × 0.02s × 1 × 16bit = 15360bit = 1920字节】。
  815 + *
  816 + * @param frame PCM 格式的音频数据帧
566 * @param userId 用户标识 817 * @param userId 用户标识
567 - * @note - 请不要在此回调函数中做任何耗时操作,建议直接拷贝到另一线程进行处理,否则会导致各种声音问题。  
568 - * @note - 此接口回调出的音频数据是只读的,不支持修改。 818 + * @note 此接口回调出的音频数据是只读的,不支持修改
  819 + */
  820 +- (void)onRemoteUserAudioFrame:(TRTCAudioFrame *)frame userId:(NSString *)userId;
  821 +
  822 +/**
  823 + * 将各路待播放音频混合之后并在最终提交系统播放之前的数据回调
  824 + *
  825 + * 当您设置完音频数据自定义回调之后,SDK 内部会把各路待播放的音频混合之后的音频数据,在提交系统播放之前,以 PCM 格式的形式通过本接口回调给您。
  826 + * - 此接口回调出的音频时间帧长固定为0.02s,格式为 PCM 格式。
  827 + * - 由时间帧长转化为字节帧长的公式为【采样率 × 时间帧长 × 声道数 × 采样点位宽】。
  828 + * - 以 TRTC 默认的音频录制格式48000采样率、单声道、16采样点位宽为例,字节帧长为【48000 × 0.02s × 1 × 16bit = 15360bit = 1920字节】。
  829 + *
  830 + * @param frame PCM 格式的音频数据帧
  831 + * @note
  832 + * 1. 请不要在此回调函数中做任何耗时操作,由于 SDK 每隔 20ms 就要处理一帧音频数据,如果您的处理时间超过 20ms,就会导致声音异常。
  833 + * 2. 此接口回调出的音频数据是可读写的,也就是说您可以在回调函数中同步修改音频数据,但请保证处理耗时。
  834 + * 3. 此接口回调出的是对各路待播放音频数据的混合,但其中并不包含耳返的音频数据。
569 */ 835 */
570 -- (void) onPlayAudioFrame:(TRTCAudioFrame *)frame userId:(NSString *)userId; 836 +- (void)onMixedPlayAudioFrame:(TRTCAudioFrame *)frame;
571 837
572 /** 838 /**
573 - * 各路音频数据混合后的音频数据 839 + * SDK 所有音频混合后的音频数据(包括采集到的和待播放的)
574 * 840 *
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 - 此接口回调出的音频数据是各路音频播放数据的混合,不包含耳返的音频数据。 841 + * 当您设置完音频数据自定义回调之后,SDK 内部会把所有采集到的和待播放的音频数据混合起来,以 PCM 格式的形式通过本接口回调给您,便于您进行自定义录制。
  842 + * - 此接口回调出的音频时间帧长固定为0.02s,格式为 PCM 格式。
  843 + * - 由时间帧长转化为字节帧长的公式为【采样率 × 时间帧长 × 声道数 × 采样点位宽】。
  844 + * - 以 TRTC 默认的音频录制格式48000采样率、单声道、16采样点位宽为例,字节帧长为【48000 × 0.02s × 1 × 16bit = 15360bit = 1920字节】。
  845 + *
  846 + * @param frame PCM 格式的音频数据帧
  847 + * @note
  848 + * 1. 此接口回调出的是SDK所有音频数据的混合数据,包括:经过 3A 前处理、特效叠加以及背景音乐混音后的本地音频,所有远端音频,但不包括耳返音频。
  849 + * 2. 此接口回调出的音频数据不支持修改。
582 */ 850 */
583 -- (void) onMixedPlayAudioFrame:(TRTCAudioFrame *)frame; 851 +- (void)onMixedAllAudioFrame:(TRTCAudioFrame *)frame;
584 852
585 -@end 853 +@end // End of class TRTCAudioFrameDelegate
586 854
  855 +/// @}
587 ///////////////////////////////////////////////////////////////////////////////// 856 /////////////////////////////////////////////////////////////////////////////////
588 // 857 //
589 -// (十三)Log 信息回调 858 +// 更多事件回调接口
590 // 859 //
591 ///////////////////////////////////////////////////////////////////////////////// 860 /////////////////////////////////////////////////////////////////////////////////
592 -/**  
593 - * 日志相关回调  
594 - *  
595 - * 建议在一个比较早初始化的类中设置回调委托对象,例如 AppDelegate  
596 - */ 861 +/// @name 更多事件回调接口
  862 +/// @{
  863 +
597 @protocol TRTCLogDelegate <NSObject> 864 @protocol TRTCLogDelegate <NSObject>
  865 +
  866 +@optional
  867 +
598 /** 868 /**
599 - * 有日志打印时的回调 869 + * 本地 LOG 的打印回调
600 * 870 *
  871 + * 如果您希望捕获 SDK 的本地日志打印行为,可以通过设置日志回调,让 SDK 将要打印的日志都通过本回调接口抛送给您。
601 * @param log 日志内容 872 * @param log 日志内容
602 - * @param level 日志等级,参见 TRTCLogLevel  
603 - * @param module 值暂无具体意义,目前为固定值 TXLiteAVSDK 873 + * @param level 日志等级 参见 TRTC_LOG_LEVEL
  874 + * @param module 保留字段,暂无具体意义,目前为固定值 TXLiteAVSDK
604 */ 875 */
605 -@optional  
606 --(void) onLog:(nullable NSString*)log LogLevel:(TRTCLogLevel)level WhichModule:(nullable NSString*)module; 876 +- (void)onLog:(nullable NSString *)log LogLevel:(TRTCLogLevel)level WhichModule:(nullable NSString *)module;
607 877
608 -@end 878 +@end // End of class TRTCLogDelegate
609 /// @} 879 /// @}
610 -  
611 NS_ASSUME_NONNULL_END 880 NS_ASSUME_NONNULL_END
  881 +
  882 +/// @}
1 -  
2 -/*  
3 - * Module: TRTCStatistics @ TXLiteAVSDK  
4 - *  
5 - * Function: 腾讯云视频通话功能的质量统计相关接口  
6 - * 1 +/**
  2 + * Module: TRTC 音视频统计指标(只读)
  3 + * Function: TRTC SDK 会以两秒钟一次的频率向您汇报当前实时的音视频指标(帧率、码率、卡顿情况等)
7 */ 4 */
8 -///@addtogroup TRTCCloudDef_ios  
9 -///@{ 5 +/// @defgroup TRTCStatisic_ios TRTCStatisic
  6 +/// TRTC 音视频统计指标
  7 +/// @{
  8 +
  9 +/////////////////////////////////////////////////////////////////////////////////
  10 +//
  11 +// 本地的音视频统计指标
  12 +//
  13 +/////////////////////////////////////////////////////////////////////////////////
  14 +/// @name 本地的音视频统计指标
  15 +/// @{
10 16
11 -/// 自己本地的音视频统计信息  
12 @interface TRTCLocalStatistics : NSObject 17 @interface TRTCLocalStatistics : NSObject
13 18
14 -///视频宽度  
15 -@property (nonatomic, assign) uint32_t width; 19 +///【字段含义】本地视频的宽度,单位 px
  20 +@property(nonatomic, assign) uint32_t width;
  21 +
  22 +///【字段含义】本地视频的高度,单位 px
  23 +@property(nonatomic, assign) uint32_t height;
16 24
17 -///视频高度  
18 -@property (nonatomic, assign) uint32_t height; 25 +///【字段含义】本地视频的帧率,即每秒钟会有多少视频帧,单位:FPS
  26 +@property(nonatomic, assign) uint32_t frameRate;
19 27
20 -///帧率(fps)  
21 -@property (nonatomic, assign) uint32_t frameRate; 28 +///【字段含义】远端视频的码率,即每秒钟新产生视频数据的多少,单位 Kbps
  29 +@property(nonatomic, assign) uint32_t videoBitrate;
22 30
23 -///视频发送码率(Kbps)  
24 -@property (nonatomic, assign) uint32_t videoBitrate; 31 +///【字段含义】远端音频的采样率,单位 Hz
  32 +@property(nonatomic, assign) uint32_t audioSampleRate;
25 33
26 -///音频采样率(Hz)  
27 -@property (nonatomic, assign) uint32_t audioSampleRate; 34 +///【字段含义】本地音频的码率,即每秒钟新产生音频数据的多少,单位 Kbps
  35 +@property(nonatomic, assign) uint32_t audioBitrate;
28 36
29 -///音频发送码率(Kbps)  
30 -@property (nonatomic, assign) uint32_t audioBitrate; 37 +///【字段含义】视频流类型(高清大画面|低清小画面|辅流画面)
  38 +@property(nonatomic, assign) TRTCVideoStreamType streamType;
31 39
32 -///流类型(大画面 | 小画面 | 辅路画面)  
33 -@property (nonatomic, assign) TRTCVideoStreamType streamType; 40 +///【字段含义】音频设备采集状态(用于检测音频外设的健康度)
  41 +/// 0:采集设备状态正常;1:检测到长时间静音;2:检测到破音;3:检测到声音异常间断。
  42 +@property(nonatomic, assign) uint32_t audioCaptureState;
34 @end 43 @end
35 44
  45 +/// @}
  46 +/////////////////////////////////////////////////////////////////////////////////
  47 +//
  48 +// 远端的音视频统计指标
  49 +//
  50 +/////////////////////////////////////////////////////////////////////////////////
  51 +/// @name 远端的音视频统计指标
  52 +/// @{
36 53
37 -/// 远端成员的音视频统计信息  
38 @interface TRTCRemoteStatistics : NSObject 54 @interface TRTCRemoteStatistics : NSObject
39 55
40 -/// 用户 ID,指定是哪个用户的视频流  
41 -@property (nonatomic, retain) NSString* userId; 56 +///【字段含义】用户 ID
  57 +@property(nonatomic, retain) NSString* userId;
42 58
43 -/** 该线路的总丢包率(%)  
44 - *  
45 - * 这个值越小越好,例如,丢包率为0表示网络很好。  
46 - * 丢包率是该线路的 userId 从上行到服务器再到下行的总丢包率。  
47 - * 如果 downLoss 为0,但是 finalLoss 不为0,说明该 userId 上行时出现了无法恢复的丢包。  
48 - */  
49 -@property (nonatomic, assign) uint32_t finalLoss; 59 +///【字段含义】音频流的总丢包率(%)
  60 +/// audioPacketLoss 代表音频流历经“主播 => 云端 => 观众”这样一条完整的传输链路后,最终在观众端统计到的丢包率。
  61 +/// audioPacketLoss 越小越好,丢包率为0即表示该路音频流的所有数据均已经完整地到达了观众端。
  62 +///如果出现了 downLoss == 0 但 audioPacketLoss != 0 的情况,说明该路音频流在“云端=>观众”这一段链路上没有出现丢包,但是在“主播=>云端”这一段链路上出现了不可恢复的丢包。
  63 +@property(nonatomic, assign) uint32_t audioPacketLoss;
  64 +
  65 +///【字段含义】该路视频流的总丢包率(%)
  66 +/// videoPacketLoss 代表该路视频流历经“主播 => 云端 => 观众”这样一条完整的传输链路后,最终在观众端统计到的丢包率。
  67 +/// videoPacketLoss 越小越好,丢包率为0即表示该路视频流的所有数据均已经完整地到达了观众端。
  68 +///如果出现了 downLoss == 0 但 videoPacketLoss != 0 的情况,说明该路视频流在“云端=>观众”这一段链路上没有出现丢包,但是在“主播=>云端”这一段链路上出现了不可恢复的丢包。
  69 +@property(nonatomic, assign) uint32_t videoPacketLoss;
  70 +
  71 +///【字段含义】远端视频的宽度,单位 px
  72 +@property(nonatomic, assign) uint32_t width;
  73 +
  74 +///【字段含义】远端视频的高度,单位 px
  75 +@property(nonatomic, assign) uint32_t height;
  76 +
  77 +///【字段含义】远端视频的帧率,单位:FPS
  78 +@property(nonatomic, assign) uint32_t frameRate;
  79 +
  80 +///【字段含义】远端视频的码率,单位 Kbps
  81 +@property(nonatomic, assign) uint32_t videoBitrate;
50 82
51 -///视频宽度  
52 -@property (nonatomic, assign) uint32_t width; 83 +///【字段含义】本地音频的采样率,单位 Hz
  84 +@property(nonatomic, assign) uint32_t audioSampleRate;
53 85
54 -///视频高度  
55 -@property (nonatomic, assign) uint32_t height; 86 +///【字段含义】本地音频的码率,单位 Kbps
  87 +@property(nonatomic, assign) uint32_t audioBitrate;
56 88
57 -///接收帧率(fps)  
58 -@property (nonatomic, assign) uint32_t frameRate; 89 +///【字段含义】播放延迟,单位 ms
  90 +///为了避免网络抖动和网络包乱序导致的声音和画面卡顿,TRTC 会在播放端管理一个播放缓冲区,用于对接收到的网络数据包进行整理,
  91 +///该缓冲区的大小会根据当前的网络质量进行自适应调整,该缓冲区的大小折算成以毫秒为单位的时间长度,也就是 jitterBufferDelay。
  92 +@property(nonatomic, assign) uint32_t jitterBufferDelay;
59 93
60 -///视频码率(Kbps)  
61 -@property (nonatomic, assign) uint32_t videoBitrate; 94 +///【字段含义】端到端延迟,单位 ms
  95 +/// point2PointDelay 代表 “主播=>云端=>观众” 的延迟,更准确地说,它代表了“采集=>编码=>网络传输=>接收=>缓冲=>解码=>播放” 全链路的延迟。
  96 +/// point2PointDelay 需要本地和远端的 SDK 均为 8.5 及以上的版本才生效,若远端用户为 8.5 以前的版本,此数值会一直为0,代表无意义。
  97 +@property(nonatomic, assign) uint32_t point2PointDelay;
62 98
63 -///音频采样率(Hz)  
64 -@property (nonatomic, assign) uint32_t audioSampleRate; 99 +///【字段含义】音频播放的累计卡顿时长,单位 ms
  100 +@property(nonatomic, assign) uint32_t audioTotalBlockTime;
65 101
66 -///音频码率(Kbps)  
67 -@property (nonatomic, assign) uint32_t audioBitrate; 102 +///【字段含义】音频播放卡顿率,单位 (%)
  103 +///音频播放卡顿率(audioBlockRate) = 音频播放的累计卡顿时长(audioTotalBlockTime) / 音频播放的总时长
  104 +@property(nonatomic, assign) uint32_t audioBlockRate;
68 105
69 -///流类型(大画面 | 小画面 | 辅路画面)  
70 -@property (nonatomic, assign) TRTCVideoStreamType streamType; 106 +///【字段含义】视频播放的累计卡顿时长,单位 ms
  107 +@property(nonatomic, assign) uint32_t videoTotalBlockTime;
  108 +
  109 +///【字段含义】视频播放卡顿率,单位 (%)
  110 +///视频播放卡顿率(videoBlockRate) = 视频播放的累计卡顿时长(videoTotalBlockTime) / 视频播放的总时长
  111 +@property(nonatomic, assign) uint32_t videoBlockRate;
  112 +
  113 +///【字段含义】该路音视频流的总丢包率(%)
  114 +///已废弃,不推荐使用;建议使用 audioPacketLoss、videoPacketLoss 替代
  115 +@property(nonatomic, assign) uint32_t finalLoss __attribute__((deprecated("Use audioPacketLoss and videoPacketLoss instead.")));
  116 +
  117 +///【字段含义】视频流类型(高清大画面|低清小画面|辅流画面)
  118 +@property(nonatomic, assign) TRTCVideoStreamType streamType;
71 @end 119 @end
72 120
  121 +/// @}
  122 +/////////////////////////////////////////////////////////////////////////////////
  123 +//
  124 +// 网络和性能的汇总统计指标
  125 +//
  126 +/////////////////////////////////////////////////////////////////////////////////
  127 +/// @name 网络和性能的汇总统计指标
  128 +/// @{
73 129
74 -/// 统计数据  
75 @interface TRTCStatistics : NSObject 130 @interface TRTCStatistics : NSObject
76 131
77 -/** C -> S 上行丢包率(%),  
78 - * 该值越小越好,例如,丢包率为0表示网络很好,  
79 - * 丢包率为30@%则意味着 SDK 向服务器发送的数据包中会有30@%丢失在上行传输中。  
80 - */  
81 -@property (nonatomic, assign) uint32_t upLoss; 132 +///【字段含义】当前应用的 CPU 使用率,单位 (%)
  133 +@property(nonatomic, assign) uint32_t appCpu;
82 134
83 -/** S -> C 下行丢包率(%),  
84 - * 该值越小越好,例如,丢包率为0表示网络很好,  
85 - * 丢包率为30@%则意味着 SDK 向服务器发送的数据包中会有30@%丢失在下行传输中。  
86 - */  
87 -@property (nonatomic, assign) uint32_t downLoss; 135 +///【字段含义】当前系统的 CPU 使用率,单位 (%)
  136 +@property(nonatomic, assign) uint32_t systemCpu;
  137 +
  138 +///【字段含义】从 SDK 到云端的上行丢包率,单位 (%)
  139 +///该数值越小越好,如果 upLoss 为 0%,则意味着上行链路的网络质量很好,上传到云端的数据包基本不发生丢失。
  140 +///如果 upLoss 为 30%,则意味着 SDK 向云端发送的音视频数据包中,会有 30% 丢失在传输链路中。
  141 +@property(nonatomic, assign) uint32_t upLoss;
88 142
89 -///当前 App 的 CPU 使用率(%)  
90 -@property (nonatomic, assign) uint32_t appCpu; 143 +///【字段含义】从云端到 SDK 的下行丢包率,单位 (%)
  144 +///该数值越小越好,如果 downLoss 为 0%,则意味着下行链路的网络质量很好,从云端接收的数据包基本不发生丢失。
  145 +///如果 downLoss 为 30%,则意味着云端向 SDK 传输的音视频数据包中,会有 30% 丢失在传输链路中。
  146 +@property(nonatomic, assign) uint32_t downLoss;
91 147
92 -///当前系统的 CPU 使用率(%)  
93 -@property (nonatomic, assign) uint32_t systemCpu; 148 +///【字段含义】从 SDK 到云端的往返延时,单位 ms
  149 +///该数值代表从 SDK 发送一个网络包到云端,再从云端回送一个网络包到 SDK 的总计耗时,也就是一个网络包经历 “SDK=>云端=>SDK” 的总耗时。
  150 +///该数值越小越好:如果 rtt < 50ms,意味着较低的音视频通话延迟;如果 rtt > 200ms,则意味着较高的音视频通话延迟。
  151 +///需要特别解释的是,rtt 代表 “SDK=>云端=>SDK” 的总耗时,所不需要区分 upRtt 和 downRtt。
  152 +@property(nonatomic, assign) uint32_t rtt;
94 153
95 -/// 延迟(毫秒),  
96 -/// 指 SDK 到腾讯云服务器的一次网络往返时间,该值越小越好。  
97 -/// 一般低于50ms的 rtt 相对理想,而高于100ms的 rtt 会引入较大的通话延时。  
98 -/// 由于数据上下行共享一条网络连接,所以 local 和 remote 的 rtt 相同。  
99 -@property (nonatomic, assign) uint32_t rtt; 154 +///【字段含义】从 SDK 到本地路由器的往返时延,单位 ms
  155 +///该数值代表从 SDK 发送一个网络包到本地路由器网关,再从网关回送一个网络包到 SDK 的总计耗时,也就是一个网络包经历 “SDK=>网关=>SDK” 的总耗时。
  156 +///该数值越小越好:如果 gatewayRtt < 50ms,意味着较低的音视频通话延迟;如果 gatewayRtt > 200ms,则意味着较高的音视频通话延迟。
  157 +///当网络类型为蜂窝网时,该值无效。
  158 +@property(nonatomic, assign) uint32_t gatewayRtt;
100 159
101 -/// 总接收字节数(包含信令及音视频)  
102 -@property (nonatomic, assign) uint64_t receivedBytes; 160 +///【字段含义】总发送字节数(包含信令数据和音视频数据),单位:字节数(Bytes)
  161 +@property(nonatomic, assign) uint64_t sentBytes;
103 162
104 -/// 总发送字节数(包含信令及音视频)  
105 -@property (nonatomic, assign) uint64_t sentBytes; 163 +///【字段含义】总接收字节数(包含信令数据和音视频数据),单位:字节数(Bytes)
  164 +@property(nonatomic, assign) uint64_t receivedBytes;
106 165
107 -///自己本地的音视频统计信息,可能有主画面、小画面以及辅路画面等多路的情况,因此是一个数组  
108 -@property (nonatomic, strong) NSArray<TRTCLocalStatistics*>* localStatistics; 166 +///【字段含义】本地的音视频统计信息
  167 +///由于本地可能有三路音视频流(即高清大画面,低清小画面,以及辅流画面),因此本地的音视频统计信息是一个数组。
  168 +@property(nonatomic, strong) NSArray<TRTCLocalStatistics*>* localStatistics;
  169 +
  170 +///【字段含义】远端的音视频统计信息
  171 +///因为同时可能有多个远端用户,而且每个远端用户同时可能有多路音视频流(即高清大画面,低清小画面,以及辅流画面),因此远端的音视频统计信息是一个数组。
  172 +@property(nonatomic, strong) NSArray<TRTCRemoteStatistics*>* remoteStatistics;
109 173
110 -///远端成员的音视频统计信息,可能有主画面、小画面以及辅路画面等多路的情况,因此是一个数组  
111 -@property (nonatomic, strong) NSArray<TRTCRemoteStatistics*>* remoteStatistics;  
112 @end 174 @end
113 -///@} 175 +/// @}
  176 +
  177 +/// @}
  1 +/**
  2 + * Module: TRTC 背景音乐、短音效和人声特效的管理类
  3 + * Function: 用于对背景音乐、短音效和人声特效进行设置的管理类
  4 + */
  5 +/// @defgroup TXAudioEffectManager_ios TXAudioEffectManager
  6 +/// TRTC 背景音乐、短音效和人声特效的管理类
  7 +/// @{
  8 +#import <Foundation/Foundation.h>
  9 +
  10 +/////////////////////////////////////////////////////////////////////////////////
  11 +//
  12 +// 音效相关的枚举值定义
  13 +//
  14 +/////////////////////////////////////////////////////////////////////////////////
  15 +/// @name 音效相关的枚举值定义
  16 +/// @{
  17 +
  18 +/**
  19 + * 1.1 混响特效
  20 + *
  21 + * 混响特效可以作用于人声之上,通过声学算法对声音进行叠加处理,模拟出各种不同环境下的临场感受,目前支持如下几种混响效果:
  22 + * 0:关闭;1:KTV;2:小房间;3:大会堂;4:低沉;5:洪亮;6:金属声;7:磁性;8:空灵;9:录音棚;10:悠扬。
  23 + */
  24 +typedef NS_ENUM(NSInteger, TXVoiceReverbType) {
  25 + TXVoiceReverbType_0 = 0, ///< disable
  26 + TXVoiceReverbType_1 = 1, ///< KTV
  27 + TXVoiceReverbType_2 = 2, ///< small room
  28 + TXVoiceReverbType_3 = 3, ///< great hall
  29 + TXVoiceReverbType_4 = 4, ///< deep voice
  30 + TXVoiceReverbType_5 = 5, ///< loud voice
  31 + TXVoiceReverbType_6 = 6, ///< metallic sound
  32 + TXVoiceReverbType_7 = 7, ///< magnetic sound
  33 + TXVoiceReverbType_8 = 8, ///< ethereal
  34 + TXVoiceReverbType_9 = 9, ///< studio
  35 + TXVoiceReverbType_10 = 10, ///< melodious
  36 +};
  37 +
  38 +/**
  39 + * 1.2 变声特效
  40 + *
  41 + * 变声特效可以作用于人声之上,通过声学算法对人声进行二次处理,以获得与原始声音所不同的音色,目前支持如下几种变声特效:
  42 + * 0:关闭;1:熊孩子;2:萝莉;3:大叔;4:重金属;5:感冒;6:外语腔;7:困兽;8:肥宅;9:强电流;10:重机械;11:空灵。
  43 + */
  44 +typedef NS_ENUM(NSInteger, TXVoiceChangeType) {
  45 + TXVoiceChangeType_0 = 0, ///< disable
  46 + TXVoiceChangeType_1 = 1, ///< naughty kid
  47 + TXVoiceChangeType_2 = 2, ///< Lolita
  48 + TXVoiceChangeType_3 = 3, ///< uncle
  49 + TXVoiceChangeType_4 = 4, ///< heavy metal
  50 + TXVoiceChangeType_5 = 5, ///< catch cold
  51 + TXVoiceChangeType_6 = 6, ///< foreign accent
  52 + TXVoiceChangeType_7 = 7, ///< caged animal trapped beast
  53 + TXVoiceChangeType_8 = 8, ///< indoorsman
  54 + TXVoiceChangeType_9 = 9, ///< strong current
  55 + TXVoiceChangeType_10 = 10, ///< heavy machinery
  56 + TXVoiceChangeType_11 = 11, ///< intangible
  57 +};
  58 +
  59 +/// @}
  60 +/////////////////////////////////////////////////////////////////////////////////
  61 +//
  62 +// 背景音乐的播放事件回调
  63 +//
  64 +/////////////////////////////////////////////////////////////////////////////////
  65 +/// @name 背景音乐的事件回调接口
  66 +/// @{
  67 +
  68 +// Playback progress block of background music
  69 +
  70 +///背景音乐开始播放
  71 +typedef void (^TXAudioMusicStartBlock)(NSInteger errCode);
  72 +
  73 +///背景音乐的播放进度
  74 +typedef void (^TXAudioMusicProgressBlock)(NSInteger progressMs, NSInteger durationMs);
  75 +
  76 +///背景音乐已经播放完毕
  77 +typedef void (^TXAudioMusicCompleteBlock)(NSInteger errCode);
  78 +
  79 +/// @}
  80 +/////////////////////////////////////////////////////////////////////////////////
  81 +//
  82 +// 背景音乐的播放控制信息
  83 +//
  84 +/////////////////////////////////////////////////////////////////////////////////
  85 +/// @name 背景音乐的播放控制信息
  86 +/// @{
  87 +
  88 +/**
  89 + * 背景音乐的播放控制信息
  90 + *
  91 + * 该信息用于在接口 {@link startPlayMusic} 中指定背景音乐的相关信息,包括播放 ID、文件路径和循环次数等:
  92 + * 1. 如果要多次播放同一首背景音乐,请不要每次播放都分配一个新的 ID,我们推荐使用相同的 ID。
  93 + * 2. 若您希望同时播放多首不同的音乐,请为不同的音乐分配不同的 ID 进行播放。
  94 + * 3. 如果使用同一个 ID 播放不同音乐,SDK 会先停止播放旧的音乐,再播放新的音乐。
  95 + */
  96 +@interface TXAudioMusicParam : NSObject
  97 +
  98 +///【字段含义】音乐 ID <br/>
  99 +///【特殊说明】SDK 允许播放多路音乐,因此需要使用 ID 进行标记,用于控制音乐的开始、停止、音量等。
  100 +@property(nonatomic) int32_t ID;
  101 +
  102 +///【字段含义】音效文件的完整路径或 URL 地址。支持的音频格式包括 MP3、AAC、M4A、WAV
  103 +@property(nonatomic, copy) NSString *path;
  104 +
  105 +///【字段含义】音乐循环播放的次数 <br/>
  106 +///【推荐取值】取值范围为0 - 任意正整数,默认值:0。0表示播放音乐一次;1表示播放音乐两次;以此类推
  107 +@property(nonatomic) NSInteger loopCount;
  108 +
  109 +///【字段含义】是否将音乐传到远端 <br/>
  110 +///【推荐取值】YES:音乐在本地播放的同时,远端用户也能听到该音乐;NO:主播只能在本地听到该音乐,远端观众听不到。默认值:NO。
  111 +@property(nonatomic) BOOL publish;
  112 +
  113 +///【字段含义】播放的是否为短音乐文件 <br/>
  114 +///【推荐取值】YES:需要重复播放的短音乐文件;NO:正常的音乐文件。默认值:NO
  115 +@property(nonatomic) BOOL isShortFile;
  116 +
  117 +///【字段含义】音乐开始播放时间点,单位:毫秒。
  118 +@property(nonatomic) NSInteger startTimeMS;
  119 +
  120 +///【字段含义】音乐结束播放时间点,单位毫秒,0表示播放至文件结尾。
  121 +@property(nonatomic) NSInteger endTimeMS;
  122 +@end
  123 +/// @}
  124 +
  125 +// Definition of audio effect management module
  126 +@interface TXAudioEffectManager : NSObject
  127 +
  128 +/**
  129 + * TXAudioEffectManager对象不可直接被创建
  130 + * 要通过 `TRTCCloud` 或 `TXLivePush` 中的 `getAudioEffectManager` 接口获取
  131 + */
  132 +- (instancetype)init NS_UNAVAILABLE;
  133 +
  134 +/////////////////////////////////////////////////////////////////////////////////
  135 +//
  136 +// 人声相关的特效接口
  137 +//
  138 +/////////////////////////////////////////////////////////////////////////////////
  139 +/// @name 人声相关的特效接口
  140 +/// @{
  141 +
  142 +/**
  143 + * 1.1 开启耳返
  144 + *
  145 + * 主播开启耳返后,可以在耳机里听到麦克风采集到的自己发出的声音,该特效适用于主播唱歌的应用场景中。
  146 + *
  147 + * 需要您注意的是,由于蓝牙耳机的硬件延迟非常高,所以在主播佩戴蓝牙耳机时无法开启此特效,请尽量在用户界面上提示主播佩戴有线耳机。
  148 + * 同时也需要注意,并非所有的手机开启此特效后都能达到优秀的耳返效果,我们已经对部分耳返效果不佳的手机屏蔽了该特效。
  149 + *
  150 + * @note 仅在主播佩戴耳机时才能开启此特效,同时请您提示主播佩戴有线耳机。
  151 + * @param enable true:开启;false:关闭。
  152 + */
  153 +- (void)enableVoiceEarMonitor:(BOOL)enable;
  154 +
  155 +/**
  156 + * 1.2 设置耳返音量
  157 + *
  158 + * 通过该接口您可以设置耳返特效中声音的音量大小。
  159 + *
  160 + * @param volume 音量大小,取值范围为0 - 100,默认值:100。
  161 + * @note 如果将 volume 设置成 100 之后感觉音量还是太小,可以将 volume 最大设置成 150,但超过 100 的 volume 会有爆音的风险,请谨慎操作。
  162 + */
  163 +- (void)setVoiceEarMonitorVolume:(NSInteger)volume;
  164 +
  165 +/**
  166 + * 1.3 设置人声的混响效果
  167 + *
  168 + * 通过该接口您可以设置人声的混响效果,具体特效请参考枚举定义{@link TXVoiceReverbType}。
  169 + *
  170 + * @note 设置的效果在退出房间后会自动失效,如果下次进房还需要对应特效,需要调用此接口再次进行设置。
  171 + */
  172 +- (void)setVoiceReverbType:(TXVoiceReverbType)reverbType;
  173 +
  174 +/**
  175 + * 1.4 设置人声的变声特效
  176 + *
  177 + * 通过该接口您可以设置人声的变声特效,具体特效请参考枚举定义{@link TXVoiceChangeType}。
  178 + *
  179 + * @note 设置的效果在退出房间后会自动失效,如果下次进房还需要对应特效,需要调用此接口再次进行设置。
  180 + */
  181 +- (void)setVoiceChangerType:(TXVoiceChangeType)changerType;
  182 +
  183 +/**
  184 + * 1.5 设置语音音量
  185 + *
  186 + * 该接口可以设置语音音量的大小,一般配合音乐音量的设置接口 {@link setAllMusicVolume} 协同使用,用于调谐语音和音乐在混音前各自的音量占比。
  187 + *
  188 + * @param volume 音量大小,取值范围为0 - 100,默认值:100。
  189 + * @note 如果将 volume 设置成 100 之后感觉音量还是太小,可以将 volume 最大设置成 150,但超过 100 的 volume 会有爆音的风险,请谨慎操作。
  190 + */
  191 +- (void)setVoiceVolume:(NSInteger)volume;
  192 +
  193 +/**
  194 + * 1.6 设置语音音调
  195 + *
  196 + * 该接口可以设置语音音调,用于实现变调不变速的目的。
  197 + *
  198 + * @param pitch 音调,取值范围为-1.0f~1.0f,默认值:0.0f。
  199 + */
  200 +- (void)setVoicePitch:(double)pitch;
  201 +
  202 +/// @}
  203 +/////////////////////////////////////////////////////////////////////////////////
  204 +//
  205 +// 背景音乐的相关接口
  206 +//
  207 +/////////////////////////////////////////////////////////////////////////////////
  208 +/// @name 背景音乐的相关接口
  209 +/// @{
  210 +
  211 +/**
  212 + * 2.1 开始播放背景音乐
  213 + *
  214 + * 每个音乐都需要您指定具体的 ID,您可以通过该 ID 对音乐的开始、停止、音量等进行设置。
  215 + *
  216 + * @note
  217 + * 1. 如果要多次播放同一首背景音乐,请不要每次播放都分配一个新的 ID,我们推荐使用相同的 ID。
  218 + * 2. 若您希望同时播放多首不同的音乐,请为不同的音乐分配不同的 ID 进行播放。
  219 + * 3. 如果使用同一个 ID 播放不同音乐,SDK 会先停止播放旧的音乐,再播放新的音乐。
  220 + *
  221 + * @param musicParam 音乐参数
  222 + * @param startBlock 播放开始回调
  223 + * @param progressBlock 播放进度回调
  224 + * @param completeBlock 播放结束回调
  225 + */
  226 +- (void)startPlayMusic:(TXAudioMusicParam *)musicParam onStart:(TXAudioMusicStartBlock _Nullable)startBlock onProgress:(TXAudioMusicProgressBlock _Nullable)progressBlock onComplete:(TXAudioMusicCompleteBlock _Nullable)completeBlock;
  227 +
  228 +/**
  229 + * 2.2 停止播放背景音乐
  230 + *
  231 + * @param id 音乐 ID
  232 + */
  233 +- (void)stopPlayMusic:(int32_t)id;
  234 +
  235 +/**
  236 + * 2.3 暂停播放背景音乐
  237 + *
  238 + * @param id 音乐 ID
  239 + */
  240 +- (void)pausePlayMusic:(int32_t)id;
  241 +
  242 +/**
  243 + * 2.4 恢复播放背景音乐
  244 + *
  245 + * @param id 音乐 ID
  246 + */
  247 +- (void)resumePlayMusic:(int32_t)id;
  248 +
  249 +/**
  250 + * 2.5 设置所有背景音乐的本地音量和远端音量的大小
  251 + *
  252 + * 该接口可以设置所有背景音乐的本地音量和远端音量。
  253 + * - 本地音量:即主播本地可以听到的背景音乐的音量大小。
  254 + * - 远端音量:即观众端可以听到的背景音乐的音量大小。
  255 + *
  256 + * @param volume 音量大小,取值范围为0 - 100,默认值:100。
  257 + * @note 如果将 volume 设置成 100 之后感觉音量还是太小,可以将 volume 最大设置成 150,但超过 100 的 volume 会有爆音的风险,请谨慎操作。
  258 + */
  259 +- (void)setAllMusicVolume:(NSInteger)volume;
  260 +
  261 +/**
  262 + * 2.6 设置某一首背景音乐的远端音量的大小
  263 + *
  264 + * 该接口可以细粒度地控制每一首背景音乐的远端音量,也就是观众端可听到的背景音乐的音量大小。
  265 + *
  266 + * @param id 音乐 ID
  267 + * @param volume 音量大小,取值范围为0 - 100;默认值:100
  268 + * @note 如果将 volume 设置成 100 之后感觉音量还是太小,可以将 volume 最大设置成 150,但超过 100 的 volume 会有爆音的风险,请谨慎操作。
  269 + */
  270 +- (void)setMusicPublishVolume:(int32_t)id volume:(NSInteger)volume;
  271 +
  272 +/**
  273 + * 2.7 设置某一首背景音乐的本地音量的大小
  274 + *
  275 + * 该接口可以细粒度地控制每一首背景音乐的本地音量,也就是主播本地可以听到的背景音乐的音量大小。
  276 + *
  277 + * @param id 音乐 ID
  278 + * @param volume 音量大小,取值范围为0 - 100,默认值:100。
  279 + * @note 如果将 volume 设置成 100 之后感觉音量还是太小,可以将 volume 最大设置成 150,但超过 100 的 volume 会有爆音的风险,请谨慎操作。
  280 + */
  281 +- (void)setMusicPlayoutVolume:(int32_t)id volume:(NSInteger)volume;
  282 +
  283 +/**
  284 + * 2.8 调整背景音乐的音调高低
  285 + *
  286 + * @param id 音乐 ID
  287 + * @param pitch 音调,默认值是0.0f,范围是:[-1 ~ 1] 之间的浮点数;
  288 + */
  289 +- (void)setMusicPitch:(int32_t)id pitch:(double)pitch;
  290 +
  291 +/**
  292 + * 2.9 调整背景音乐的变速效果
  293 + *
  294 + * @param id 音乐 ID
  295 + * @param speedRate 速度,默认值是1.0f,范围是:[0.5 ~ 2] 之间的浮点数;
  296 + */
  297 +- (void)setMusicSpeedRate:(int32_t)id speedRate:(double)speedRate;
  298 +
  299 +/**
  300 + * 2.10 获取背景音乐的播放进度(单位:毫秒)
  301 + *
  302 + * @param id 音乐 ID
  303 + * @return 成功返回当前播放时间,单位:毫秒,失败返回-1
  304 + */
  305 +- (NSInteger)getMusicCurrentPosInMS:(int32_t)id;
  306 +
  307 +/**
  308 + * 2.11 获取背景音乐的总时长(单位:毫秒)
  309 + *
  310 + * @param path 音乐文件路径。
  311 + * @return 成功返回时长,失败返回-1
  312 + */
  313 +- (NSInteger)getMusicDurationInMS:(NSString *)path;
  314 +
  315 +/**
  316 + * 2.12 设置背景音乐的播放进度(单位:毫秒)
  317 + *
  318 + * @note 请尽量避免过度频繁地调用该接口,因为该接口可能会再次读写音乐文件,耗时稍高。
  319 + * 因此,当用户拖拽音乐的播放进度条时,请在用户完成拖拽操作后再调用本接口。
  320 + * 因为 UI 上的进度条控件往往会以很高的频率反馈用户的拖拽进度,如不做频率限制,会导致较差的用户体验。
  321 + *
  322 + * @param id 音乐 ID
  323 + * @param pts 单位: 毫秒
  324 + */
  325 +- (void)seekMusicToPosInMS:(int32_t)id pts:(NSInteger)pts;
  326 +
  327 +/// @}
  328 +@end // End of interface TXAudioEffectManager
  329 +/// @}
1 -//  
2 -// TXBeautyManager.h  
3 -// TXLiteAVSDK  
4 -//  
5 -// Created by cui on 2019/10/24.  
6 -// Copyright © 2019 Tencent. All rights reserved.  
7 -//  
8 - 1 +/**
  2 + * Module: 美颜与图像处理参数设置类
  3 + * Function: 修改美颜、滤镜、绿幕等参数
  4 + */
9 #import <Foundation/Foundation.h> 5 #import <Foundation/Foundation.h>
  6 +#import <TargetConditionals.h>
  7 +#if TARGET_OS_IPHONE
  8 +#import <UIKit/UIKit.h>
  9 +typedef UIImage TXImage;
  10 +#else
  11 +#import <AppKit/AppKit.h>
  12 +typedef NSImage TXImage;
  13 +#endif
10 14
11 NS_ASSUME_NONNULL_BEGIN 15 NS_ASSUME_NONNULL_BEGIN
12 16
13 /// @defgroup TXBeautyManager_ios TXBeautyManager 17 /// @defgroup TXBeautyManager_ios TXBeautyManager
14 -/// 美颜及动效参数管理 18 +/// 美颜与图像处理参数设置类
15 /// @{ 19 /// @{
16 20
17 /** 21 /**
18 * 美颜(磨皮)算法 22 * 美颜(磨皮)算法
19 - * SDK 内置了多种不同的磨皮算法,您可以选择最适合您产品定位的方案。 23 + * TRTC 内置多种不同的磨皮算法,您可以选择最适合您产品定位的方案。
20 */ 24 */
21 typedef NS_ENUM(NSInteger, TXBeautyStyle) { 25 typedef NS_ENUM(NSInteger, TXBeautyStyle) {
22 - TXBeautyStyleSmooth = 0, ///< 光滑,适用于美女秀场,效果比较明显。  
23 - TXBeautyStyleNature = 1, ///< 自然,磨皮算法更多地保留了面部细节,主观感受上会更加自然。  
24 - TXBeautyStylePitu = 2 ///< 企业版美颜算法(企业版有效,其它版本设置此参数无效) 26 +
  27 + ///光滑,算法比较激进,磨皮效果比较明显,适用于秀场直播。
  28 + TXBeautyStyleSmooth = 0,
  29 +
  30 + ///自然,算法更多地保留了面部细节,磨皮效果更加自然,适用于绝大多数直播场景。
  31 + TXBeautyStyleNature = 1,
  32 +
  33 + ///优图,由优图实验室提供,磨皮效果介于光滑和自然之间,比光滑保留更多皮肤细节,比自然磨皮程度更高。
  34 + TXBeautyStylePitu = 2
25 }; 35 };
26 36
27 -/// 美颜及动效参数管理  
28 @interface TXBeautyManager : NSObject 37 @interface TXBeautyManager : NSObject
29 38
30 /** 39 /**
31 * 设置美颜(磨皮)算法 40 * 设置美颜(磨皮)算法
32 * 41 *
33 - * SDK 内部集成了两套风格不同的磨皮算法,一套我们取名叫“光滑”,适用于美女秀场,效果比较明显。  
34 - * 另一套我们取名“自然”,磨皮算法更多地保留了面部细节,主观感受上会更加自然。 42 + * TRTC 内置多种不同的磨皮算法,您可以选择最适合您产品定位的方案:
35 * 43 *
36 - * @param beautyStyle 美颜风格,光滑或者自然,光滑风格磨皮更加明显,适合娱乐场景 44 + * @param beautyStyle 美颜风格,TXBeautyStyleSmooth:光滑;TXBeautyStyleNature:自然;TXBeautyStylePitu:优图
37 */ 45 */
38 - (void)setBeautyStyle:(TXBeautyStyle)beautyStyle; 46 - (void)setBeautyStyle:(TXBeautyStyle)beautyStyle;
39 47
40 /** 48 /**
41 * 设置美颜级别 49 * 设置美颜级别
42 - * @param level 美颜级别,取值范围0 - 9; 0表示关闭,1 - 9值越大,效果越明显。 50 + *
  51 + * @param beautyLevel 美颜级别,取值范围0 - 9; 0表示关闭,9表示效果最明显。
43 */ 52 */
44 -- (void)setBeautyLevel:(float)level; 53 +- (void)setBeautyLevel:(float)beautyLevel;
45 54
46 /** 55 /**
47 * 设置美白级别 56 * 设置美白级别
48 * 57 *
49 - * @param level 美白级别,取值范围0 - 9;0表示关闭,1 - 9值越大,效果越明显。 58 + * @param whitenessLevel 美白级别,取值范围0 - 9;0表示关闭,9表示效果最明显。
  59 + */
  60 +- (void)setWhitenessLevel:(float)whitenessLevel;
  61 +
  62 +/**
  63 + * 开启清晰度增强
50 */ 64 */
51 -- (void)setWhitenessLevel:(float)level; 65 +- (void)enableSharpnessEnhancement:(BOOL)enable;
52 66
53 /** 67 /**
54 * 设置红润级别 68 * 设置红润级别
55 * 69 *
56 - * @param level 红润级别,取值范围0 - 9;0表示关闭,1 - 9值越大,效果越明显。 70 + * @param ruddyLevel 红润级别,取值范围0 - 9;0表示关闭,9表示效果最明显。
  71 + */
  72 +- (void)setRuddyLevel:(float)ruddyLevel;
  73 +
  74 +/**
  75 + * 设置色彩滤镜效果
  76 + *
  77 + * 色彩滤镜,是一副包含色彩映射关系的颜色查找表图片,您可以在我们提供的官方 Demo 中找到预先准备好的几张滤镜图片。
  78 + * SDK 会根据该查找表中的映射关系,对摄像头采集出的原始视频画面进行二次处理,以达到预期的滤镜效果。
  79 + * @param image 包含色彩映射关系的颜色查找表图片,必须是 png 格式。
57 */ 80 */
58 -- (void)setRuddyLevel:(float)level; 81 +- (void)setFilter:(nullable TXImage *)image;
59 82
  83 +/**
  84 + * 设置色彩滤镜的强度
  85 + *
  86 + * 该数值越高,色彩滤镜的作用强度越明显,经过滤镜处理后的视频画面跟原画面的颜色差异越大。
  87 + * 我默认的滤镜浓度是0.5,如果您觉得默认的滤镜效果不明显,可以设置为 0.5 以上的数字,最大值为1。
  88 + *
  89 + * @param strength 从0到1,数值越大滤镜效果越明显,默认值为0.5。
  90 + */
  91 +- (void)setFilterStrength:(float)strength;
  92 +
  93 +/**
  94 + * 设置绿幕背景视频,该接口仅在 [企业版 SDK](https://cloud.tencent.com/document/product/647/32689#Enterprise) 中生效
  95 + *
  96 + * 此接口所开启的绿幕功能不具备智能去除背景的能力,需要被拍摄者的背后有一块绿色的幕布来辅助产生特效。
  97 + *
  98 + * @param path MP4格式的视频文件路径; 设置空值表示关闭特效。
  99 + * @return 0:成功;-5:当前 License 对应 feature 不支持。
  100 + */
  101 +- (int)setGreenScreenFile:(nullable NSString *)path;
  102 +
  103 +/**
  104 + * 设置大眼级别,该接口仅在 [企业版 SDK](https://cloud.tencent.com/document/product/647/32689#Enterprise) 中生效
  105 + *
  106 + * @param eyeScaleLevel 大眼级别,取值范围0 - 9;0表示关闭,9表示效果最明显。
  107 + * @return 0:成功;-5:当前 License 对应 feature 不支持。
  108 + */
60 #if TARGET_OS_IPHONE 109 #if TARGET_OS_IPHONE
  110 +- (int)setEyeScaleLevel:(float)eyeScaleLevel;
  111 +#endif
  112 +
61 /** 113 /**
62 - * 设置大眼级别(企业版有效,其它版本设置此参数无效) 114 + * 设置瘦脸级别,该接口仅在 [企业版 SDK](https://cloud.tencent.com/document/product/647/32689#Enterprise) 中生效
63 * 115 *
64 - * @param level 大眼级别,取值范围0 - 9;0表示关闭,1 - 9值越大,效果越明显。 116 + * @param faceSlimLevel 瘦脸级别,取值范围0 - 9;0表示关闭,9表示效果最明显。
  117 + * @return 0:成功;-5:当前 License 对应 feature 不支持。
65 */ 118 */
66 -- (void)setEyeScaleLevel:(float)level; 119 +#if TARGET_OS_IPHONE
  120 +- (int)setFaceSlimLevel:(float)faceSlimLevel;
  121 +#endif
67 122
68 /** 123 /**
69 - * 设置瘦脸级别(企业版有效,其它版本设置此参数无效) 124 + * 设置 V 脸级别,该接口仅在 [企业版 SDK](https://cloud.tencent.com/document/product/647/32689#Enterprise) 中生效
70 * 125 *
71 - * @param level 瘦脸级别,取值范围0 - 9;0表示关闭,1 - 9值越大,效果越明显。 126 + * @param faceVLevel V脸级别,取值范围0 - 9;0表示关闭,9表示效果最明显。
  127 + * @return 0:成功;-5:当前 License 对应 feature 不支持。
72 */ 128 */
73 -- (void)setFaceSlimLevel:(float)level; 129 +#if TARGET_OS_IPHONE
  130 +- (int)setFaceVLevel:(float)faceVLevel;
  131 +#endif
74 132
75 /** 133 /**
76 - * 设置V脸级别(企业版有效,其它版本设置此参数无效) 134 + * 设置下巴拉伸或收缩,该接口仅在 [企业版 SDK](https://cloud.tencent.com/document/product/647/32689#Enterprise) 中生效
77 * 135 *
78 - * @param level V脸级别,取值范围0 - 9;0表示关闭,1 - 9值越大,效果越明显。 136 + * @param chinLevel 下巴拉伸或收缩级别,取值范围-9 - 9;0 表示关闭,小于0表示收缩,大于0表示拉伸。
  137 + * @return 0:成功;-5:当前 License 对应 feature 不支持。
79 */ 138 */
80 -- (void)setFaceVLevel:(float)level; 139 +#if TARGET_OS_IPHONE
  140 +- (int)setChinLevel:(float)chinLevel;
  141 +#endif
81 142
82 /** 143 /**
83 - * 设置下巴拉伸或收缩(企业版有效,其它版本设置此参数无效) 144 + * 设置短脸级别,该接口仅在 [企业版 SDK](https://cloud.tencent.com/document/product/647/32689#Enterprise) 中生效
84 * 145 *
85 - * @param level 下巴拉伸或收缩级别,取值范围-9 - 9;0 表示关闭,小于0表示收缩,大于0表示拉伸。 146 + * @param faceShortLevel 短脸级别,取值范围0 - 9;0表示关闭,9表示效果最明显。
  147 + * @return 0:成功;-5:当前 License 对应 feature 不支持。
86 */ 148 */
87 -- (void)setChinLevel:(float)level; 149 +#if TARGET_OS_IPHONE
  150 +- (int)setFaceShortLevel:(float)faceShortLevel;
  151 +#endif
  152 +
88 /** 153 /**
89 - * 设置短脸级别(企业版有效,其它版本设置此参数无效) 154 + * 设置窄脸级别,该接口仅在 [企业版 SDK](https://cloud.tencent.com/document/product/647/32689#Enterprise) 中生效
90 * 155 *
91 - * @param level 短脸级别,取值范围0 - 9;0表示关闭,1 - 9值越大,效果越明显。 156 + * @param level 窄脸级别,取值范围0 - 9;0表示关闭,9表示效果最明显。
  157 + * @return 0:成功;-5:当前 License 对应 feature 不支持。
92 */ 158 */
93 -- (void)setFaceShortLevel:(float)level; 159 +#if TARGET_OS_IPHONE
  160 +- (int)setFaceNarrowLevel:(float)faceNarrowLevel;
  161 +#endif
94 162
95 /** 163 /**
96 - * 设置瘦鼻级别(企业版有效,其它版本设置此参数无效) 164 + * 设置瘦鼻级别,该接口仅在 [企业版 SDK](https://cloud.tencent.com/document/product/647/32689#Enterprise) 中生效
97 * 165 *
98 - * @param level 瘦鼻级别,取值范围0 - 9;0表示关闭,1 - 9值越大,效果越明显。 166 + * @param noseSlimLevel 瘦鼻级别,取值范围0 - 9;0表示关闭,9表示效果最明显。
  167 + * @return 0:成功;-5:当前 License 对应 feature 不支持。
99 */ 168 */
100 -- (void)setNoseSlimLevel:(float)level; 169 +#if TARGET_OS_IPHONE
  170 +- (int)setNoseSlimLevel:(float)noseSlimLevel;
  171 +#endif
101 172
102 /** 173 /**
103 - * 设置亮眼 (企业版有效,其它版本设置此参数无效) 174 + * 设置亮眼级别,该接口仅在 [企业版 SDK](https://cloud.tencent.com/document/product/647/32689#Enterprise) 中生效
104 * 175 *
105 - * @param level 亮眼级别,取值范围0 - 9;0表示关闭,1 - 9值越大,效果越明显。 176 + * @param eyeLightenLevel 亮眼级别,取值范围0 - 9;0表示关闭,9表示效果最明显。
  177 + * @return 0:成功;-5:当前 License 对应 feature 不支持。
106 */ 178 */
107 -- (void)setEyeLightenLevel:(float)level; 179 +#if TARGET_OS_IPHONE
  180 +- (int)setEyeLightenLevel:(float)eyeLightenLevel;
  181 +#endif
108 182
109 /** 183 /**
110 - * 设置白牙 (企业版有效,其它版本设置此参数无效) 184 + * 设置牙齿美白级别,该接口仅在 [企业版 SDK](https://cloud.tencent.com/document/product/647/32689#Enterprise) 中生效
111 * 185 *
112 - * @param level 白牙级别,取值范围0 - 9;0表示关闭,1 - 9值越大,效果越明显。 186 + * @param toothWhitenLevel 白牙级别,取值范围0 - 9;0表示关闭,9表示效果最明显。
  187 + * @return 0:成功;-5:当前 License 对应 feature 不支持。
113 */ 188 */
114 -- (void)setToothWhitenLevel:(float)level; 189 +#if TARGET_OS_IPHONE
  190 +- (int)setToothWhitenLevel:(float)toothWhitenLevel;
  191 +#endif
115 192
116 /** 193 /**
117 - * 设置祛皱 (企业版有效,其它版本设置此参数无效) 194 + * 设置祛皱级别,该接口仅在 [企业版 SDK](https://cloud.tencent.com/document/product/647/32689#Enterprise) 中生效
118 * 195 *
119 - * @param level 祛皱级别,取值范围0 - 9;0表示关闭,1 - 9值越大,效果越明显。 196 + * @param wrinkleRemoveLevel 祛皱级别,取值范围0 - 9;0表示关闭,9表示效果最明显。
  197 + * @return 0:成功;-5:当前 License 对应 feature 不支持。
120 */ 198 */
121 -- (void)setWrinkleRemoveLevel:(float)level; 199 +#if TARGET_OS_IPHONE
  200 +- (int)setWrinkleRemoveLevel:(float)wrinkleRemoveLevel;
  201 +#endif
122 202
123 /** 203 /**
124 - * 设置祛眼袋 (企业版有效,其它版本设置此参数无效) 204 + * 设置祛眼袋级别,该接口仅在 [企业版 SDK](https://cloud.tencent.com/document/product/647/32689#Enterprise) 中生效
125 * 205 *
126 - * @param level 祛眼袋级别,取值范围0 - 9;0表示关闭,1 - 9值越大,效果越明显。 206 + * @param pounchRemoveLevel 祛眼袋级别,取值范围0 - 9;0表示关闭,9表示效果最明显。
  207 + * @return 0:成功;-5:当前 License 对应 feature 不支持。
127 */ 208 */
128 -- (void)setPounchRemoveLevel:(float)level; 209 +#if TARGET_OS_IPHONE
  210 +- (int)setPounchRemoveLevel:(float)pounchRemoveLevel;
  211 +#endif
129 212
130 /** 213 /**
131 - * 设置法令纹 (企业版有效,其它版本设置此参数无效) 214 + * 设置法令纹去除级别,该接口仅在 [企业版 SDK](https://cloud.tencent.com/document/product/647/32689#Enterprise) 中生效
132 * 215 *
133 - * @param level 法令纹级别,取值范围0 - 9;0表示关闭,1 - 9值越大,效果越明显。 216 + * @param smileLinesRemoveLevel 法令纹级别,取值范围0 - 9;0表示关闭,9表示效果最明显。
  217 + * @return 0:成功;-5:当前 License 对应 feature 不支持。
134 */ 218 */
135 -- (void)setSmileLinesRemoveLevel:(float)level; 219 +#if TARGET_OS_IPHONE
  220 +- (int)setSmileLinesRemoveLevel:(float)smileLinesRemoveLevel;
  221 +#endif
136 222
137 /** 223 /**
138 - * 设置发际线 (企业版有效,其它版本设置此参数无效) 224 + * 设置发际线调整级别,该接口仅在 [企业版 SDK](https://cloud.tencent.com/document/product/647/32689#Enterprise) 中生效
139 * 225 *
140 - * @param level 发际线级别,取值范围-9 - 9;0表示关闭,小于0表示抬高,大于0表示降低。 226 + * @param foreheadLevel 发际线级别,取值范围-9 - 9;0表示关闭,9表示效果最明显。
  227 + * @return 0:成功;-5:当前 License 对应 feature 不支持。
141 */ 228 */
142 -- (void)setForeheadLevel:(float)level; 229 +#if TARGET_OS_IPHONE
  230 +- (int)setForeheadLevel:(float)foreheadLevel;
  231 +#endif
143 232
144 /** 233 /**
145 - * 设置眼距 (企业版有效,其它版本设置此参数无效) 234 + * 设置眼距,该接口仅在 [企业版 SDK](https://cloud.tencent.com/document/product/647/32689#Enterprise) 中生效
146 * 235 *
147 - * @param level 眼距级别,取值范围-9 - 9;0表示关闭,小于0表示拉伸,大于0表示收缩。 236 + * @param eyeDistanceLevel 眼距级别,取值范围-9 - 9;0表示关闭,小于0表示拉伸,大于0表示收缩。
  237 + * @return 0:成功;-5:当前 License 对应 feature 不支持。
148 */ 238 */
149 -- (void)setEyeDistanceLevel:(float)level; 239 +#if TARGET_OS_IPHONE
  240 +- (int)setEyeDistanceLevel:(float)eyeDistanceLevel;
  241 +#endif
150 242
151 /** 243 /**
152 - * 设置眼角 (企业版有效,其它版本设置此参数无效) 244 + * 设置眼角调整级别,该接口仅在 [企业版 SDK](https://cloud.tencent.com/document/product/647/32689#Enterprise) 中生效
153 * 245 *
154 - * @param level 眼角级别,取值范围-9 - 9;0表示关闭,小于0表示降低,大于0表示抬高。 246 + * @param eyeAngleLevel 眼角调整级别,取值范围-9 - 9;0表示关闭,9表示效果最明显。
  247 + * @return 0:成功;-5:当前 License 对应 feature 不支持。
155 */ 248 */
156 -- (void)setEyeAngleLevel:(float)level; 249 +#if TARGET_OS_IPHONE
  250 +- (int)setEyeAngleLevel:(float)eyeAngleLevel;
  251 +#endif
157 252
158 /** 253 /**
159 - * 设置嘴型 (企业版有效,其它版本设置此参数无效) 254 + * 设置嘴型调整级别,该接口仅在 [企业版 SDK](https://cloud.tencent.com/document/product/647/32689#Enterprise) 中生效
160 * 255 *
161 - * @param level 嘴型级别,取值范围-9 - 9;0表示关闭,小于0表示拉伸,大于0表示收缩。 256 + * @param mouthShapeLevel 嘴型级别,取值范围-9 - 9;0表示关闭,小于0表示拉伸,大于0表示收缩。
  257 + * @return 0:成功;-5:当前 License 对应 feature 不支持。
162 */ 258 */
163 -- (void)setMouthShapeLevel:(float)level; 259 +#if TARGET_OS_IPHONE
  260 +- (int)setMouthShapeLevel:(float)mouthShapeLevel;
  261 +#endif
164 262
165 /** 263 /**
166 - * 设置鼻翼 (企业版有效,其它版本设置此参数无效) 264 + * 设置鼻翼调整级别,该接口仅在 [企业版 SDK](https://cloud.tencent.com/document/product/647/32689#Enterprise) 中生效
167 * 265 *
168 - * @param level 鼻翼级别,取值范围-9 - 9;0表示关闭,小于0表示拉伸,大于0表示收缩。 266 + * @param noseWingLevel 鼻翼调整级别,取值范围-9 - 9;0表示关闭,小于0表示拉伸,大于0表示收缩。
  267 + * @return 0:成功;-5:当前 License 对应 feature 不支持。
169 */ 268 */
170 -- (void)setNoseWingLevel:(float)level; 269 +#if TARGET_OS_IPHONE
  270 +- (int)setNoseWingLevel:(float)noseWingLevel;
  271 +#endif
171 272
172 /** 273 /**
173 - * 设置鼻子位置 (企业版有效,其它版本设置此参数无效)  
174 - * @param level 鼻子位置级别,取值范围-9 - 9;0表示关闭,小于0表示抬高,大于0表示降低。 274 + * 设置鼻子位置,该接口仅在 [企业版 SDK](https://cloud.tencent.com/document/product/647/32689#Enterprise) 中生效
  275 + *
  276 + * @param nosePositionLevel 鼻子位置级别,取值范围-9 - 9;0表示关闭,小于0表示抬高,大于0表示降低。
  277 + * @return 0:成功;-5:当前 License 对应 feature 不支持。
175 */ 278 */
176 -- (void)setNosePositionLevel:(float)level; 279 +#if TARGET_OS_IPHONE
  280 +- (int)setNosePositionLevel:(float)nosePositionLevel;
  281 +#endif
177 282
178 /** 283 /**
179 - * 设置嘴唇厚度 (企业版有效,其它版本设置此参数无效)  
180 - * @param level 嘴唇厚度级别,取值范围-9 - 9;0表示关闭,小于0表示拉伸,大于0表示收缩。 284 + * 设置嘴唇厚度,该接口仅在 [企业版 SDK](https://cloud.tencent.com/document/product/647/32689#Enterprise) 中生效
  285 + *
  286 + * @param lipsThicknessLevel 嘴唇厚度级别,取值范围-9 - 9;0表示关闭,小于0表示拉伸,大于0表示收缩。
  287 + * @return 0:成功;-5:当前 License 对应 feature 不支持。
181 */ 288 */
182 -- (void)setLipsThicknessLevel:(float)level; 289 +#if TARGET_OS_IPHONE
  290 +- (int)setLipsThicknessLevel:(float)lipsThicknessLevel;
  291 +#endif
183 292
184 /** 293 /**
185 - * 设置脸型(企业版有效,其它版本设置此参数无效)  
186 - * @param level 美型级别,取值范围0 - 9;0表示关闭,1 - 9值越大,效果越明显。 294 + * 设置脸型,该接口仅在 [企业版 SDK](https://cloud.tencent.com/document/product/647/32689#Enterprise) 中生效
  295 + *
  296 + * @param faceBeautyLevel 美型级别,取值范围0 - 9;0表示关闭,1 - 9值越大,效果越明显。
  297 + * @return 0:成功;-5:当前 License 对应 feature 不支持。
187 */ 298 */
188 -- (void)setFaceBeautyLevel:(float)level; 299 +#if TARGET_OS_IPHONE
  300 +- (int)setFaceBeautyLevel:(float)faceBeautyLevel;
  301 +#endif
189 302
190 /** 303 /**
191 - * 选择 AI 动效挂件(企业版有效,其它版本设置此参数无效) 304 + * 选择 AI 动效挂件,该接口仅在 [企业版 SDK](https://cloud.tencent.com/document/product/647/32689#Enterprise) 中生效
192 * 305 *
193 - * @param tmplName 动效名称  
194 - * @param tmplDir 动效所在目录 306 + * @param tmplName 动效挂件名称
  307 + * @param tmplDir 动效素材文件所在目录
195 */ 308 */
  309 +#if TARGET_OS_IPHONE
196 - (void)setMotionTmpl:(nullable NSString *)tmplName inDir:(nullable NSString *)tmplDir; 310 - (void)setMotionTmpl:(nullable NSString *)tmplName inDir:(nullable NSString *)tmplDir;
  311 +#endif
197 312
198 /** 313 /**
199 - * 设置动效静音(企业版有效,其它版本设置此参数无效)  
200 - * 314 + * 是否在动效素材播放时静音,该接口仅在 [企业版 SDK](https://cloud.tencent.com/document/product/647/32689#Enterprise) 中生效
201 * 有些挂件本身会有声音特效,通过此 API 可以关闭这些特效播放时所带的声音效果。 315 * 有些挂件本身会有声音特效,通过此 API 可以关闭这些特效播放时所带的声音效果。
202 * 316 *
203 * @param motionMute YES:静音;NO:不静音。 317 * @param motionMute YES:静音;NO:不静音。
204 */ 318 */
  319 +#if TARGET_OS_IPHONE
205 - (void)setMotionMute:(BOOL)motionMute; 320 - (void)setMotionMute:(BOOL)motionMute;
206 #endif 321 #endif
207 322
  1 +/**
  2 + * Module: TRTC 音视频设备管理模块
  3 + * Function: 用于管理摄像头、麦克风和扬声器等音视频相关的硬件设备
  4 + */
  5 +/// @defgroup TXDeviceManager_ios TXDeviceManager
  6 +/// TRTC 音视频设备管理模块
  7 +/// @{
  8 +
  9 +#import <Foundation/Foundation.h>
  10 +#if TARGET_OS_IPHONE
  11 +#import <UIKit/UIKit.h>
  12 +#elif TARGET_OS_MAC
  13 +#import <AppKit/AppKit.h>
  14 +#endif
  15 +
  16 +/////////////////////////////////////////////////////////////////////////////////
  17 +//
  18 +// 音视频设备相关的类型定义
  19 +//
  20 +/////////////////////////////////////////////////////////////////////////////////
  21 +/// @name 音视频设备相关的类型定义
  22 +/// @{
  23 +
  24 +/**
  25 + * 系统音量类型(仅适用于移动设备)
  26 + *
  27 + * 现代智能手机中一般都具备两套系统音量类型,即“通话音量”和“媒体音量”。
  28 + * - 通话音量:手机专门为接打电话所设计的音量类型,自带回声抵消(AEC)功能,并且支持通过蓝牙耳机上的麦克风进行拾音,缺点是音质比较一般。
  29 + * 当您通过手机侧面的音量按键下调手机音量时,如果无法将其调至零(也就是无法彻底静音),说明您的手机当前出于通话音量。
  30 + * - 媒体音量:手机专门为音乐场景所设计的音量类型,无法使用系统的 AEC 功能,并且不支持通过蓝牙耳机的麦克风进行拾音,但具备更好的音乐播放效果。
  31 + * 当您通过手机侧面的音量按键下调手机音量时,如果能够将手机音量调至彻底静音,说明您的手机当前出于媒体音量。
  32 + *
  33 + * SDK 目前提供了三种系统音量类型的控制模式:自动切换模式、全程通话音量模式、全程媒体音量模式。
  34 + */
  35 +#if TARGET_OS_IPHONE
  36 +typedef NS_ENUM(NSInteger, TXSystemVolumeType) {
  37 +
  38 + ///自动切换模式:
  39 + ///也被称为“麦上通话,麦下媒体”,即主播上麦时使用通话音量,观众不上麦则使用媒体音量,适合在线直播场景。
  40 + TXSystemVolumeTypeAuto = 0,
  41 +
  42 + ///全程媒体音量:
  43 + ///通话全程使用媒体音量,并不是非常常用的音量类型,适用于对音质要求比较苛刻的音乐场景中。
  44 + ///如果您的用户大都使用外接设备(比如外接声卡)为主,可以使用该模式,否则请慎用。
  45 + TXSystemVolumeTypeMedia = 1,
  46 +
  47 + ///全程通话音量:
  48 + ///该方案的优势在于用户在上下麦时音频模块无需切换工作模式,可以做到无缝上下麦,适合于用户需要频繁上下麦的应用场景。
  49 + TXSystemVolumeTypeVOIP = 2,
  50 +
  51 +};
  52 +#endif
  53 +
  54 +/**
  55 + * 音频路由(即声音的播放模式)
  56 + *
  57 + * 音频路由,即声音是从手机的扬声器还是从听筒中播放出来,因此该接口仅适用于手机等移动端设备。
  58 + * 手机有两个扬声器:一个是位于手机顶部的听筒,一个是位于手机底部的立体声扬声器。
  59 + * - 设置音频路由为听筒时,声音比较小,只有将耳朵凑近才能听清楚,隐私性较好,适合用于接听电话。
  60 + * - 设置音频路由为扬声器时,声音比较大,不用将手机贴脸也能听清,因此可以实现“免提”的功能。
  61 + */
  62 +#if TARGET_OS_IPHONE
  63 +typedef NS_ENUM(NSInteger, TXAudioRoute) {
  64 +
  65 + /// Speakerphone:使用扬声器播放(即“免提”),扬声器位于手机底部,声音偏大,适合外放音乐。
  66 + TXAudioRouteSpeakerphone = 0,
  67 +
  68 + /// Earpiece:使用听筒播放,听筒位于手机顶部,声音偏小,适合需要保护隐私的通话场景。
  69 + TXAudioRouteEarpiece = 1,
  70 +
  71 +};
  72 +#endif
  73 +
  74 +/**
  75 + * 设备类型(仅适用于桌面平台)
  76 + *
  77 + * 该枚举值用于定义三种类型的音视频设备,即摄像头、麦克风和扬声器,以便让一套设备管理接口可以操控三种不同类型的设备。
  78 + */
  79 +#if TARGET_OS_MAC && !TARGET_OS_IPHONE
  80 +typedef NS_ENUM(NSInteger, TXMediaDeviceType) {
  81 + TXMediaDeviceTypeUnknown = -1, ///< undefined device type
  82 + TXMediaDeviceTypeAudioInput = 0, ///< microphone
  83 + TXMediaDeviceTypeAudioOutput = 1, ///< speaker or earpiece
  84 + TXMediaDeviceTypeVideoCamera = 2, ///< camera
  85 +};
  86 +#endif
  87 +
  88 +/**
  89 + * 设备操作
  90 + *
  91 + * 该枚举值用于本地设备的状态变化通知{@link onDeviceChanged}。
  92 + */
  93 +#if TARGET_OS_MAC && !TARGET_OS_IPHONE
  94 +typedef NS_ENUM(NSInteger, TXMediaDeviceState) {
  95 +
  96 + ///设备已被插入
  97 + TXMediaDeviceStateAdd = 0,
  98 +
  99 + ///设备已被移除
  100 + TXMediaDeviceStateRemove = 1,
  101 +
  102 + ///设备已启用
  103 + TXMediaDeviceStateActive = 2,
  104 +
  105 +};
  106 +#endif
  107 +
  108 +/**
  109 + * 音视频设备的相关信息(仅适用于桌面平台)
  110 + *
  111 + * 该结构体用于描述一个音视频设备的关键信息,比如设备ID、设备名称等等,以便用户能够在用户界面上选择自己期望使用的音视频设备。
  112 + */
  113 +#if TARGET_OS_MAC && !TARGET_OS_IPHONE
  114 +@interface TXMediaDeviceInfo : NSObject
  115 +/// device type
  116 +@property(assign, nonatomic) TXMediaDeviceType type;
  117 +/// device id
  118 +@property(copy, nonatomic, nullable) NSString *deviceId;
  119 +/// device name
  120 +@property(copy, nonatomic, nullable) NSString *deviceName;
  121 +/// device properties
  122 +@property(copy, nonatomic, nullable) NSString *deviceProperties;
  123 +@end
  124 +#endif
  125 +/// @}
  126 +
  127 +/**
  128 + * 本地设备的通断状态发生变化(仅适用于桌面系统)
  129 + *
  130 + * 当本地设备(包括摄像头、麦克风以及扬声器)被插入或者拔出时,SDK 便会抛出此事件回调。
  131 + *
  132 + * @param deviceId 设备 ID
  133 + * @param type 设备类型
  134 + * @param state 通断状态,0:设备已添加;1:设备已被移除;2:设备已启用。
  135 + */
  136 +#if TARGET_OS_MAC && !TARGET_OS_IPHONE
  137 +@protocol TXDeviceObserver <NSObject>
  138 +
  139 +- (void)onDeviceChanged:(NSString *)deviceId type:(TXMediaDeviceType)mediaType state:(TXMediaDeviceState)mediaState;
  140 +
  141 +@end
  142 +#endif
  143 +
  144 +@interface TXDeviceManager : NSObject
  145 +
  146 +/////////////////////////////////////////////////////////////////////////////////
  147 +//
  148 +// 移动端设备操作接口(iOS Android)
  149 +//
  150 +/////////////////////////////////////////////////////////////////////////////////
  151 +/// @name 移动端设备操作接口
  152 +/// @{
  153 +
  154 +/**
  155 + * 1.1 判断当前是否为前置摄像头(仅适用于移动端)
  156 + */
  157 +#if TARGET_OS_IPHONE
  158 +- (BOOL)isFrontCamera;
  159 +
  160 +/**
  161 + * 1.2 切换前置或后置摄像头(仅适用于移动端)
  162 + */
  163 +- (NSInteger)switchCamera:(BOOL)frontCamera;
  164 +
  165 +/**
  166 + * 1.3 查询当前摄像头是否支持缩放(仅适用于移动端)
  167 + */
  168 +- (BOOL)isCameraZoomSupported;
  169 +
  170 +/**
  171 + * 1.3 获取摄像头的最大缩放倍数(仅适用于移动端)
  172 + */
  173 +- (CGFloat)getCameraZoomMaxRatio;
  174 +
  175 +/**
  176 + * 1.4 设置摄像头的缩放倍数(仅适用于移动端)
  177 + *
  178 + * @param zoomRatio 取值范围1 - 5,取值为1表示最远视角(正常镜头),取值为5表示最近视角(放大镜头)。
  179 + */
  180 +- (NSInteger)setCameraZoomRatio:(CGFloat)zoomRatio;
  181 +
  182 +/**
  183 + * 1.5 查询是否支持自动识别人脸位置(仅适用于移动端)
  184 + */
  185 +- (BOOL)isAutoFocusEnabled;
  186 +
  187 +/**
  188 + * 1.6 开启自动对焦功能(仅适用于移动端)
  189 + *
  190 + * 开启后,SDK 会自动检测画面中的人脸位置,并将摄像头的焦点始终对焦在人脸位置上。
  191 + */
  192 +- (NSInteger)enableCameraAutoFocus:(BOOL)enabled;
  193 +
  194 +/**
  195 + * 1.7 设置摄像头的对焦位置(仅适用于移动端)
  196 + *
  197 + * 您可以通过该接口实现如下交互:
  198 + * 1. 在本地摄像头的预览画面上,允许用户单击操作。
  199 + * 2. 在用户的单击位置显示一个矩形方框,以示摄像头会在此处对焦。
  200 + * 3. 随后将用户点击位置的坐标通过本接口传递给 SDK,之后 SDK 会操控摄像头按照用户期望的位置进行对焦。
  201 + * @note 使用该接口的前提是先通过 {@link enableCameraAutoFocus} 关闭自动对焦功能。
  202 + * @param position 对焦位置,请传入期望对焦点的坐标值
  203 + * @return 0:操作成功;负数:操作失败。
  204 + */
  205 +- (NSInteger)setCameraFocusPosition:(CGPoint)position;
  206 +
  207 +/**
  208 + * 1.8 查询是否支持开启闪光灯(仅适用于移动端)
  209 + */
  210 +- (BOOL)isCameraTorchSupported;
  211 +
  212 +/**
  213 + * 1.8 开启/关闭闪光灯,也就是手电筒模式(仅适用于移动端)
  214 + */
  215 +- (NSInteger)enableCameraTorch:(BOOL)enabled;
  216 +
  217 +/**
  218 + * 1.9 设置音频路由(仅适用于移动端)
  219 + *
  220 + * 手机有两个音频播放设备:一个是位于手机顶部的听筒,一个是位于手机底部的立体声扬声器。
  221 + * 设置音频路由为听筒时,声音比较小,只有将耳朵凑近才能听清楚,隐私性较好,适合用于接听电话。
  222 + * 设置音频路由为扬声器时,声音比较大,不用将手机贴脸也能听清,因此可以实现“免提”的功能。
  223 + */
  224 +- (NSInteger)setAudioRoute:(TXAudioRoute)route;
  225 +
  226 +/**
  227 + * 1.10 设置系统音量类型(仅适用于移动端)
  228 + */
  229 +- (NSInteger)setSystemVolumeType:(TXSystemVolumeType)type;
  230 +#endif
  231 +
  232 +/// @}
  233 +/////////////////////////////////////////////////////////////////////////////////
  234 +//
  235 +// 桌面端设备操作接口(Windows Mac)
  236 +//
  237 +/////////////////////////////////////////////////////////////////////////////////
  238 +/// @name 桌面端设备操作接口
  239 +/// @{
  240 +
  241 +/**
  242 + * 2.1 获取设备列表(仅适用于桌面端)
  243 + *
  244 + * @param type 设备类型,指定需要获取哪种设备的列表。详见 TXMediaDeviceType 定义。
  245 + * @note
  246 + * - 使用完毕后请调用 release 方法释放资源,这样可以让 SDK 维护 ITXDeviceCollection 对象的生命周期。
  247 + * - 不要使用 delete 释放返回的 Collection 对象,delete ITXDeviceCollection* 指针会导致异常崩溃。
  248 + * - type 只支持 TXMediaDeviceTypeMic、TXMediaDeviceTypeSpeaker、TXMediaDeviceTypeCamera。
  249 + * - 此接口只支持 Mac 和 Windows 平台
  250 + */
  251 +#if !TARGET_OS_IPHONE && TARGET_OS_MAC
  252 +- (NSArray<TXMediaDeviceInfo *> *_Nullable)getDevicesList:(TXMediaDeviceType)type;
  253 +
  254 +/**
  255 + * 2.2 设置当前要使用的设备(仅适用于桌面端)
  256 + *
  257 + * @param type 设备类型,详见 TXMediaDeviceType 定义。
  258 + * @param deviceId 设备ID,您可以通过接口 {@link getDevicesList} 获得设备 ID。
  259 + * @return 0:操作成功;负数:操作失败。
  260 + */
  261 +- (NSInteger)setCurrentDevice:(TXMediaDeviceType)type deviceId:(NSString *)deviceId;
  262 +
  263 +/**
  264 + * 2.3 获取当前正在使用的设备(仅适用于桌面端)
  265 + */
  266 +- (TXMediaDeviceInfo *_Nullable)getCurrentDevice:(TXMediaDeviceType)type;
  267 +
  268 +/**
  269 + * 2.4 设置当前设备的音量(仅适用于桌面端)
  270 + *
  271 + * 这里的音量指的是麦克风的采集音量或者扬声器的播放音量,摄像头是不支持设置音量的。
  272 + *
  273 + * @param volume 音量大小,取值范围为0 - 100,默认值:100。
  274 + * @note 如果将 volume 设置成 100 之后感觉音量还是太小,可以将 volume 最大设置成 150,但超过 100 的 volume 会有爆音的风险,请谨慎操作。
  275 + */
  276 +- (NSInteger)setCurrentDeviceVolume:(NSInteger)volume deviceType:(TXMediaDeviceType)type;
  277 +
  278 +/**
  279 + * 2.5 获取当前设备的音量(仅适用于桌面端)
  280 + *
  281 + * 这里的音量指的是麦克风的采集音量或者扬声器的播放音量,摄像头是不支持获取音量的。
  282 + */
  283 +- (NSInteger)getCurrentDeviceVolume:(TXMediaDeviceType)type;
  284 +
  285 +/**
  286 + * 2.6 设置当前设备的静音状态(仅适用于桌面端)
  287 + *
  288 + * 这里的音量指的是麦克风和扬声器,摄像头是不支持静音操作的。
  289 + */
  290 +- (NSInteger)setCurrentDeviceMute:(BOOL)mute deviceType:(TXMediaDeviceType)type;
  291 +
  292 +/**
  293 + * 2.7 获取当前设备的静音状态(仅适用于桌面端)
  294 + *
  295 + * 这里的音量指的是麦克风和扬声器,摄像头是不支持静音操作的。
  296 + */
  297 +- (BOOL)getCurrentDeviceMute:(TXMediaDeviceType)type;
  298 +
  299 +/**
  300 + * 2.8 开始摄像头测试(仅适用于桌面端)
  301 + *
  302 + * @note 在测试过程中可以使用 {@link setCurrentDevice} 接口切换摄像头。
  303 + */
  304 +- (NSInteger)startCameraDeviceTest:(NSView *)view;
  305 +
  306 +/**
  307 + * 2.9 结束摄像头测试(仅适用于桌面端)
  308 + */
  309 +- (NSInteger)stopCameraDeviceTest;
  310 +
  311 +/**
  312 + * 2.10 开始麦克风测试(仅适用于桌面端)
  313 + *
  314 + * 该接口可以测试麦克风是否能正常工作,测试到的麦克风采集音量的大小,会以回调的形式通知给您,其中 volume 的取值范围为0 - 100。
  315 + * @param interval 麦克风音量的回调间隔。
  316 + */
  317 +- (NSInteger)startMicDeviceTest:(NSInteger)interval testEcho:(void (^)(NSInteger volume))testEcho;
  318 +
  319 +/**
  320 + * 2.11 结束麦克风测试(仅适用于桌面端)
  321 + */
  322 +- (NSInteger)stopMicDeviceTest;
  323 +
  324 +/**
  325 + * 2.12 开始扬声器测试(仅适用于桌面端)
  326 + *
  327 + * 该接口通过播放指定的音频文件,用于测试播放设备是否能正常工作。如果用户在测试时能听到声音,说明播放设备能正常工作。
  328 + * @param filePath 声音文件的路径
  329 + */
  330 +- (NSInteger)startSpeakerDeviceTest:(NSString *)audioFilePath onVolumeChanged:(void (^)(NSInteger volume, BOOL isLastFrame))volumeBlock;
  331 +
  332 +/**
  333 + * 2.13 结束扬声器测试(仅适用于桌面端)
  334 + */
  335 +- (NSInteger)stopSpeakerDeviceTest;
  336 +
  337 +/**
  338 + * 2.14 设备热插拔回调(仅适用于 Mac 系统)
  339 + */
  340 +- (void)setObserver:(nullable id<TXDeviceObserver>)observer;
  341 +#endif
  342 +
  343 +/// @}
  344 +@end
  345 +/// @}
  1 +
  2 +
  3 +#ifndef TXLiteAVBuffer_h
  4 +#define TXLiteAVBuffer_h
  5 +
  6 +#include <stdio.h>
  7 +#include <stdlib.h>
  8 +#include <stdint.h>
  9 +
  10 +namespace liteav {
  11 +
  12 +/**
  13 + * Buffer 数据类型
  14 + */
  15 +class TXLiteAVBuffer {
  16 +
  17 +public:
  18 + virtual ~TXLiteAVBuffer() {}
  19 +
  20 + /**
  21 + * 获取 buffer 的内存地址
  22 + */
  23 + virtual uint8_t * data() = 0;
  24 +
  25 + /**
  26 + * 获取 buffer 的内存地址
  27 + */
  28 + virtual const uint8_t * cdata() const = 0;
  29 +
  30 + /**
  31 + * 获取 buffer 的内存size
  32 + */
  33 + virtual size_t size() const = 0;
  34 +
  35 + /**
  36 + * 设置 buffe 的有效数据 size
  37 + * 如果此 size 超过当前 capacity,会造成重新分配内存,并复制数据
  38 + */
  39 + virtual void SetSize(size_t size) = 0;
  40 +
  41 + /**
  42 + * 确保 buffer 分配的内存空间足够,不用多次分配拷贝内存。此方法会引起内存分配,data / cdata 方法获取的指针失效
  43 + * @param capacity buffer 预分配的内存size
  44 + */
  45 + virtual void EnsureCapacity(size_t capacity) = 0;
  46 +};
  47 +}
  48 +
  49 +#endif /* TXLiteAVBuffer_h */
@@ -22,15 +22,18 @@ typedef enum TXLiteAVError @@ -22,15 +22,18 @@ typedef enum TXLiteAVError
22 // NOTE: 通过回调函数 TRTCCloudDelegate##onEnterRoom() 和 TRTCCloudDelegate##OnError() 通知 22 // NOTE: 通过回调函数 TRTCCloudDelegate##onEnterRoom() 和 TRTCCloudDelegate##OnError() 通知
23 // 23 //
24 ///////////////////////////////////////////////////////////////////////////////// 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 - 25 + ERR_ROOM_ENTER_FAIL = -3301, ///< 进入房间失败,请查看 onError 中的 -3301 对应的 msg 提示确认失败原因
  26 + ERR_ROOM_REQUEST_IP_TIMEOUT = -3307, ///< 请求 IP 和 sig 超时,请检查网络是否正常,或网络防火墙是否放行 UDP。可尝试访问下列 IP:162.14.22.165:8000 162.14.6.105:8000 和域名:default-query.trtc.tencent-cloud.com:8000
  27 + ERR_ROOM_REQUEST_ENTER_ROOM_TIMEOUT = -3308, ///< 请求进房超时,请检查是否断网或者是否开启vpn,您也可以切换4G进行测试确认
  28 + ERR_ENTER_ROOM_PARAM_NULL = -3316, ///< 进房参数为空,请检查: enterRoom:appScene: 接口调用是否传入有效的 param
  29 + ERR_SDK_APPID_INVALID = -3317, ///< 进房参数 sdkAppId 错误,请检查 TRTCParams.sdkAppId 是否为空
  30 + ERR_ROOM_ID_INVALID = -3318, ///< 进房参数 roomId 错误,请检查 TRTCParams.roomId 或 TRTCParams.strRoomId 是否为空,注意 roomId 和 strRoomId 不可混用
  31 + ERR_USER_ID_INVALID = -3319, ///< 进房参数 userId 不正确,请检查 TRTCParams.userId 是否为空
  32 + ERR_USER_SIG_INVALID = -3320, ///< 进房参数 userSig 不正确,请检查 TRTCParams.userSig 是否为空
  33 + ERR_ROOM_REQUEST_ENTER_ROOM_REFUSED = -3340, ///< 进房请求被拒绝,请检查是否连续调用 enterRoom 进入相同 Id 的房间
  34 + ERR_SERVER_INFO_PRIVILEGE_FLAG_ERROR = -100006, ///< 您开启了高级权限控制,但参数 TRTCParams.privateMapKey 校验失败,您可参考 https://cloud.tencent.com/document/product/647/32240 进行检查
  35 + ERR_SERVER_INFO_SERVICE_SUSPENDED = -100013, ///< 服务不可用。请检查:套餐包剩余分钟数是否大于0,腾讯云账号是否欠费。您可参考 https://cloud.tencent.com/document/product/647/50492 进行查看与配置
  36 + ERR_SERVER_INFO_ECDH_GET_TINYID = -100018, ///< UserSig 校验失败,请检查参数 TRTCParams.userSig 是否填写正确,或是否已经过期。您可参考 https://cloud.tencent.com/document/product/647/50686 进行校验
34 37
35 ///////////////////////////////////////////////////////////////////////////////// 38 /////////////////////////////////////////////////////////////////////////////////
36 // 39 //
@@ -40,11 +43,11 @@ typedef enum TXLiteAVError @@ -40,11 +43,11 @@ typedef enum TXLiteAVError
40 ///////////////////////////////////////////////////////////////////////////////// 43 /////////////////////////////////////////////////////////////////////////////////
41 ERR_ROOM_REQUEST_QUIT_ROOM_TIMEOUT = -3325, ///< 请求退房超时 44 ERR_ROOM_REQUEST_QUIT_ROOM_TIMEOUT = -3325, ///< 请求退房超时
42 45
43 -  
44 ///////////////////////////////////////////////////////////////////////////////// 46 /////////////////////////////////////////////////////////////////////////////////
45 // 47 //
46 // 设备(摄像头、麦克风、扬声器)相关错误码 48 // 设备(摄像头、麦克风、扬声器)相关错误码
47 // NOTE: 通过回调函数 TRTCCloudDelegate##OnError() 通知 49 // NOTE: 通过回调函数 TRTCCloudDelegate##OnError() 通知
  50 + // 区段:-6000 ~ -6999
48 // 51 //
49 ///////////////////////////////////////////////////////////////////////////////// 52 /////////////////////////////////////////////////////////////////////////////////
50 ERR_CAMERA_START_FAIL = -1301, ///< 打开摄像头失败,例如在 Windows 或 Mac 设备,摄像头的配置程序(驱动程序)异常,禁用后重新启用设备,或者重启机器,或者更新配置程序 53 ERR_CAMERA_START_FAIL = -1301, ///< 打开摄像头失败,例如在 Windows 或 Mac 设备,摄像头的配置程序(驱动程序)异常,禁用后重新启用设备,或者重启机器,或者更新配置程序
@@ -60,6 +63,15 @@ typedef enum TXLiteAVError @@ -60,6 +63,15 @@ typedef enum TXLiteAVError
60 ERR_SPEAKER_SET_PARAM_FAIL = -1322, ///< 扬声器设置参数失败 63 ERR_SPEAKER_SET_PARAM_FAIL = -1322, ///< 扬声器设置参数失败
61 ERR_SPEAKER_STOP_FAIL = -1323, ///< 停止扬声器失败 64 ERR_SPEAKER_STOP_FAIL = -1323, ///< 停止扬声器失败
62 65
  66 + /////////////////////////////////////////////////////////////////////////////////
  67 + //
  68 + // 系统声音采集相关错误码
  69 + // NOTE: 通过回调函数 TRTCCloudDelegate##onSystemAudioLoopbackError() 通知
  70 + //
  71 + /////////////////////////////////////////////////////////////////////////////////
  72 + ERR_AUDIO_PLUGIN_START_FAIL = -1330, ///< 开启系统声音录制失败,例如音频驱动插件不可用
  73 + ERR_AUDIO_PLUGIN_INSTALL_NOT_AUTHORIZED = -1331, ///< 安装音频驱动插件未授权
  74 + ERR_AUDIO_PLUGIN_INSTALL_FAILED = -1332, ///< 安装音频驱动插件失败
63 75
64 ///////////////////////////////////////////////////////////////////////////////// 76 /////////////////////////////////////////////////////////////////////////////////
65 // 77 //
@@ -68,10 +80,10 @@ typedef enum TXLiteAVError @@ -68,10 +80,10 @@ typedef enum TXLiteAVError
68 // 80 //
69 ///////////////////////////////////////////////////////////////////////////////// 81 /////////////////////////////////////////////////////////////////////////////////
70 ERR_SCREEN_CAPTURE_START_FAIL = -1308, ///< 开始录屏失败,如果在移动设备出现,可能是权限被用户拒绝了,如果在 Windows 或 Mac 系统的设备出现,请检查录屏接口的参数是否符合要求 82 ERR_SCREEN_CAPTURE_START_FAIL = -1308, ///< 开始录屏失败,如果在移动设备出现,可能是权限被用户拒绝了,如果在 Windows 或 Mac 系统的设备出现,请检查录屏接口的参数是否符合要求
71 - ERR_SCREEN_CAPTURE_UNSURPORT = -1309, ///< 录屏失败,在 Android 平台,需要5.0以上的系统 83 + ERR_SCREEN_CAPTURE_UNSURPORT = -1309, ///< 录屏失败,在 Android 平台,需要5.0以上的系统,在 iOS 平台,需要11.0以上的系统
72 ERR_SERVER_CENTER_NO_PRIVILEDGE_PUSH_SUB_VIDEO = -102015, ///< 没有权限上行辅路 84 ERR_SERVER_CENTER_NO_PRIVILEDGE_PUSH_SUB_VIDEO = -102015, ///< 没有权限上行辅路
73 ERR_SERVER_CENTER_ANOTHER_USER_PUSH_SUB_VIDEO = -102016, ///< 其他用户正在上行辅路 85 ERR_SERVER_CENTER_ANOTHER_USER_PUSH_SUB_VIDEO = -102016, ///< 其他用户正在上行辅路
74 - 86 + ERR_SCREEN_CAPTURE_STOPPED = -7001, ///< 录屏被系统中止
75 87
76 ///////////////////////////////////////////////////////////////////////////////// 88 /////////////////////////////////////////////////////////////////////////////////
77 // 89 //
@@ -84,7 +96,6 @@ typedef enum TXLiteAVError @@ -84,7 +96,6 @@ typedef enum TXLiteAVError
84 ERR_AUDIO_ENCODE_FAIL = -1304, ///< 音频帧编码失败,例如传入自定义音频数据,SDK 无法处理 96 ERR_AUDIO_ENCODE_FAIL = -1304, ///< 音频帧编码失败,例如传入自定义音频数据,SDK 无法处理
85 ERR_UNSUPPORTED_SAMPLERATE = -1306, ///< 不支持的音频采样率 97 ERR_UNSUPPORTED_SAMPLERATE = -1306, ///< 不支持的音频采样率
86 98
87 -  
88 ///////////////////////////////////////////////////////////////////////////////// 99 /////////////////////////////////////////////////////////////////////////////////
89 // 100 //
90 // 自定义采集相关错误码 101 // 自定义采集相关错误码
@@ -94,7 +105,6 @@ typedef enum TXLiteAVError @@ -94,7 +105,6 @@ typedef enum TXLiteAVError
94 ERR_PIXEL_FORMAT_UNSUPPORTED = -1327, ///< 设置的 pixel format 不支持 105 ERR_PIXEL_FORMAT_UNSUPPORTED = -1327, ///< 设置的 pixel format 不支持
95 ERR_BUFFER_TYPE_UNSUPPORTED = -1328, ///< 设置的 buffer type 不支持 106 ERR_BUFFER_TYPE_UNSUPPORTED = -1328, ///< 设置的 buffer type 不支持
96 107
97 -  
98 ///////////////////////////////////////////////////////////////////////////////// 108 /////////////////////////////////////////////////////////////////////////////////
99 // 109 //
100 // CDN 绑定和混流相关错误码 110 // CDN 绑定和混流相关错误码
@@ -110,7 +120,6 @@ typedef enum TXLiteAVError @@ -110,7 +120,6 @@ typedef enum TXLiteAVError
110 ERR_ROOM_REQUEST_STOP_PUBLISHING_TIMEOUT = -3335, ///< 停止向腾讯云的直播 CDN 推流信令超时 120 ERR_ROOM_REQUEST_STOP_PUBLISHING_TIMEOUT = -3335, ///< 停止向腾讯云的直播 CDN 推流信令超时
111 ERR_ROOM_REQUEST_STOP_PUBLISHING_ERROR = -3336, ///< 停止向腾讯云的直播 CDN 推流信令异常 121 ERR_ROOM_REQUEST_STOP_PUBLISHING_ERROR = -3336, ///< 停止向腾讯云的直播 CDN 推流信令异常
112 122
113 -  
114 ///////////////////////////////////////////////////////////////////////////////// 123 /////////////////////////////////////////////////////////////////////////////////
115 // 124 //
116 // 跨房连麦(ConnectOtherRoom)相关错误码 125 // 跨房连麦(ConnectOtherRoom)相关错误码
@@ -143,7 +152,6 @@ typedef enum TXLiteAVError @@ -143,7 +152,6 @@ typedef enum TXLiteAVError
143 ERR_SERVER_CENTER_CONN_ROOM_CONNED_USER_FULL = -102050, ///< 被连麦用户达到资源上限 152 ERR_SERVER_CENTER_CONN_ROOM_CONNED_USER_FULL = -102050, ///< 被连麦用户达到资源上限
144 ERR_SERVER_CENTER_CONN_ROOM_INVALID_SEQ = -102051, ///< 连麦请求序号错乱 153 ERR_SERVER_CENTER_CONN_ROOM_INVALID_SEQ = -102051, ///< 连麦请求序号错乱
145 154
146 -  
147 ///////////////////////////////////////////////////////////////////////////////// 155 /////////////////////////////////////////////////////////////////////////////////
148 // 156 //
149 // 客户无需关心的内部错误码 157 // 客户无需关心的内部错误码
@@ -166,13 +174,15 @@ typedef enum TXLiteAVError @@ -166,13 +174,15 @@ typedef enum TXLiteAVError
166 ERR_PLAY_LIVE_STREAM_SWITCH_FAIL = -2307, ///< 直播,切流失败(切流可以播放不同画面大小的视频) 174 ERR_PLAY_LIVE_STREAM_SWITCH_FAIL = -2307, ///< 直播,切流失败(切流可以播放不同画面大小的视频)
167 ERR_PLAY_LIVE_STREAM_SERVER_REFUSE = -2308, ///< 直播,服务器拒绝连接请求 175 ERR_PLAY_LIVE_STREAM_SERVER_REFUSE = -2308, ///< 直播,服务器拒绝连接请求
168 ERR_RTMP_ACC_FETCH_STREAM_FAIL = -2309, ///< 直播,RTMPACC 低延时拉流失败,且经过多次重试无法恢复 176 ERR_RTMP_ACC_FETCH_STREAM_FAIL = -2309, ///< 直播,RTMPACC 低延时拉流失败,且经过多次重试无法恢复
  177 + ERR_HEVC_ENCODE_FAIL = -2310, ///< 265编码失败
  178 + ERR_HEVC_ENCODE_NOT_SUPPORT = -2311, ///< 265编码判断不支持
  179 + ERR_HEVC_SOFTDECODER_START_FAIL = -2312, ///< 265软解启动失败
169 180
170 ERR_ROOM_HEARTBEAT_FAIL = -3302, ///< 心跳失败,客户端定时向服务器发送数据包,告诉服务器自己活着,这个错误通常是发包超时 181 ERR_ROOM_HEARTBEAT_FAIL = -3302, ///< 心跳失败,客户端定时向服务器发送数据包,告诉服务器自己活着,这个错误通常是发包超时
171 ERR_ROOM_REQUEST_IP_FAIL = -3303, ///< 拉取接口机服务器地址失败 182 ERR_ROOM_REQUEST_IP_FAIL = -3303, ///< 拉取接口机服务器地址失败
172 ERR_ROOM_CONNECT_FAIL = -3304, ///< 连接接口机服务器失败 183 ERR_ROOM_CONNECT_FAIL = -3304, ///< 连接接口机服务器失败
173 ERR_ROOM_REQUEST_AVSEAT_FAIL = -3305, ///< 请求视频位失败 184 ERR_ROOM_REQUEST_AVSEAT_FAIL = -3305, ///< 请求视频位失败
174 ERR_ROOM_REQUEST_TOKEN_HTTPS_TIMEOUT = -3306, ///< 请求 token HTTPS 超时,请检查网络是否正常,或网络防火墙是否放行 HTTPS 访问 official.opensso.tencent-cloud.com:443 185 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, ///< 请求视频位超时 186 ERR_ROOM_REQUEST_VIDEO_FLAG_TIMEOUT = -3309, ///< 请求视频位超时
177 ERR_ROOM_REQUEST_VIDEO_DATA_ROOM_TIMEOUT = -3310, ///< 请求视频数据超时 187 ERR_ROOM_REQUEST_VIDEO_DATA_ROOM_TIMEOUT = -3310, ///< 请求视频数据超时
178 ERR_ROOM_REQUEST_CHANGE_ABILITY_TIMEOUT = -3311, ///< 请求修改视频能力项超时 188 ERR_ROOM_REQUEST_CHANGE_ABILITY_TIMEOUT = -3311, ///< 请求修改视频能力项超时
@@ -180,6 +190,7 @@ typedef enum TXLiteAVError @@ -180,6 +190,7 @@ typedef enum TXLiteAVError
180 ERR_ROOM_REQUEST_CLOSE_VIDEO_TIMEOUT = -3313, ///< 请求关闭视频超时 190 ERR_ROOM_REQUEST_CLOSE_VIDEO_TIMEOUT = -3313, ///< 请求关闭视频超时
181 ERR_ROOM_REQUEST_SET_RECEIVE_TIMEOUT = -3314, ///< 请求接收视频项超时 191 ERR_ROOM_REQUEST_SET_RECEIVE_TIMEOUT = -3314, ///< 请求接收视频项超时
182 ERR_ROOM_REQUEST_TOKEN_INVALID_PARAMETER = -3315, ///< 请求 token 无效参数,请检查 TRTCParams.userSig 是否填写正确 192 ERR_ROOM_REQUEST_TOKEN_INVALID_PARAMETER = -3315, ///< 请求 token 无效参数,请检查 TRTCParams.userSig 是否填写正确
  193 + ERR_ROOM_REQUEST_EXIT_ROOM_WHEN_ENTERING_ROOM = -3341, ///< 进房尚未成功时,收到了退房请求
183 194
184 ERR_ROOM_REQUEST_AES_TOKEN_RETURN_ERROR = -3329, ///< 请求 AES TOKEN 时,server 返回的内容是空的 195 ERR_ROOM_REQUEST_AES_TOKEN_RETURN_ERROR = -3329, ///< 请求 AES TOKEN 时,server 返回的内容是空的
185 ERR_ACCIP_LIST_EMPTY = -3331, ///< 请求接口机 IP 返回的列表为空的 196 ERR_ACCIP_LIST_EMPTY = -3331, ///< 请求接口机 IP 返回的列表为空的
@@ -192,7 +203,6 @@ typedef enum TXLiteAVError @@ -192,7 +203,6 @@ typedef enum TXLiteAVError
192 ERR_SERVER_INFO_GENERATE_SIGN_FAILED = -100003, ///< 生成签名错误 203 ERR_SERVER_INFO_GENERATE_SIGN_FAILED = -100003, ///< 生成签名错误
193 ERR_SERVER_INFO_TOKEN_TIMEOUT = -100004, ///< HTTPS token 超时 204 ERR_SERVER_INFO_TOKEN_TIMEOUT = -100004, ///< HTTPS token 超时
194 ERR_SERVER_INFO_INVALID_COMMAND = -100005, ///< 无效的命令字 205 ERR_SERVER_INFO_INVALID_COMMAND = -100005, ///< 无效的命令字
195 - ERR_SERVER_INFO_PRIVILEGE_FLAG_ERROR = -100006, ///< 权限位校验失败  
196 ERR_SERVER_INFO_GENERATE_KEN_ERROR = -100007, ///< HTTPS 请求时,生成加密 key 错误 206 ERR_SERVER_INFO_GENERATE_KEN_ERROR = -100007, ///< HTTPS 请求时,生成加密 key 错误
197 ERR_SERVER_INFO_GENERATE_TOKEN_ERROR = -100008, ///< HTTPS 请求时,生成 token 错误 207 ERR_SERVER_INFO_GENERATE_TOKEN_ERROR = -100008, ///< HTTPS 请求时,生成 token 错误
198 ERR_SERVER_INFO_DATABASE = -100009, ///< 数据库查询失败(房间相关存储信息) 208 ERR_SERVER_INFO_DATABASE = -100009, ///< 数据库查询失败(房间相关存储信息)
@@ -203,7 +213,6 @@ typedef enum TXLiteAVError @@ -203,7 +213,6 @@ typedef enum TXLiteAVError
203 ERR_SERVER_INFO_LACK_SDKAPPID = -100015, ///< 非法SDKAppid 213 ERR_SERVER_INFO_LACK_SDKAPPID = -100015, ///< 非法SDKAppid
204 ERR_SERVER_INFO_INVALID = -100016, ///< 无效请求, 分配接口机失败 214 ERR_SERVER_INFO_INVALID = -100016, ///< 无效请求, 分配接口机失败
205 ERR_SERVER_INFO_ECDH_GET_KEY = -100017, ///< 生成公钥失败 215 ERR_SERVER_INFO_ECDH_GET_KEY = -100017, ///< 生成公钥失败
206 - ERR_SERVER_INFO_ECDH_GET_TINYID = -100018, ///< userSig 校验失败,请检查 TRTCParams.userSig 是否填写正确  
207 216
208 // Access 接口机 217 // Access 接口机
209 ERR_SERVER_ACC_TOKEN_TIMEOUT = -101000, ///< token 过期 218 ERR_SERVER_ACC_TOKEN_TIMEOUT = -101000, ///< token 过期
@@ -274,6 +283,13 @@ typedef enum TXLiteAVError @@ -274,6 +283,13 @@ typedef enum TXLiteAVError
274 ERR_SERVER_SSO_TICKET_EXPIRED = -70347, ///< 票据因过期原因校验失败 283 ERR_SERVER_SSO_TICKET_EXPIRED = -70347, ///< 票据因过期原因校验失败
275 ERR_SERVER_SSO_ACCOUNT_EXCEED_PURCHASES = -70398, ///< 创建账号数量超过已购买预付费数量限制 284 ERR_SERVER_SSO_ACCOUNT_EXCEED_PURCHASES = -70398, ///< 创建账号数量超过已购买预付费数量限制
276 ERR_SERVER_SSO_INTERNAL_ERROR = -70500, ///< 服务器内部错误,请重试 285 ERR_SERVER_SSO_INTERNAL_ERROR = -70500, ///< 服务器内部错误,请重试
  286 +
  287 + //秒级监控上报错误码
  288 + ERR_REQUEST_QUERY_CONFIG_TIMEOUT = -4001, ///< 请求通用配置超时
  289 + ERR_CUSTOM_STREAM_INVALID = -4002, ///< 自定义流id错误
  290 + ERR_USER_DEFINE_RECORD_ID_INVALID = -4003, ///< userDefineRecordId错误
  291 + ERR_MIX_PARAM_INVALID = -4004, ///< 混流参数校验失败
  292 + ERR_REQUEST_ACC_BY_HOST_IP = -4005, ///< 通过域名进行0x1请求
277 // - /Remove From Head 293 // - /Remove From Head
278 } TXLiteAVError; 294 } TXLiteAVError;
279 295
@@ -288,10 +304,19 @@ typedef enum TXLiteAVError @@ -288,10 +304,19 @@ typedef enum TXLiteAVError
288 typedef enum TXLiteAVWarning 304 typedef enum TXLiteAVWarning
289 { 305 {
290 WARNING_HW_ENCODER_START_FAIL = 1103, ///< 硬编码启动出现问题,自动切换到软编码 306 WARNING_HW_ENCODER_START_FAIL = 1103, ///< 硬编码启动出现问题,自动切换到软编码
  307 + WARNING_CURRENT_ENCODE_TYPE_CHANGED = 1104, ///< 当前编码格式, 通过key 为type获取,值为1时是265编码,值为0时是264编码
291 WARNING_VIDEO_ENCODER_SW_TO_HW = 1107, ///< 当前 CPU 使用率太高,无法满足软件编码需求,自动切换到硬件编码 308 WARNING_VIDEO_ENCODER_SW_TO_HW = 1107, ///< 当前 CPU 使用率太高,无法满足软件编码需求,自动切换到硬件编码
292 WARNING_INSUFFICIENT_CAPTURE_FPS = 1108, ///< 摄像头采集帧率不足,部分自带美颜算法的 Android 手机上会出现 309 WARNING_INSUFFICIENT_CAPTURE_FPS = 1108, ///< 摄像头采集帧率不足,部分自带美颜算法的 Android 手机上会出现
293 WARNING_SW_ENCODER_START_FAIL = 1109, ///< 软编码启动失败 310 WARNING_SW_ENCODER_START_FAIL = 1109, ///< 软编码启动失败
294 WARNING_REDUCE_CAPTURE_RESOLUTION = 1110, ///< 摄像头采集分辨率被降低,以满足当前帧率和性能最优解。 311 WARNING_REDUCE_CAPTURE_RESOLUTION = 1110, ///< 摄像头采集分辨率被降低,以满足当前帧率和性能最优解。
  312 + WARNING_CAMERA_DEVICE_EMPTY = 1111, ///< 没有检测到可用的摄像头设备
  313 + WARNING_CAMERA_NOT_AUTHORIZED = 1112, ///< 用户未授权当前应用使用摄像头
  314 + WARNING_MICROPHONE_DEVICE_EMPTY = 1201, ///< 没有检测到可用的麦克风设备
  315 + WARNING_SPEAKER_DEVICE_EMPTY = 1202, ///< 没有检测到可用的扬声器设备
  316 + WARNING_MICROPHONE_NOT_AUTHORIZED = 1203, ///< 用户未授权当前应用使用麦克风
  317 + WARNING_MICROPHONE_DEVICE_ABNORMAL = 1204, ///< 音频采集设备不可用(例如被占用或者PC判定无效设备)
  318 + WARNING_SPEAKER_DEVICE_ABNORMAL = 1205, ///< 音频播放设备不可用(例如被占用或者PC判定无效设备)
  319 + WARNING_SCREEN_CAPTURE_NOT_AUTHORIZED = 1206, ///< 用户未授权当前应用使用屏幕录制
295 WARNING_VIDEO_FRAME_DECODE_FAIL = 2101, ///< 当前视频帧解码失败 320 WARNING_VIDEO_FRAME_DECODE_FAIL = 2101, ///< 当前视频帧解码失败
296 WARNING_AUDIO_FRAME_DECODE_FAIL = 2102, ///< 当前音频帧解码失败 321 WARNING_AUDIO_FRAME_DECODE_FAIL = 2102, ///< 当前音频帧解码失败
297 WARNING_VIDEO_PLAY_LAG = 2105, ///< 当前视频播放出现卡顿 322 WARNING_VIDEO_PLAY_LAG = 2105, ///< 当前视频播放出现卡顿
@@ -299,6 +324,7 @@ typedef enum TXLiteAVWarning @@ -299,6 +324,7 @@ typedef enum TXLiteAVWarning
299 WARNING_VIDEO_DECODER_HW_TO_SW = 2108, ///< 当前流硬解第一个 I 帧失败,SDK 自动切软解 324 WARNING_VIDEO_DECODER_HW_TO_SW = 2108, ///< 当前流硬解第一个 I 帧失败,SDK 自动切软解
300 WARNING_SW_DECODER_START_FAIL = 2109, ///< 软解码器启动失败 325 WARNING_SW_DECODER_START_FAIL = 2109, ///< 软解码器启动失败
301 WARNING_VIDEO_RENDER_FAIL = 2110, ///< 视频渲染失败 326 WARNING_VIDEO_RENDER_FAIL = 2110, ///< 视频渲染失败
  327 + WARNING_START_CAPTURE_IGNORED = 4000, ///< 已经在采集,启动采集被忽略
302 WARNING_AUDIO_RECORDING_WRITE_FAIL = 7001, ///< 音频录制写入文件失败 328 WARNING_AUDIO_RECORDING_WRITE_FAIL = 7001, ///< 音频录制写入文件失败
303 WARNING_ROOM_DISCONNECT = 5101, ///< 网络断开连接 329 WARNING_ROOM_DISCONNECT = 5101, ///< 网络断开连接
304 WARNING_IGNORE_UPSTREAM_FOR_AUDIENCE = 6001, ///< 当前是观众角色,忽略上行音视频数据 330 WARNING_IGNORE_UPSTREAM_FOR_AUDIENCE = 6001, ///< 当前是观众角色,忽略上行音视频数据
@@ -379,6 +405,10 @@ typedef enum TXLiteAVEvent @@ -379,6 +405,10 @@ typedef enum TXLiteAVEvent
379 EVT_MIC_START_SUCC = 2027, ///< 麦克风启动成功 405 EVT_MIC_START_SUCC = 2027, ///< 麦克风启动成功
380 EVT_PLAY_GET_METADATA = 2028, ///< 视频流MetaData事件 406 EVT_PLAY_GET_METADATA = 2028, ///< 视频流MetaData事件
381 EVT_MIC_RELEASE_SUCC = 2029, ///< 释放麦克风占用 407 EVT_MIC_RELEASE_SUCC = 2029, ///< 释放麦克风占用
  408 + EVT_AUDIO_DEVICE_ROUTE_CHANGED = 2030, ///< 音频设备的route发生改变,即当前的输入输出设备发生改变,比如耳机被拔出
  409 + EVT_PLAY_GET_FLVSESSIONKEY = 2031, ///< TXLivePlayer 接收到http响应头中的 flvSessionKey 信息
  410 + EVT_AUDIO_SESSION_INTERRUPT = 2032, ///< Audio Session Interrupt事件
  411 +
382 412
383 EVT_ROOM_ENTER = 1018, ///< 进入房间成功 413 EVT_ROOM_ENTER = 1018, ///< 进入房间成功
384 EVT_ROOM_EXIT = 1019, ///< 退出房间 414 EVT_ROOM_EXIT = 1019, ///< 退出房间
  1 +/*
  2 +* Module: live 编码数据回调
  3 +*
  4 +* Function: 回调推流端编码完,和 播放端解码前的数据
  5 +*
  6 +*/
  7 +
  8 +
  9 +#ifndef TXLiteAVEncodedDataProcessingListener_h
  10 +#define TXLiteAVEncodedDataProcessingListener_h
  11 +
  12 +#include <stdio.h>
  13 +#include "TXLiteAVBuffer.h"
  14 +
  15 +namespace liteav {
  16 +
  17 +struct TXLiteAVEncodedData {
  18 + const char * userId; // didEncodeVideo 和 didEncodeAudio 回调时,此字段为null;
  19 + int streamType; // 视频流类型,参考 TRTCVideoStreamType,audio时,此字段为0
  20 + const liteav::TXLiteAVBuffer * originData; // 原始数据
  21 + liteav::TXLiteAVBuffer * processedData; // 写回处理后的数据
  22 +};
  23 +
  24 +class ITXLiteAVEncodedDataProcessingListener {
  25 +public:
  26 + virtual ~ITXLiteAVEncodedDataProcessingListener() {}
  27 +
  28 + /**
  29 + * 回调编码完的视频数据。
  30 + * @note videoData.userId = nullptr
  31 + */
  32 + virtual bool didEncodeVideo(TXLiteAVEncodedData & videoData) { return false; }
  33 +
  34 + /**
  35 + * 回调解码前的视频数据。
  36 + * @note videoData.userId 表示对应的user,当userId 为 nullptr时,表示此时先接收到数据了,对应的userId还未完成同步。获取到userId之后会回调正确的userId
  37 + */
  38 + virtual bool willDecodeVideo(TXLiteAVEncodedData & videoData) { return false; }
  39 +
  40 + /**
  41 + * 回调编码完的音频数据。
  42 + * @note audioData.userId = nullptr
  43 + */
  44 + virtual bool didEncodeAudio(TXLiteAVEncodedData & audioData) { return false; }
  45 +
  46 + /**
  47 + * 回调解码前的音频数据。
  48 + * @note audioData.userId 表示对应的user,当userId 为 nullptr时,表示此时先接收到数据了,对应的userId还未完成同步。获取到userId之后会回调正确的userId
  49 + */
  50 + virtual bool willDecodeAudio(TXLiteAVEncodedData & audioData) { return false; }
  51 +};
  52 +}
  53 +
  54 +#endif /* TXLiteAVEncodedDataProcessingListener_h */
@@ -13,8 +13,10 @@ @@ -13,8 +13,10 @@
13 #import <TXLiteAVSDK_TRTC/TRTCCloudDelegate.h> 13 #import <TXLiteAVSDK_TRTC/TRTCCloudDelegate.h>
14 #import <TXLiteAVSDK_TRTC/TRTCStatistics.h> 14 #import <TXLiteAVSDK_TRTC/TRTCStatistics.h>
15 #import <TXLiteAVSDK_TRTC/TXAudioCustomProcessDelegate.h> 15 #import <TXLiteAVSDK_TRTC/TXAudioCustomProcessDelegate.h>
  16 +#import <TXLiteAVSDK_TRTC/TXAudioEffectManager.h>
16 #import <TXLiteAVSDK_TRTC/TXAudioRawDataDelegate.h> 17 #import <TXLiteAVSDK_TRTC/TXAudioRawDataDelegate.h>
17 #import <TXLiteAVSDK_TRTC/TXBeautyManager.h> 18 #import <TXLiteAVSDK_TRTC/TXBeautyManager.h>
  19 +#import <TXLiteAVSDK_TRTC/TXDeviceManager.h>
18 #import <TXLiteAVSDK_TRTC/TXLiteAVCode.h> 20 #import <TXLiteAVSDK_TRTC/TXLiteAVCode.h>
19 #import <TXLiteAVSDK_TRTC/TXLiveAudioSessionDelegate.h> 21 #import <TXLiteAVSDK_TRTC/TXLiveAudioSessionDelegate.h>
20 #import <TXLiteAVSDK_TRTC/TXLiveBase.h> 22 #import <TXLiteAVSDK_TRTC/TXLiveBase.h>
@@ -26,3 +28,8 @@ @@ -26,3 +28,8 @@
26 #import <TXLiteAVSDK_TRTC/TXLiveSDKEventDef.h> 28 #import <TXLiteAVSDK_TRTC/TXLiveSDKEventDef.h>
27 #import <TXLiteAVSDK_TRTC/TXLiveSDKTypeDef.h> 29 #import <TXLiteAVSDK_TRTC/TXLiveSDKTypeDef.h>
28 #import <TXLiteAVSDK_TRTC/TXVideoCustomProcessDelegate.h> 30 #import <TXLiteAVSDK_TRTC/TXVideoCustomProcessDelegate.h>
  31 +#import <TXLiteAVSDK_TRTC/V2TXLiveCode.h>
  32 +#import <TXLiteAVSDK_TRTC/V2TXLiveDef.h>
  33 +#import <TXLiteAVSDK_TRTC/V2TXLivePlayer.h>
  34 +#import <TXLiteAVSDK_TRTC/V2TXLivePlayerObserver.h>
  35 +#import <TXLiteAVSDK_TRTC/V2TXLivePremier.h>
@@ -10,6 +10,9 @@ @@ -10,6 +10,9 @@
10 - (BOOL)setActive:(BOOL)active error:(NSError **)outError; 10 - (BOOL)setActive:(BOOL)active error:(NSError **)outError;
11 11
12 @optional 12 @optional
  13 +- (BOOL)setActive:(BOOL)active withOptions:(AVAudioSessionSetActiveOptions)options error:(NSError **)outError;
  14 +
  15 +@optional
13 - (BOOL)setMode:(NSString *)mode error:(NSError **)outError; 16 - (BOOL)setMode:(NSString *)mode error:(NSError **)outError;
14 17
15 @optional 18 @optional
@@ -27,7 +30,14 @@ @@ -27,7 +30,14 @@
27 - (BOOL)setPreferredSampleRate:(double)sampleRate error:(NSError **)outError; 30 - (BOOL)setPreferredSampleRate:(double)sampleRate error:(NSError **)outError;
28 31
29 @optional 32 @optional
  33 +- (BOOL)setPreferredOutputNumberOfChannels:(NSInteger)count error:(NSError **)outError;
  34 +
  35 +@optional
30 - (BOOL)overrideOutputAudioPort:(AVAudioSessionPortOverride)portOverride error:(NSError **)outError; 36 - (BOOL)overrideOutputAudioPort:(AVAudioSessionPortOverride)portOverride error:(NSError **)outError;
  37 +
  38 +@optional
  39 +- (BOOL)setPreferredInput:(nullable AVAudioSessionPortDescription *)inPort error:(NSError **)outError;
  40 +
31 #endif 41 #endif
32 @end 42 @end
33 #endif /* TXLiveAudioSessionDelegate_h */ 43 #endif /* TXLiveAudioSessionDelegate_h */
@@ -28,7 +28,20 @@ typedef NS_ENUM(NSInteger, TX_Enum_Type_LogLevel) { @@ -28,7 +28,20 @@ typedef NS_ENUM(NSInteger, TX_Enum_Type_LogLevel) {
28 3.level类型参见TX_Enum_Type_LogLevel 28 3.level类型参见TX_Enum_Type_LogLevel
29 4.module值暂无具体意义,目前为固定值TXLiteAVSDK 29 4.module值暂无具体意义,目前为固定值TXLiteAVSDK
30 */ 30 */
31 --(void) onLog:(NSString*)log LogLevel:(int)level WhichModule:(NSString*)module; 31 +- (void)onLog:(NSString*)log LogLevel:(int)level WhichModule:(NSString*)module;
  32 +
  33 +/**
  34 + * @brief NTP 校时回调,调用 TXLiveBase updateNetworkTime 后会触发
  35 + * @param errCode 0:表示校时成功且偏差在30ms以内,1:表示校时成功但偏差可能在 30ms 以上,-1:表示校时失败
  36 + */
  37 +- (void)onUpdateNetworkTime:(int)errCode message:(NSString *)errMsg;
  38 +
  39 +/**
  40 + @brief setLicenceURL 接口回调, result = 0 成功,负数失败。
  41 + @discussion
  42 + 需在调用 setLicenceURL 前设置 delegate
  43 + */
  44 +- (void)onLicenceLoaded:(int)result Reason:(NSString *)reason;
32 45
33 @end 46 @end
34 47
@@ -37,36 +50,85 @@ typedef NS_ENUM(NSInteger, TX_Enum_Type_LogLevel) { @@ -37,36 +50,85 @@ typedef NS_ENUM(NSInteger, TX_Enum_Type_LogLevel) {
37 /// 通过这个delegate将全部log回调给SDK使用者,由SDK使用者来决定log如何处理 50 /// 通过这个delegate将全部log回调给SDK使用者,由SDK使用者来决定log如何处理
38 @property (nonatomic, weak) id<TXLiveBaseDelegate> delegate; 51 @property (nonatomic, weak) id<TXLiveBaseDelegate> delegate;
39 52
40 -+ (instancetype) sharedInstance; 53 ++ (instancetype)sharedInstance;
41 54
42 -/** 设置log输出级别  
43 - * @param level 参见 LOGLEVEL 55 +/**
  56 + * 设置 liteav SDK 接入的环境。
  57 + * 腾讯云在全球各地区部署的环境,按照各地区政策法规要求,需要接入不同地区接入点。
  58 + *
  59 + * @param env_config 需要接入的环境,SDK 默认接入的环境是:默认正式环境。
  60 + * @return 0:成功;其他:错误
44 * 61 *
  62 + * @note 目标市场为中国大陆的客户请不要调用此接口,如果目标市场为海外用户,请通过技术支持联系我们,了解 env_config 的配置方法,以确保 App 遵守 GDPR 标准。
45 */ 63 */
46 -+ (void) setLogLevel:(TX_Enum_Type_LogLevel)level; 64 ++ (int)setGlobalEnv:(const char *)env_config;
  65 +
  66 +/**
  67 + * 设置 log 输出级别
  68 + * @param level 参见 LOGLEVEL
  69 + */
  70 ++ (void)setLogLevel:(TX_Enum_Type_LogLevel)level;
47 71
48 /** 72 /**
49 * 启用或禁用控制台日志打印 73 * 启用或禁用控制台日志打印
50 * @param enabled 指定是否启用 74 * @param enabled 指定是否启用
51 */ 75 */
52 -+ (void) setConsoleEnabled:(BOOL)enabled; 76 ++ (void)setConsoleEnabled:(BOOL)enabled;
53 77
54 -+ (void) setAppVersion:(NSString *)verNum; 78 ++ (void)setAppVersion:(NSString *)verNum;
55 79
56 + (void)setAudioSessionDelegate:(id<TXLiveAudioSessionDelegate>)delegate; 80 + (void)setAudioSessionDelegate:(id<TXLiveAudioSessionDelegate>)delegate;
57 81
58 -/// 获取SDK版本信息 82 +/**
  83 + * @brief 获取 SDK 版本信息
  84 + * @return SDK 版本信息
  85 + */
59 + (NSString *)getSDKVersionStr; 86 + (NSString *)getSDKVersionStr;
60 87
61 -///  获取pitu版本信息 88 +/**
  89 + * @brief 获取 pitu 版本信息
  90 + * @return pitu 版本信息
  91 + */
62 + (NSString *)getPituSDKVersion; 92 + (NSString *)getPituSDKVersion;
63 93
64 -/// 设置appID,云控使用 94 +/**
  95 + * @brief 设置 appID,云控使用
  96 + */
65 + (void)setAppID:(NSString*)appID; 97 + (void)setAppID:(NSString*)appID;
66 98
67 -/// 设置sdk的licence下载url和key 99 +/**
  100 + * @brief 设置 sdk 的 Licence 下载 url 和 key
  101 + */
68 + (void)setLicenceURL:(NSString *)url key:(NSString *)key; 102 + (void)setLicenceURL:(NSString *)url key:(NSString *)key;
69 103
70 -/// 获取 Licence 信息 104 +/**
  105 + * @brief 设置 userId,用于数据上报
  106 + */
  107 ++ (void)setUserId:(NSString *)userId;
  108 +
  109 +/**
  110 + * @brief 获取 Licence 信息
  111 + * @return Licence 信息
  112 + */
71 + (NSString *)getLicenceInfo; 113 + (NSString *)getLicenceInfo;
  114 +
  115 +/**
  116 + * @brief 设置 HEVC 外部解码器工厂实例
  117 + */
  118 ++ (void)setExternalDecoderFactory:(id)decoderFactory;
  119 +
  120 +/**
  121 + * 启动 NTP 校时服务
  122 + *
  123 + * @return 0:启动成功;< 0:启动失败
  124 + */
  125 ++ (NSInteger)updateNetworkTime;
  126 +
  127 +/**
  128 + * 获取 NTP 时间戳(毫秒),请在收到 onUpdateNetworkTime 回调后使用
  129 + *
  130 + * @return NTP 时间戳(毫秒),若返回 0:未启动 NTP 校时或校时失败,请重启校时
  131 + */
  132 ++ (NSInteger)getNetworkTimestamp;
  133 +
72 @end 134 @end
@@ -65,6 +65,16 @@ @@ -65,6 +65,16 @@
65 ///【特别说明】每条音视频流中只能设置一个 MetaData 数据头,除非断网重连,否则 TXLivePlayer 的 EVT_PLAY_GET_METADATA 消息也只会收到一次。 65 ///【特别说明】每条音视频流中只能设置一个 MetaData 数据头,除非断网重连,否则 TXLivePlayer 的 EVT_PLAY_GET_METADATA 消息也只会收到一次。
66 @property(nonatomic, assign) BOOL enableMetaData; 66 @property(nonatomic, assign) BOOL enableMetaData;
67 67
  68 +///【字段含义】是否开启 HTTP 头信息回调,默认值为 @“”
  69 +/// HTTP 响应头中除了“content-length”、“content-type”等标准字段,不同云服务商还可能会添加一些非标准字段。
  70 +/// 比如腾讯云会在直播 CDN 的 HTTP-FLV 格式的直播流中增加 “X-Tlive-SpanId” 响应头,并在其中设置一个随机字符串,用来唯一标识一次直播。
  71 +///
  72 +/// 如果您在使用腾讯云的直播 CDN,可以设置 flvSessionKey 为 @“X-Tlive-SpanId”,SDK 会在 HTTP 响应头里解析这个字段,
  73 +/// 并通过 TXLivePlayListener 中的 onPlayEvent(EVT_PLAY_GET_FLVSESSIONKEY) 事件通知给您的 App。
  74 +///
  75 +///【特别说明】每条音视频流中只能解析一个 flvSessionKey,除非断网重连,否则 EVT_PLAY_GET_FLVSESSIONKEY 只会抛送一次。
  76 +@property(nonatomic, copy) NSString* flvSessionKey;
  77 +
68 ///【字段含义】视频渲染对象回调的视频格式,默认值:kCVPixelFormatType_420YpCbCr8Planar 78 ///【字段含义】视频渲染对象回调的视频格式,默认值:kCVPixelFormatType_420YpCbCr8Planar
69 ///【特别说明】支持:kCVPixelFormatType_420YpCbCr8Planar 和 kCVPixelFormatType_420YpCbCr8BiPlanarFullRange 79 ///【特别说明】支持:kCVPixelFormatType_420YpCbCr8Planar 和 kCVPixelFormatType_420YpCbCr8BiPlanarFullRange
70 @property(nonatomic, assign) OSType playerPixelFormatType; 80 @property(nonatomic, assign) OSType playerPixelFormatType;
@@ -82,14 +92,12 @@ @@ -82,14 +92,12 @@
82 ///【字段含义】RTMP 传输通道的类型,待废弃,默认值为:RTMP_CHANNEL_TYPE_AUTO 92 ///【字段含义】RTMP 传输通道的类型,待废弃,默认值为:RTMP_CHANNEL_TYPE_AUTO
83 @property (nonatomic, assign) int rtmpChannelType; 93 @property (nonatomic, assign) int rtmpChannelType;
84 94
85 -#if TARGET_OS_IPHONE  
86 ///【字段含义】视频缓存目录,点播 MP4、HLS 有效 95 ///【字段含义】视频缓存目录,点播 MP4、HLS 有效
87 @property NSString *cacheFolderPath; 96 @property NSString *cacheFolderPath;
88 ///【字段含义】最多缓存文件个数,默认值:0 97 ///【字段含义】最多缓存文件个数,默认值:0
89 @property int maxCacheItems; 98 @property int maxCacheItems;
90 ///【字段含义】自定义 HTTP Headers 99 ///【字段含义】自定义 HTTP Headers
91 @property NSDictionary *headers; 100 @property NSDictionary *headers;
92 -#endif  
93 101
94 @end 102 @end
95 /// @} 103 /// @}
@@ -30,20 +30,16 @@ typedef NS_ENUM(NSInteger, TX_Enum_PlayType) { @@ -30,20 +30,16 @@ typedef NS_ENUM(NSInteger, TX_Enum_PlayType) {
30 PLAY_TYPE_LIVE_RTMP = 0, 30 PLAY_TYPE_LIVE_RTMP = 0,
31 /// FLV 直播 31 /// FLV 直播
32 PLAY_TYPE_LIVE_FLV = 1, 32 PLAY_TYPE_LIVE_FLV = 1,
33 -#if TARGET_OS_IPHONE  
34 /// FLV 点播 33 /// FLV 点播
35 PLAY_TYPE_VOD_FLV = 2, 34 PLAY_TYPE_VOD_FLV = 2,
36 /// HLS 点播 35 /// HLS 点播
37 PLAY_TYPE_VOD_HLS = 3, 36 PLAY_TYPE_VOD_HLS = 3,
38 /// MP4点播 37 /// MP4点播
39 PLAY_TYPE_VOD_MP4 = 4, 38 PLAY_TYPE_VOD_MP4 = 4,
40 -#endif  
41 /// RTMP 直播加速播放 39 /// RTMP 直播加速播放
42 PLAY_TYPE_LIVE_RTMP_ACC = 5, 40 PLAY_TYPE_LIVE_RTMP_ACC = 5,
43 -#if TARGET_OS_IPHONE  
44 /// 本地视频文件 41 /// 本地视频文件
45 PLAY_TYPE_LOCAL_VIDEO = 6, 42 PLAY_TYPE_LOCAL_VIDEO = 6,
46 -#endif  
47 }; 43 };
48 44
49 45
@@ -90,8 +86,6 @@ typedef NS_ENUM(NSInteger, TX_Enum_PlayType) { @@ -90,8 +86,6 @@ typedef NS_ENUM(NSInteger, TX_Enum_PlayType) {
90 */ 86 */
91 @property(nonatomic, copy) TXLivePlayConfig *config; 87 @property(nonatomic, copy) TXLivePlayConfig *config;
92 88
93 -  
94 -#if TARGET_OS_IPHONE  
95 /** 89 /**
96 * 1.6 设置短视频录制回调,见 “TXLiveRecordListener.h” 文件中的详细定义 90 * 1.6 设置短视频录制回调,见 “TXLiveRecordListener.h” 文件中的详细定义
97 */ 91 */
@@ -100,8 +94,8 @@ typedef NS_ENUM(NSInteger, TX_Enum_PlayType) { @@ -100,8 +94,8 @@ typedef NS_ENUM(NSInteger, TX_Enum_PlayType) {
100 /** 94 /**
101 * 1.7 startPlay 后是否立即播放,默认 YES,只有点播有效 95 * 1.7 startPlay 后是否立即播放,默认 YES,只有点播有效
102 */ 96 */
103 -@property BOOL isAutoPlay;  
104 -#endif 97 +@property (nonatomic) BOOL isAutoPlay;
  98 +
105 99
106 /// @} 100 /// @}
107 101
@@ -197,14 +191,20 @@ typedef NS_ENUM(NSInteger, TX_Enum_PlayType) { @@ -197,14 +191,20 @@ typedef NS_ENUM(NSInteger, TX_Enum_PlayType) {
197 */ 191 */
198 - (void)setRenderMode:(TX_Enum_Type_RenderMode)renderMode; 192 - (void)setRenderMode:(TX_Enum_Type_RenderMode)renderMode;
199 193
200 -#if TARGET_OS_IPHONE  
201 /** 194 /**
202 * 3.3 截屏 195 * 3.3 截屏
203 * 196 *
204 * @param snapshotCompletionBlock 通过回调返回当前图像 197 * @param snapshotCompletionBlock 通过回调返回当前图像
205 */ 198 */
206 - (void)snapshot:(void (^)(TXImage *))snapshotCompletionBlock; 199 - (void)snapshot:(void (^)(TXImage *))snapshotCompletionBlock;
207 -#endif 200 +
  201 +/**
  202 + * 3.4 获取当前渲染帧 pts
  203 + *
  204 + * @return 0:当前未处于正在播放状态(例如:未起播)
  205 + * >0:当前渲染视频帧的 pts,处于正在播放状态 (单位: 毫秒)
  206 + */
  207 +- (uint64_t)getCurrentRenderPts;
208 208
209 /// @} 209 /// @}
210 210
@@ -46,6 +46,7 @@ enum EventID @@ -46,6 +46,7 @@ enum EventID
46 PUSH_WARNING_SHAKE_FAIL = WARNING_RTMP_SHAKE_FAIL, ///< RTMP服务器握手失败 46 PUSH_WARNING_SHAKE_FAIL = WARNING_RTMP_SHAKE_FAIL, ///< RTMP服务器握手失败
47 PUSH_WARNING_SERVER_DISCONNECT = WARNING_RTMP_SERVER_BREAK_CONNECT, ///< RTMP服务器主动断开,请检查推流地址的合法性或防盗链有效期 47 PUSH_WARNING_SERVER_DISCONNECT = WARNING_RTMP_SERVER_BREAK_CONNECT, ///< RTMP服务器主动断开,请检查推流地址的合法性或防盗链有效期
48 PUSH_WARNING_READ_WRITE_FAIL = WARNING_RTMP_READ_WRITE_FAIL, ///< RTMP 读/写失败,将会断开连接。 48 PUSH_WARNING_READ_WRITE_FAIL = WARNING_RTMP_READ_WRITE_FAIL, ///< RTMP 读/写失败,将会断开连接。
  49 + PUSH_WARNING_HEVC_ENCODE_NOT_SUPPORT = ERR_HEVC_ENCODE_NOT_SUPPORT, ///< 265编码判断不支持
49 50
50 /*内部事件*/INNER_EVT_SET_BITRATE_4_SCREEN_CAPTURE = 100001, ///< 动态设置录屏编码码率 51 /*内部事件*/INNER_EVT_SET_BITRATE_4_SCREEN_CAPTURE = 100001, ///< 动态设置录屏编码码率
51 /*内部事件*/INNER_EVT_BGM_PLAY_FINISH = 100002, ///< BGM播放完毕 52 /*内部事件*/INNER_EVT_BGM_PLAY_FINISH = 100002, ///< BGM播放完毕
@@ -58,6 +59,7 @@ enum EventID @@ -58,6 +59,7 @@ enum EventID
58 PLAY_EVT_CONNECT_SUCC = EVT_PLAY_LIVE_STREAM_CONNECT_SUCC, ///< 直播,已经连接RTMP拉流服务器 59 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_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_RCV_FIRST_I_FRAME = EVT_RENDER_FIRST_I_FRAME, ///< 渲染首个视频数据包(IDR)
  62 + PLAY_EVT_RCV_FIRST_AUDIO_FRAME = EVT_AUDIO_JITTER_STATE_FIRST_PLAY, ///< 音频首次播放
61 PLAY_EVT_PLAY_BEGIN = EVT_VIDEO_PLAY_BEGIN, ///< 视频播放开始 63 PLAY_EVT_PLAY_BEGIN = EVT_VIDEO_PLAY_BEGIN, ///< 视频播放开始
62 PLAY_EVT_PLAY_PROGRESS = EVT_VIDEO_PLAY_PROGRESS, ///< 视频播放进度 64 PLAY_EVT_PLAY_PROGRESS = EVT_VIDEO_PLAY_PROGRESS, ///< 视频播放进度
63 PLAY_EVT_PLAY_END = EVT_VIDEO_PLAY_END, ///< 视频播放结束 65 PLAY_EVT_PLAY_END = EVT_VIDEO_PLAY_END, ///< 视频播放结束
@@ -71,6 +73,8 @@ enum EventID @@ -71,6 +73,8 @@ enum EventID
71 PLAY_EVT_VOD_LOADING_END = EVT_VOD_PLAY_LOADING_END, ///< 点播,loading结束 73 PLAY_EVT_VOD_LOADING_END = EVT_VOD_PLAY_LOADING_END, ///< 点播,loading结束
72 PLAY_EVT_STREAM_SWITCH_SUCC = EVT_PLAY_LIVE_STREAM_SWITCH_SUCC, ///< 直播,切流成功(切流可以播放不同画面大小的视频) 74 PLAY_EVT_STREAM_SWITCH_SUCC = EVT_PLAY_LIVE_STREAM_SWITCH_SUCC, ///< 直播,切流成功(切流可以播放不同画面大小的视频)
73 PLAY_EVT_GET_METADATA = EVT_PLAY_GET_METADATA, ///< TXLivePlayer 接收到视频流中的 metadata 头信息(一条视频流仅触发一次) 75 PLAY_EVT_GET_METADATA = EVT_PLAY_GET_METADATA, ///< TXLivePlayer 接收到视频流中的 metadata 头信息(一条视频流仅触发一次)
  76 + PLAY_EVT_GET_FLVSESSIONKEY = EVT_PLAY_GET_FLVSESSIONKEY, ///< TXLivePlayer 接收到http响应头中的 flvSessionKey 信息
  77 + PLAY_EVT_AUDIO_SESSION_INTERRUPT = EVT_AUDIO_SESSION_INTERRUPT, ///< Audio Session Interrupt事件
74 78
75 79
76 PLAY_ERR_NET_DISCONNECT = ERR_PLAY_LIVE_STREAM_NET_DISCONNECT, ///< 直播,网络断连,且经多次重连抢救无效,可以放弃治疗,更多重试请自行重启播放 80 PLAY_ERR_NET_DISCONNECT = ERR_PLAY_LIVE_STREAM_NET_DISCONNECT, ///< 直播,网络断连,且经多次重连抢救无效,可以放弃治疗,更多重试请自行重启播放
@@ -130,7 +130,7 @@ typedef NS_ENUM(NSInteger, TX_Enum_Type_RenderMode) { @@ -130,7 +130,7 @@ typedef NS_ENUM(NSInteger, TX_Enum_Type_RenderMode) {
130 typedef NS_ENUM(NSInteger, TX_Enum_Type_BeautyStyle) { 130 typedef NS_ENUM(NSInteger, TX_Enum_Type_BeautyStyle) {
131 BEAUTY_STYLE_SMOOTH = 0, ///< 光滑,磨皮程度较高,更适合秀场直播类场景下使用。 131 BEAUTY_STYLE_SMOOTH = 0, ///< 光滑,磨皮程度较高,更适合秀场直播类场景下使用。
132 BEAUTY_STYLE_NATURE = 1, ///< 自然,磨皮算法会最大限度保留皮肤细节。 132 BEAUTY_STYLE_NATURE = 1, ///< 自然,磨皮算法会最大限度保留皮肤细节。
133 - BEAUTY_STYLE_PITU = 2, ///< 天天P图版美颜, 需要企业版 SDK 才能支持,普通版本设置此选项无效 133 + BEAUTY_STYLE_PITU = 2, ///< 由上海优图实验室提供的美颜算法,磨皮效果介于光滑和自然之间,比光滑保留更多皮肤细节,比自然磨皮程度更高
134 }; 134 };
135 135
136 /** 136 /**
@@ -315,7 +315,7 @@ typedef NS_ENUM(NSInteger, TXCaptureVideoInputSource) { @@ -315,7 +315,7 @@ typedef NS_ENUM(NSInteger, TXCaptureVideoInputSource) {
315 #define NET_STATUS_AV_PLAY_INTERVAL @"AV_PLAY_INTERVAL" ///> TXLivePlayer:音画同步错位时间(播放),单位 ms,此数值越小,音画同步越好。 315 #define NET_STATUS_AV_PLAY_INTERVAL @"AV_PLAY_INTERVAL" ///> TXLivePlayer:音画同步错位时间(播放),单位 ms,此数值越小,音画同步越好。
316 #define NET_STATUS_AV_RECV_INTERVAL @"AV_RECV_INTERVAL" ///> TXLivePlayer:音画同步错位时间(网络),单位 ms,此数值越小,音画同步越好。 316 #define NET_STATUS_AV_RECV_INTERVAL @"AV_RECV_INTERVAL" ///> TXLivePlayer:音画同步错位时间(网络),单位 ms,此数值越小,音画同步越好。
317 #define NET_STATUS_AUDIO_CACHE_THRESHOLD @"AUDIO_CACHE_THRESHOLD" ///> TXLivePlayer:音频缓冲时长阈值,缓冲超过该阈值后,播放器会开始调控延时。 317 #define NET_STATUS_AUDIO_CACHE_THRESHOLD @"AUDIO_CACHE_THRESHOLD" ///> TXLivePlayer:音频缓冲时长阈值,缓冲超过该阈值后,播放器会开始调控延时。
318 - 318 +#define NET_STATUS_AUDIO_BLOCK_TIME @"AUDIO_BLOCK_TIME" ///> 拉流专用:音频卡顿时长,单位ms
319 #define NET_STATUS_AUDIO_INFO @"AUDIO_INFO" ///> 音频信息:包括采样率信息和声道数信息 319 #define NET_STATUS_AUDIO_INFO @"AUDIO_INFO" ///> 音频信息:包括采样率信息和声道数信息
320 #define NET_STATUS_NET_JITTER @"NET_JITTER" ///> 网络抖动:数值越大表示抖动越大,网络越不稳定 320 #define NET_STATUS_NET_JITTER @"NET_JITTER" ///> 网络抖动:数值越大表示抖动越大,网络越不稳定
321 #define NET_STATUS_QUALITY_LEVEL @"NET_QUALITY_LEVEL" ///> 网络质量:0:未定义 1:最好 2:好 3:一般 4:差 5:很差 6:不可用 321 #define NET_STATUS_QUALITY_LEVEL @"NET_QUALITY_LEVEL" ///> 网络质量:0:未定义 1:最好 2:好 3:一般 4:差 5:很差 6:不可用
@@ -339,6 +339,8 @@ typedef NS_ENUM(NSInteger, TXCaptureVideoInputSource) { @@ -339,6 +339,8 @@ typedef NS_ENUM(NSInteger, TXCaptureVideoInputSource) {
339 */ 339 */
340 #define EVT_MSG @"EVT_MSG" ///> 事件ID 340 #define EVT_MSG @"EVT_MSG" ///> 事件ID
341 #define EVT_TIME @"EVT_TIME" ///> 事件发生的UTC毫秒时间戳 341 #define EVT_TIME @"EVT_TIME" ///> 事件发生的UTC毫秒时间戳
  342 +#define EVT_UTC_TIME @"EVT_UTC_TIME" ///> 事件发生的UTC毫秒时间戳(兼容性)
  343 +#define EVT_BLOCK_DURATION @"EVT_BLOCK_DURATION" ///> 卡顿时间(毫秒)
342 #define EVT_PARAM1 @"EVT_PARAM1" ///> 事件参数1 344 #define EVT_PARAM1 @"EVT_PARAM1" ///> 事件参数1
343 #define EVT_PARAM2 @"EVT_PARAM2" ///> 事件参数2 345 #define EVT_PARAM2 @"EVT_PARAM2" ///> 事件参数2
344 #define EVT_GET_MSG @"EVT_GET_MSG" ///> 消息内容,收到PLAY_EVT_GET_MESSAGE事件时,通过该字段获取消息内容 346 #define EVT_GET_MSG @"EVT_GET_MSG" ///> 消息内容,收到PLAY_EVT_GET_MESSAGE事件时,通过该字段获取消息内容
  1 +//
  2 +// Copyright © 2020 Tencent. All rights reserved.
  3 +//
  4 +// Module: V2TXLive
  5 +//
  6 +
  7 +#import <Foundation/Foundation.h>
  8 +
  9 +/// @defgroup V2TXLiveCode_ios V2TXLiveCode
  10 +/// 腾讯云直播服务(LVB)错误码和警告码的定义。
  11 +/// @{
  12 +
  13 +/**
  14 + * @brief 错误码和警告码。
  15 + */
  16 +typedef NS_ENUM(NSInteger, V2TXLiveCode) {
  17 +
  18 + /// 没有错误
  19 + V2TXLIVE_OK = 0,
  20 +
  21 + /// 暂未归类的通用错误
  22 + V2TXLIVE_ERROR_FAILED = -1,
  23 +
  24 + /// 调用 API 时,传入的参数不合法
  25 + V2TXLIVE_ERROR_INVALID_PARAMETER = -2,
  26 +
  27 + /// API 调用被拒绝
  28 + V2TXLIVE_ERROR_REFUSED = -3,
  29 +
  30 + /// 当前 API 不支持调用
  31 + V2TXLIVE_ERROR_NOT_SUPPORTED = -4,
  32 +
  33 + /// license 不合法,调用失败
  34 + V2TXLIVE_ERROR_INVALID_LICENSE = -5,
  35 +
  36 + /// 请求服务器超时
  37 + V2TXLIVE_ERROR_REQUEST_TIMEOUT = -6,
  38 +
  39 + /// 服务器无法处理您的请求
  40 + V2TXLIVE_ERROR_SERVER_PROCESS_FAILED = -7,
  41 +
  42 + /////////////////////////////////////////////////////////////////////////////////
  43 + //
  44 + // 网络相关的警告码
  45 + //
  46 + /////////////////////////////////////////////////////////////////////////////////
  47 +
  48 + /// 网络状况不佳:上行带宽太小,上传数据受阻
  49 + V2TXLIVE_WARNING_NETWORK_BUSY = 1101,
  50 +
  51 + /// 当前视频播放出现卡顿
  52 + V2TXLIVE_WARNING_VIDEO_BLOCK = 2105,
  53 +
  54 + /////////////////////////////////////////////////////////////////////////////////
  55 + //
  56 + // 摄像头相关的警告码
  57 + //
  58 + /////////////////////////////////////////////////////////////////////////////////
  59 +
  60 + /// 摄像头打开失败
  61 + V2TXLIVE_WARNING_CAMERA_START_FAILED = -1301,
  62 +
  63 + /// 摄像头正在被占用中,可尝试打开其他摄像头
  64 + V2TXLIVE_WARNING_CAMERA_OCCUPIED = -1316,
  65 +
  66 + /// 摄像头设备未授权,通常在移动设备出现,可能是权限被用户拒绝了
  67 + V2TXLIVE_WARNING_CAMERA_NO_PERMISSION = -1314,
  68 +
  69 + /////////////////////////////////////////////////////////////////////////////////
  70 + //
  71 + // 麦克风相关的警告码
  72 + //
  73 + /////////////////////////////////////////////////////////////////////////////////
  74 +
  75 + /// 麦克风打开失败
  76 + V2TXLIVE_WARNING_MICROPHONE_START_FAILED = -1302,
  77 +
  78 + /// 麦克风正在被占用中,例如移动设备正在通话时,打开麦克风会失败
  79 + V2TXLIVE_WARNING_MICROPHONE_OCCUPIED = -1319,
  80 +
  81 + /// 麦克风设备未授权,通常在移动设备出现,可能是权限被用户拒绝了
  82 + V2TXLIVE_WARNING_MICROPHONE_NO_PERMISSION = -1317,
  83 +
  84 + /////////////////////////////////////////////////////////////////////////////////
  85 + //
  86 + // 屏幕分享相关警告码
  87 + //
  88 + /////////////////////////////////////////////////////////////////////////////////
  89 +
  90 + /// 当前系统不支持屏幕分享
  91 + V2TXLIVE_WARNING_SCREEN_CAPTURE_NOT_SUPPORTED = -1309,
  92 +
  93 + /// 开始录屏失败,如果在移动设备出现,可能是权限被用户拒绝了
  94 + V2TXLIVE_WARNING_SCREEN_CAPTURE_START_FAILED = -1308,
  95 +
  96 + /// 录屏被系统中断
  97 + V2TXLIVE_WARNING_SCREEN_CAPTURE_INTERRUPTED = -7001,
  98 +
  99 +};
  100 +/// @}
  1 +//
  2 +// Copyright © 2020 Tencent. All rights reserved.
  3 +//
  4 +// Module: V2TXLive
  5 +//
  6 +/// @defgroup V2TXLiveDef_ios V2TXLiveDef
  7 +/// 腾讯云直播服务(LVB)关键类型定义
  8 +/// @{
  9 +#import "V2TXLiveCode.h"
  10 +
  11 +#if TARGET_OS_IPHONE
  12 +#import <UIKit/UIKit.h>
  13 +typedef UIView TXView;
  14 +typedef UIImage TXImage;
  15 +#elif TARGET_OS_MAC
  16 +#import <AppKit/AppKit.h>
  17 +typedef NSView TXView;
  18 +typedef NSImage TXImage;
  19 +#endif
  20 +
  21 +/**
  22 + * @brief 支持协议
  23 + */
  24 +typedef NS_ENUM(NSUInteger, V2TXLiveMode) {
  25 +
  26 + /// 支持协议: RTMP
  27 + V2TXLiveMode_RTMP,
  28 +
  29 + /// 支持协议: TRTC
  30 + V2TXLiveMode_RTC
  31 +
  32 +};
  33 +
  34 +/////////////////////////////////////////////////////////////////////////////////
  35 +//
  36 +// (一)视频相关类型定义
  37 +//
  38 +/////////////////////////////////////////////////////////////////////////////////
  39 +/// @name 视频相关类型定义
  40 +/// @{
  41 +
  42 +/**
  43 + * @brief 视频分辨率
  44 + */
  45 +typedef NS_ENUM(NSInteger, V2TXLiveVideoResolution) {
  46 +
  47 + /// 分辨率 160*160,码率范围:100Kbps ~ 150Kbps,帧率:15fps
  48 + V2TXLiveVideoResolution160x160,
  49 +
  50 + /// 分辨率 270*270,码率范围:200Kbps ~ 300Kbps,帧率:15fps
  51 + V2TXLiveVideoResolution270x270,
  52 +
  53 + /// 分辨率 480*480,码率范围:350Kbps ~ 525Kbps,帧率:15fps
  54 + V2TXLiveVideoResolution480x480,
  55 +
  56 + /// 分辨率 320*240,码率范围:250Kbps ~ 375Kbps,帧率:15fps
  57 + V2TXLiveVideoResolution320x240,
  58 +
  59 + /// 分辨率 480*360,码率范围:400Kbps ~ 600Kbps,帧率:15fps
  60 + V2TXLiveVideoResolution480x360,
  61 +
  62 + /// 分辨率 640*480,码率范围:600Kbps ~ 900Kbps,帧率:15fps
  63 + V2TXLiveVideoResolution640x480,
  64 +
  65 + /// 分辨率 320*180,码率范围:250Kbps ~ 400Kbps,帧率:15fps
  66 + V2TXLiveVideoResolution320x180,
  67 +
  68 + /// 分辨率 480*270,码率范围:350Kbps ~ 550Kbps,帧率:15fps
  69 + V2TXLiveVideoResolution480x270,
  70 +
  71 + /// 分辨率 640*360,码率范围:500Kbps ~ 900Kbps,帧率:15fps
  72 + V2TXLiveVideoResolution640x360,
  73 +
  74 + /// 分辨率 960*540,码率范围:800Kbps ~ 1500Kbps,帧率:15fps
  75 + V2TXLiveVideoResolution960x540,
  76 +
  77 + /// 分辨率 1280*720,码率范围:1000Kbps ~ 1800Kbps,帧率:15fps
  78 + V2TXLiveVideoResolution1280x720,
  79 +
  80 + /// 分辨率 1920*1080,码率范围:2500Kbps ~ 3000Kbps,帧率:15fps
  81 + V2TXLiveVideoResolution1920x1080
  82 +
  83 +};
  84 +
  85 +/**
  86 + * @brief 视频宽高比模式。
  87 + *
  88 + * @note
  89 + * - 横屏模式下的分辨率: V2TXLiveVideoResolution640x360 + V2TXLiveVideoResolutionModeLandscape = 640 × 360
  90 + * - 竖屏模式下的分辨率: V2TXLiveVideoResolution640x360 + V2TXLiveVideoResolutionModePortrait = 360 × 640
  91 + */
  92 +typedef NS_ENUM(NSInteger, V2TXLiveVideoResolutionMode) {
  93 +
  94 + /// 横屏模式
  95 + V2TXLiveVideoResolutionModeLandscape = 0,
  96 +
  97 + /// 竖屏模式
  98 + V2TXLiveVideoResolutionModePortrait = 1,
  99 +
  100 +};
  101 +
  102 +/**
  103 + * 视频编码参数。
  104 + *
  105 + * 该设置决定远端用户看到的画面质量。
  106 + */
  107 +@interface V2TXLiveVideoEncoderParam : NSObject
  108 +
  109 +///【字段含义】 视频分辨率
  110 +///【特别说明】如需使用竖屏分辨率,请指定 videoResolutionMode 为 Portrait,例如: 640 × 360 + Portrait = 360 × 640。
  111 +///【推荐取值】
  112 +/// - 桌面平台(Win + Mac):建议选择 640 × 360 及以上分辨率,videoResolutionMode 选择 Landscape,即横屏分辨率。
  113 +@property(nonatomic, assign) V2TXLiveVideoResolution videoResolution;
  114 +
  115 +///【字段含义】分辨率模式(横屏分辨率 or 竖屏分辨率)
  116 +///【推荐取值】桌面平台(Windows、Mac)建议选择 Landscape。
  117 +///【特别说明】如需使用竖屏分辨率,请指定 resMode 为 Portrait,例如: 640 × 360 + Portrait = 360 × 640。
  118 +@property(nonatomic, assign) V2TXLiveVideoResolutionMode videoResolutionMode;
  119 +
  120 +///【字段含义】视频采集帧率
  121 +///【推荐取值】15fps 或 20fps。5fps 以下,卡顿感明显。10fps 以下,会有轻微卡顿感。20fps 以上,会浪费带宽(电影的帧率为 24fps)。
  122 +@property(nonatomic, assign) int videoFps;
  123 +
  124 +///【字段含义】目标视频码率,SDK 会按照目标码率进行编码,只有在弱网络环境下才会主动降低视频码率。
  125 +///【推荐取值】请参考 V2TXLiveVideoResolution 在各档位注释的最佳码率,也可以在此基础上适当调高。
  126 +/// 比如:V2TXLiveVideoResolution1280x720 对应 1200kbps 的目标码率,您也可以设置为 1500kbps 用来获得更好的观感清晰度。
  127 +///【特别说明】您可以通过同时设置 videoBitrate 和 minVideoBitrate 两个参数,用于约束 SDK 对视频码率的调整范围:
  128 +/// - 如果您将 videoBitrate 和 minVideoBitrate 设置为同一个值,等价于关闭 SDK 对视频码率的自适应调节能力。
  129 +@property(nonatomic, assign) int videoBitrate;
  130 +
  131 +///【字段含义】最低视频码率,SDK 会在网络不佳的情况下主动降低视频码率以保持流畅度,最低会降至 minVideoBitrate 所设定的数值。
  132 +///【推荐取值】您可以通过同时设置 videoBitrate 和 minVideoBitrate 两个参数,用于约束 SDK 对视频码率的调整范围:
  133 +/// - 如果您将 videoBitrate 和 minVideoBitrate 设置为同一个值,等价于关闭 SDK 对视频码率的自适应调节能力。
  134 +@property(nonatomic, assign) int minVideoBitrate;
  135 +
  136 +- (instancetype _Nonnull)initWith:(V2TXLiveVideoResolution)resolution;
  137 +
  138 +@end
  139 +
  140 +/**
  141 + * @brief 本地摄像头镜像类型。
  142 + */
  143 +typedef NS_ENUM(NSInteger, V2TXLiveMirrorType) {
  144 +
  145 + /// 系统默认镜像类型,前置摄像头镜像,后置摄像头不镜像
  146 + V2TXLiveMirrorTypeAuto,
  147 +
  148 + /// 前置摄像头和后置摄像头,都切换为镜像模式
  149 + V2TXLiveMirrorTypeEnable,
  150 +
  151 + /// 前置摄像头和后置摄像头,都切换为非镜像模式
  152 + V2TXLiveMirrorTypeDisable
  153 +
  154 +};
  155 +
  156 +/**
  157 + * @brief 视频画面填充模式。
  158 + */
  159 +typedef NS_ENUM(NSInteger, V2TXLiveFillMode) {
  160 +
  161 + /// 图像铺满屏幕,超出显示视窗的视频部分将被裁剪,画面显示可能不完整
  162 + V2TXLiveFillModeFill,
  163 +
  164 + /// 图像长边填满屏幕,短边区域会被填充黑色,画面的内容完整
  165 + V2TXLiveFillModeFit
  166 +
  167 +};
  168 +
  169 +/**
  170 + * @brief 视频画面顺时针旋转角度。
  171 + */
  172 +typedef NS_ENUM(NSInteger, V2TXLiveRotation) {
  173 +
  174 + /// 不旋转
  175 + V2TXLiveRotation0,
  176 +
  177 + /// 顺时针旋转90度
  178 + V2TXLiveRotation90,
  179 +
  180 + /// 顺时针旋转180度
  181 + V2TXLiveRotation180,
  182 +
  183 + /// 顺时针旋转270度
  184 + V2TXLiveRotation270
  185 +
  186 +};
  187 +
  188 +/**
  189 + * @brief 视频帧的像素格式。
  190 + */
  191 +typedef NS_ENUM(NSInteger, V2TXLivePixelFormat) {
  192 +
  193 + /// 未知
  194 + V2TXLivePixelFormatUnknown,
  195 +
  196 + /// YUV420P I420
  197 + V2TXLivePixelFormatI420,
  198 +
  199 + /// YUV420SP NV12
  200 + V2TXLivePixelFormatNV12,
  201 +
  202 + /// BGRA8888
  203 + V2TXLivePixelFormatBGRA32,
  204 +
  205 + /// OpenGL 2D 纹理
  206 + V2TXLivePixelFormatTexture2D
  207 +
  208 +};
  209 +
  210 +/**
  211 + * @brief 视频数据包装格式。
  212 + *
  213 + * @note 在自定义采集和自定义渲染功能,您需要用到下列枚举值来指定您希望以什么样的格式来包装视频数据。
  214 + * - PixelBuffer:直接使用效率最高,iOS 系统提供了众多 API 获取或处理 PixelBuffer
  215 + * - NSData: 当使用自定义渲染时,PixelBuffer拷贝一次到NSData。当使用自定义采集时,NSData拷贝一次到PixelBuffer。因此,性能会受到一定程度的影响
  216 + */
  217 +typedef NS_ENUM(NSInteger, V2TXLiveBufferType) {
  218 +
  219 + /// 未知
  220 + V2TXLiveBufferTypeUnknown,
  221 +
  222 + /// 直接使用效率最高,iOS 系统提供了众多 API 获取或处理 PixelBuffer
  223 + V2TXLiveBufferTypePixelBuffer,
  224 +
  225 + /// 会有一定的性能消耗,SDK 内部是直接处理 PixelBuffer 的,所以会存在 NSData 和 PixelBuffer 之间类型转换所产生的内存拷贝开销
  226 + V2TXLiveBufferTypeNSData,
  227 +
  228 + /// 直接操作纹理 ID,性能最好
  229 + V2TXLiveBufferTypeTexture
  230 +
  231 +};
  232 +
  233 +/**
  234 + * @brief 视频帧信息。
  235 + * V2TXLiveVideoFrame 用来描述一帧视频画面的裸数据,它可以是一帧编码前的画面,也可以是一帧解码后的画面。
  236 + * @note 自定义采集和自定义渲染时使用。自定义采集时,需要使用 V2TXLiveVideoFrame 来包装待发送的视频帧;自定义渲染时,会返回经过 V2TXLiveVideoFrame 包装的视频帧。
  237 + */
  238 +@interface V2TXLiveVideoFrame : NSObject
  239 +
  240 +/// 【字段含义】视频帧像素格式
  241 +/// 【推荐取值】V2TXLivePixelFormatNV12
  242 +@property(nonatomic, assign) V2TXLivePixelFormat pixelFormat;
  243 +
  244 +/// 【字段含义】视频数据包装格式
  245 +/// 【推荐取值】V2TXLiveBufferTypePixelBuffer
  246 +@property(nonatomic, assign) V2TXLiveBufferType bufferType;
  247 +
  248 +/// 【字段含义】bufferType 为 V2TXLiveBufferTypeNSData 时的视频数据
  249 +@property(nonatomic, strong, nullable) NSData *data;
  250 +
  251 +/// 【字段含义】bufferType 为 V2TXLiveBufferTypePixelBuffer 时的视频数据
  252 +@property(nonatomic, assign, nullable) CVPixelBufferRef pixelBuffer;
  253 +
  254 +/// 【字段含义】视频宽度
  255 +@property(nonatomic, assign) NSUInteger width;
  256 +
  257 +/// 【字段含义】视频高度
  258 +@property(nonatomic, assign) NSUInteger height;
  259 +
  260 +/// 【字段含义】视频帧的顺时针旋转角度
  261 +@property(nonatomic, assign) V2TXLiveRotation rotation;
  262 +
  263 +/// 【字段含义】视频纹理ID
  264 +@property(nonatomic, assign) GLuint textureId;
  265 +
  266 +@end
  267 +
  268 +/// @}
  269 +/////////////////////////////////////////////////////////////////////////////////
  270 +//
  271 +// (二)音频相关类型定义
  272 +//
  273 +/////////////////////////////////////////////////////////////////////////////////
  274 +
  275 +/// @name 音频相关类型定义
  276 +/// @{
  277 +
  278 +/**
  279 + * @brief 声音音质。
  280 + */
  281 +typedef NS_ENUM(NSInteger, V2TXLiveAudioQuality) {
  282 +
  283 + /// 语音音质:采样率:16k;单声道;音频码率:16kbps;适合语音通话为主的场景,比如在线会议,语音通话
  284 + V2TXLiveAudioQualitySpeech,
  285 +
  286 + /// 默认音质:采样率:48k;单声道;音频码率:50kbps;SDK 默认的音频质量,如无特殊需求推荐选择之
  287 + V2TXLiveAudioQualityDefault,
  288 +
  289 + /// 音乐音质:采样率:48k;双声道 + 全频带;音频码率:128kbps;适合需要高保真传输音乐的场景,比如K歌、音乐直播等
  290 + V2TXLiveAudioQualityMusic
  291 +
  292 +};
  293 +
  294 +/**
  295 + * @brief 音频帧数据
  296 + */
  297 +@interface V2TXLiveAudioFrame : NSObject
  298 +
  299 +/// 【字段含义】音频数据
  300 +@property(nonatomic, strong, nullable) NSData *data;
  301 +
  302 +/// 【字段含义】采样率
  303 +@property(nonatomic, assign) int sampleRate;
  304 +
  305 +/// 【字段含义】声道数
  306 +@property(nonatomic, assign) int channel;
  307 +
  308 +@end
  309 +
  310 +/// @}
  311 +/////////////////////////////////////////////////////////////////////////////////
  312 +//
  313 +// (三)推流器和播放器的一些统计指标数据定义
  314 +//
  315 +/////////////////////////////////////////////////////////////////////////////////
  316 +
  317 +/// @name 推流器和播放器的一些统计指标数据定义
  318 +/// @{
  319 +
  320 +/**
  321 + * @brief 推流器的统计数据。
  322 + */
  323 +@interface V2TXLivePusherStatistics : NSObject
  324 +
  325 +/// 【字段含义】当前 App 的 CPU 使用率(%)
  326 +@property(nonatomic, assign) NSUInteger appCpu;
  327 +
  328 +/// 【字段含义】当前系统的 CPU 使用率(%)
  329 +@property(nonatomic, assign) NSUInteger systemCpu;
  330 +
  331 +/// 【字段含义】视频宽度
  332 +@property(nonatomic, assign) NSUInteger width;
  333 +
  334 +/// 【字段含义】视频高度
  335 +@property(nonatomic, assign) NSUInteger height;
  336 +
  337 +/// 【字段含义】帧率(fps)
  338 +@property(nonatomic, assign) NSUInteger fps;
  339 +
  340 +/// 【字段含义】视频码率(Kbps)
  341 +@property(nonatomic, assign) NSUInteger videoBitrate;
  342 +
  343 +/// 【字段含义】音频码率(Kbps)
  344 +@property(nonatomic, assign) NSUInteger audioBitrate;
  345 +
  346 +@end
  347 +
  348 +/**
  349 + * @brief 播放器的统计数据。
  350 + */
  351 +@interface V2TXLivePlayerStatistics : NSObject
  352 +
  353 +/// 【字段含义】当前 App 的 CPU 使用率(%)
  354 +@property(nonatomic, assign) NSUInteger appCpu;
  355 +
  356 +/// 【字段含义】当前系统的 CPU 使用率(%)
  357 +@property(nonatomic, assign) NSUInteger systemCpu;
  358 +
  359 +/// 【字段含义】视频宽度
  360 +@property(nonatomic, assign) NSUInteger width;
  361 +
  362 +/// 【字段含义】视频高度
  363 +@property(nonatomic, assign) NSUInteger height;
  364 +
  365 +/// 【字段含义】帧率(fps)
  366 +@property(nonatomic, assign) NSUInteger fps;
  367 +
  368 +/// 【字段含义】视频码率(Kbps)
  369 +@property(nonatomic, assign) NSUInteger videoBitrate;
  370 +
  371 +/// 【字段含义】音频码率(Kbps)
  372 +@property(nonatomic, assign) NSUInteger audioBitrate;
  373 +
  374 +@end
  375 +
  376 +/// @}
  377 +/////////////////////////////////////////////////////////////////////////////////
  378 +//
  379 +// (四)连接状态相关枚举值定义
  380 +//
  381 +/////////////////////////////////////////////////////////////////////////////////
  382 +/// @name 连接状态相关枚举值定义
  383 +/// @{
  384 +
  385 +/**
  386 + * @brief 直播流的连接状态。
  387 + */
  388 +typedef NS_ENUM(NSInteger, V2TXLivePushStatus) {
  389 +
  390 + /// 与服务器断开连接
  391 + V2TXLivePushStatusDisconnected,
  392 +
  393 + /// 正在连接服务器
  394 + V2TXLivePushStatusConnecting,
  395 +
  396 + /// 连接服务器成功
  397 + V2TXLivePushStatusConnectSuccess,
  398 +
  399 + /// 重连服务器中
  400 + V2TXLivePushStatusReconnecting,
  401 +
  402 +};
  403 +
  404 +/// @}
  405 +/////////////////////////////////////////////////////////////////////////////////
  406 +//
  407 +// (五) 音视频状态有关的枚举值的定义
  408 +//
  409 +/////////////////////////////////////////////////////////////////////////////////
  410 +
  411 +/// @name 音视频状态有关的枚举值的定义
  412 +/// @{
  413 +
  414 +/**
  415 + * @brief 音视频状态
  416 + */
  417 +typedef NS_ENUM(NSInteger, V2TXLivePlayStatus) {
  418 +
  419 + /// 播放停止
  420 + V2TXLivePlayStatusStopped,
  421 +
  422 + /// 正在播放
  423 + V2TXLivePlayStatusPlaying,
  424 +
  425 + /// 正在缓冲(首次加载不会抛出 Loading 事件)
  426 + V2TXLivePlayStatusLoading,
  427 +
  428 +};
  429 +
  430 +/**
  431 + * @brief 音视频状态对应的原因
  432 + */
  433 +typedef NS_ENUM(NSInteger, V2TXLiveStatusChangeReason) {
  434 +
  435 + /// 内部原因
  436 + V2TXLiveStatusChangeReasonInternal,
  437 +
  438 + /// 开始网络缓冲
  439 + V2TXLiveStatusChangeReasonBufferingBegin,
  440 +
  441 + /// 结束网络缓冲
  442 + V2TXLiveStatusChangeReasonBufferingEnd,
  443 +
  444 + /// 本地启动播放
  445 + V2TXLiveStatusChangeReasonLocalStarted,
  446 +
  447 + /// 本地停止播放
  448 + V2TXLiveStatusChangeReasonLocalStopped,
  449 +
  450 + /// 远端可播放
  451 + V2TXLiveStatusChangeReasonRemoteStarted,
  452 +
  453 + /// 远端流停止或中断
  454 + V2TXLiveStatusChangeReasonRemoteStopped,
  455 +
  456 + /// 远端流离线
  457 + V2TXLiveStatusChangeReasonRemoteOffline,
  458 +
  459 +};
  460 +/// @}
  461 +
  462 +/**
  463 + * @brief 声音播放模式(音频路由)
  464 + */
  465 +typedef NS_ENUM(NSInteger, V2TXAudioRoute) {
  466 +
  467 + /// 扬声器
  468 + V2TXAudioModeSpeakerphone,
  469 +
  470 + /// 听筒
  471 + V2TXAudioModeEarpiece,
  472 +
  473 +};
  474 +
  475 +/**
  476 + * @brief 混流输入类型配置
  477 + */
  478 +typedef NS_ENUM(NSInteger, V2TXLiveMixInputType) {
  479 +
  480 + /// 混入音视频
  481 + V2TXLiveMixInputTypeAudioVideo,
  482 +
  483 + /// 只混入视频
  484 + V2TXLiveMixInputTypePureVideo,
  485 +
  486 + /// 只混入音频
  487 + V2TXLiveMixInputTypePureAudio,
  488 +
  489 +};
  490 +
  491 +/**
  492 + * @brief 云端混流中每一路子画面的位置信息
  493 + */
  494 +@interface V2TXLiveMixStream : NSObject
  495 +
  496 +/// 【字段含义】参与混流的 userId
  497 +@property(nonatomic, copy, nonnull) NSString *userId;
  498 +
  499 +/// 【字段含义】参与混流的 userId 所在对应的推流 streamId,nil 表示当前推流 streamId
  500 +@property(nonatomic, copy, nullable) NSString *streamId;
  501 +
  502 +/// 【字段含义】图层位置 x 坐标(绝对像素值)
  503 +@property(nonatomic, assign) NSInteger x;
  504 +
  505 +/// 【字段含义】图层位置 y 坐标(绝对像素值)
  506 +@property(nonatomic, assign) NSInteger y;
  507 +
  508 +/// 【字段含义】图层位置宽度(绝对像素值)
  509 +@property(nonatomic, assign) NSInteger width;
  510 +
  511 +/// 【字段含义】图层位置高度(绝对像素值)
  512 +@property(nonatomic, assign) NSInteger height;
  513 +
  514 +/// 【字段含义】图层层次(1 - 15)不可重复
  515 +@property(nonatomic, assign) NSUInteger zOrder;
  516 +
  517 +/// 【字段含义】该直播流的输入类型
  518 +@property(nonatomic, assign) V2TXLiveMixInputType inputType;
  519 +
  520 +@end
  521 +
  522 +/**
  523 + * @brief 云端混流(转码)配置
  524 + */
  525 +@interface V2TXLiveTranscodingConfig : NSObject
  526 +
  527 +/// 【字段含义】最终转码后的视频分辨率的宽度
  528 +/// 【推荐取值】推荐值:360px,如果你是纯音频推流,请将 width × height 设为 0px × 0px,否则混流后会携带一条画布背景的视频流
  529 +@property(nonatomic, assign) NSUInteger videoWidth;
  530 +
  531 +/// 【字段含义】最终转码后的视频分辨率的高度
  532 +/// 【推荐取值】推荐值:640px,如果你是纯音频推流,请将 width × height 设为 0px × 0px,否则混流后会携带一条画布背景的视频流
  533 +@property(nonatomic, assign) NSUInteger videoHeight;
  534 +
  535 +/// 【字段含义】最终转码后的视频分辨率的码率(kbps)
  536 +/// 【推荐取值】如果填0,后台会根据 videoWidth 和 videoHeight 来估算码率,您也可以参考枚举定义 V2TXLiveVideoResolution 的注释
  537 +@property(nonatomic, assign) NSUInteger videoBitrate;
  538 +
  539 +/// 【字段含义】最终转码后的视频分辨率的帧率(FPS)
  540 +/// 【推荐取值】默认值:15fps,取值范围是 (0,30]
  541 +@property(nonatomic, assign) NSUInteger videoFramerate;
  542 +
  543 +/// 【字段含义】最终转码后的视频分辨率的关键帧间隔(又称为 GOP)
  544 +/// 【推荐取值】默认值:2,单位为秒,取值范围是 [1,8]
  545 +@property(nonatomic, assign) NSUInteger videoGOP;
  546 +
  547 +/// 【字段含义】混合后画面的底色颜色,默认为黑色,格式为十六进制数字,比如:“0x61B9F1” 代表 RGB 分别为(97,158,241)
  548 +/// 【推荐取值】默认值:0x000000,黑色
  549 +@property(nonatomic, assign) NSUInteger backgroundColor;
  550 +
  551 +/// 【字段含义】混合后画面的背景图
  552 +/// 【推荐取值】默认值:nil,即不设置背景图
  553 +/// 【特别说明】背景图需要您事先在 “[控制台](https://console.cloud.tencent.com/trtc) => 应用管理 => 功能配置 => 素材管理” 中上传,
  554 +/// 上传成功后可以获得对应的“图片ID”,然后将“图片ID”转换成字符串类型并设置到 backgroundImage 里即可。
  555 +/// 例如:假设“图片ID” 为 63,可以设置 backgroundImage = "63";
  556 +@property(nonatomic, copy, nullable) NSString *backgroundImage;
  557 +
  558 +/// 【字段含义】最终转码后的音频采样率
  559 +/// 【推荐取值】默认值:48000Hz。支持12000HZ、16000HZ、22050HZ、24000HZ、32000HZ、44100HZ、48000HZ
  560 +@property(nonatomic, assign) NSUInteger audioSampleRate;
  561 +
  562 +/// 【字段含义】最终转码后的音频码率
  563 +/// 【推荐取值】默认值:64kbps,取值范围是 [32,192],单位:kbps
  564 +@property(nonatomic, assign) NSUInteger audioBitrate;
  565 +
  566 +/// 【字段含义】最终转码后的音频声道数
  567 +/// 【推荐取值】默认值:1。取值范围为 [1,2] 中的整型
  568 +@property(nonatomic, assign) NSUInteger audioChannels;
  569 +
  570 +/// 【字段含义】每一路子画面的位置信息
  571 +@property(nonatomic, copy, nonnull) NSArray<V2TXLiveMixStream *> *mixStreams;
  572 +
  573 +/// 【字段含义】输出到 CDN 上的直播流 ID
  574 +/// 如不设置该参数,SDK 会执行默认逻辑,即房间里的多路流会混合到该接口调用者的视频流上,也就是 A + B => A;
  575 +/// 如果设置该参数,SDK 会将房间里的多路流混合到您指定的直播流 ID 上,也就是 A + B => C。
  576 +/// 【推荐取值】默认值:nil,即房间里的多路流会混合到该接口调用者的视频流上。
  577 +@property(nonatomic, copy, nullable) NSString *outputStreamId;
  578 +
  579 +@end
  580 +
  581 +/////////////////////////////////////////////////////////////////////////////////
  582 +//
  583 +// (六) 公共配置组件
  584 +//
  585 +/////////////////////////////////////////////////////////////////////////////////
  586 +/// @name 公共配置组件有关的枚举值的定义
  587 +/// @{
  588 +
  589 +/**
  590 + * @brief 日志级别枚举值
  591 + */
  592 +typedef NS_ENUM(NSInteger, V2TXLiveLogLevel) {
  593 +
  594 + /// 输出所有级别的 log
  595 + V2TXLiveLogLevelAll = 0,
  596 +
  597 + /// 输出 DEBUG,INFO,WARNING,ERROR 和 FATAL 级别的 log
  598 + V2TXLiveLogLevelDebug = 1,
  599 +
  600 + /// 输出 INFO,WARNING,ERROR 和 FATAL 级别的 log
  601 + V2TXLiveLogLevelInfo = 2,
  602 +
  603 + /// 只输出 WARNING,ERROR 和 FATAL 级别的 log
  604 + V2TXLiveLogLevelWarning = 3,
  605 +
  606 + /// 只输出 ERROR 和 FATAL 级别的 log
  607 + V2TXLiveLogLevelError = 4,
  608 +
  609 + /// 只输出 FATAL 级别的 log
  610 + V2TXLiveLogLevelFatal = 5,
  611 +
  612 + /// 不输出任何 sdk log
  613 + V2TXLiveLogLevelNULL = 6,
  614 +
  615 +};
  616 +
  617 +@interface V2TXLiveLogConfig : NSObject
  618 +
  619 +/// 【字段含义】设置 Log 级别
  620 +/// 【推荐取值】默认值:V2TXLiveLogLevelAll
  621 +@property(nonatomic, assign) V2TXLiveLogLevel logLevel;
  622 +
  623 +/// 【字段含义】是否通过 V2TXLivePremierObserver 接收要打印的 Log 信息
  624 +/// 【特殊说明】如果您希望自己实现 Log 写入,可以打开此开关,Log 信息会通过 V2TXLivePremierObserver#onLog 回调给您。
  625 +/// 【推荐取值】默认值:NO
  626 +@property(nonatomic, assign) BOOL enableObserver;
  627 +
  628 +/// 【字段含义】是否允许 SDK 在编辑器(XCoder、Android Studio、Visual Studio 等)的控制台上打印 Log
  629 +/// 【推荐取值】默认值:NO
  630 +@property(nonatomic, assign) BOOL enableConsole;
  631 +
  632 +/// 【字段含义】是否启用本地 Log 文件
  633 +/// 【特殊说明】如非特殊需要,请不要关闭本地 Log 文件,否则腾讯云技术团队将无法在出现问题时进行跟踪和定位。
  634 +/// 【推荐取值】默认值:YES
  635 +@property(nonatomic, assign) BOOL enableLogFile;
  636 +
  637 +/// 【字段含义】设置本地 Log 的存储目录,默认 Log 存储位置:
  638 +/// iOS & Mac: sandbox Documents/log
  639 +@property(nonatomic, copy, nullable) NSString *logPath;
  640 +
  641 +@end
  642 +/// @}
  643 +
  644 +/// @}
  1 +//
  2 +// Copyright © 2020 Tencent. All rights reserved.
  3 +//
  4 +// Module: V2TXLive
  5 +//
  6 +
  7 +#import "V2TXLivePlayerObserver.h"
  8 +
  9 +/// @defgroup V2TXLivePlayer_ios V2TXLivePlayer
  10 +/// 腾讯云直播播放器。<br/>
  11 +/// 主要负责从指定的直播流地址拉取音视频数据,并进行解码和本地渲染播放。
  12 +///
  13 +/// 播放器包含如下能力:
  14 +/// - 支持 RTMP, HTTP-FLV, TRTC 以及 WebRTC;
  15 +/// - 屏幕截图,可以截取当前直播流的视频画面;
  16 +/// - 延时调节,可以设置播放器缓存自动调整的最小和最大时间;
  17 +/// - 自定义的视频数据处理,您可以根据项目需要处理直播流中的视频数据后,再进行渲染以及播放。
  18 +///
  19 +/// @{
  20 +
  21 +@protocol V2TXLivePlayer <NSObject>
  22 +
  23 +/**
  24 + * 设置播放器回调。
  25 + *
  26 + * 通过设置回调,可以监听 V2TXLivePlayer 播放器的一些回调事件,
  27 + * 包括播放器状态、播放音量回调、音视频首帧回调、统计数据、警告和错误信息等。
  28 + *
  29 + * @param observer 播放器的回调目标对象,更多信息请查看 {@link V2TXLivePlayerObserver}
  30 + */
  31 +- (void)setObserver:(id<V2TXLivePlayerObserver>)observer;
  32 +
  33 +/**
  34 + * 设置播放器的视频渲染 View。 该控件负责显示视频内容。
  35 + *
  36 + * @param view 播放器渲染 View
  37 + * @return 返回值 {@link V2TXLiveCode}
  38 + * - V2TXLIVE_OK:成功
  39 + */
  40 +- (V2TXLiveCode)setRenderView:(TXView *)view;
  41 +
  42 +/**
  43 + * 设置播放器画面的旋转角度。
  44 + *
  45 + * @param rotation 旋转角度 {@link V2TXLiveRotation}
  46 + * - V2TXLiveRotation0【默认值】: 0度, 不旋转
  47 + * - V2TXLiveRotation90: 顺时针旋转90度
  48 + * - V2TXLiveRotation180: 顺时针旋转180度
  49 + * - V2TXLiveRotation270: 顺时针旋转270度
  50 + * @return 返回值 {@link V2TXLiveCode}
  51 + * - V2TXLIVE_OK: 成功
  52 + */
  53 +- (V2TXLiveCode)setRenderRotation:(V2TXLiveRotation)rotation;
  54 +
  55 +/**
  56 + * 设置画面的填充模式。
  57 + *
  58 + * @param mode 画面填充模式 {@link V2TXLiveFillMode}。
  59 + * - V2TXLiveFillModeFill 【默认值】: 图像铺满屏幕,不留黑边,如果图像宽高比不同于屏幕宽高比,部分画面内容会被裁剪掉
  60 + * - V2TXLiveFillModeFit: 图像适应屏幕,保持画面完整,但如果图像宽高比不同于屏幕宽高比,会有黑边的存在
  61 + * @return 返回值 {@link V2TXLiveCode}
  62 + * - V2TXLIVE_OK: 成功
  63 + */
  64 +- (V2TXLiveCode)setRenderFillMode:(V2TXLiveFillMode)mode;
  65 +
  66 +/**
  67 + * 开始播放音视频流。
  68 + *
  69 + * @param url 音视频流的播放地址,支持 RTMP, HTTP-FLV, TRTC。
  70 + * @return 返回值 {@link V2TXLiveCode}
  71 + * - V2TXLIVE_OK: 操作成功,开始连接并播放
  72 + * - V2TXLIVE_ERROR_INVALID_PARAMETER: 操作失败,url 不合法
  73 + * - V2TXLIVE_ERROR_REFUSED: RTC 不支持同一设备上同时推拉同一个 StreamId。
  74 + */
  75 +- (V2TXLiveCode)startPlay:(NSString *)url;
  76 +
  77 +/**
  78 + * 停止播放音视频流。
  79 + *
  80 + * @return 返回值 {@link V2TXLiveCode}
  81 + * - V2TXLIVE_OK: 成功
  82 + */
  83 +- (V2TXLiveCode)stopPlay;
  84 +
  85 +/**
  86 + * 播放器是否正在播放中。
  87 + *
  88 + * @return 是否正在播放
  89 + * - 1: 正在播放中
  90 + * - 0: 已经停止播放
  91 + */
  92 +- (int)isPlaying;
  93 +
  94 +/**
  95 + * 暂停播放器的音频流。
  96 + *
  97 + * @return 返回值 {@link V2TXLiveCode}
  98 + * - V2TXLIVE_OK: 成功
  99 + */
  100 +- (V2TXLiveCode)pauseAudio;
  101 +
  102 +/**
  103 + * 恢复播放器的音频流。
  104 + *
  105 + * @return 返回值 {@link V2TXLiveCode}
  106 + * - V2TXLIVE_OK: 成功
  107 + */
  108 +- (V2TXLiveCode)resumeAudio;
  109 +
  110 +/**
  111 + * 暂停播放器的视频流。
  112 + *
  113 + * @return 返回值 {@link V2TXLiveCode}
  114 + * - V2TXLIVE_OK: 成功
  115 + */
  116 +- (V2TXLiveCode)pauseVideo;
  117 +
  118 +/**
  119 + * 恢复播放器的视频流。
  120 + *
  121 + * @return 返回值 {@link V2TXLiveCode}
  122 + * - V2TXLIVE_OK: 成功
  123 + */
  124 +- (V2TXLiveCode)resumeVideo;
  125 +
  126 +/**
  127 + * 设置播放器音量。
  128 + *
  129 + * @param volume 音量大小,取值范围0 - 100。【默认值】: 100
  130 + * @return 返回值 {@link V2TXLiveCode}
  131 + * - V2TXLIVE_OK: 成功
  132 + */
  133 +- (V2TXLiveCode)setPlayoutVolume:(NSUInteger)volume;
  134 +
  135 +/**
  136 + * 设置播放器缓存自动调整的最小和最大时间 ( 单位:秒 )。
  137 + *
  138 + * @param minTime 缓存自动调整的最小时间,取值需要大于0。【默认值】:1
  139 + * @param maxTime 缓存自动调整的最大时间,取值需要大于0。【默认值】:5
  140 + * @return 返回值 {@link V2TXLiveCode}
  141 + * - V2TXLIVE_OK: 成功
  142 + * - V2TXLIVE_ERROR_INVALID_PARAMETER: 操作失败,minTime 和 maxTime 需要大于0
  143 + * - V2TXLIVE_ERROR_REFUSED: 播放器处于播放状态,不支持修改缓存策略
  144 + */
  145 +- (V2TXLiveCode)setCacheParams:(CGFloat)minTime maxTime:(CGFloat)maxTime;
  146 +
  147 +/**
  148 + * 启用播放音量大小提示。
  149 + *
  150 + * 开启后可以在 [onPlayoutVolumeUpdate](@ref V2TXLivePlayerObserver#onPlayoutVolumeUpdate:volume:) 回调中获取到 SDK 对音量大小值的评估。
  151 + *
  152 + * @param intervalMs 决定了 onPlayoutVolumeUpdate 回调的触发间隔,单位为ms,最小间隔为100ms,如果小于等于0则会关闭回调,建议设置为300ms;【默认值】:0,不开启
  153 + * @return 返回值 {@link V2TXLiveCode}
  154 + * - V2TXLIVE_OK: 成功
  155 + */
  156 +- (V2TXLiveCode)enableVolumeEvaluation:(NSUInteger)intervalMs;
  157 +
  158 +/**
  159 + * 截取播放过程中的视频画面。
  160 + *
  161 + * @return 返回值 {@link V2TXLiveCode}
  162 + * - V2TXLIVE_OK: 成功
  163 + * - V2TXLIVE_ERROR_REFUSED: 播放器处于停止状态,不允许调用截图操作
  164 + */
  165 +- (V2TXLiveCode)snapshot;
  166 +
  167 +/**
  168 + * 设置视频自定义渲染回调。
  169 + *
  170 + * 通过该方法,可以获取解码后的每一帧视频画面,进行自定义渲染处理,添加自定义显示效果。
  171 + *
  172 + * @param enable 是否开启自定义渲染。【默认值】:NO
  173 + * @param pixelFormat 自定义渲染回调的视频像素格式 {@link V2TXLivePixelFormat}。
  174 + * @param bufferType 自定义渲染回调的视频数据格式 {@link V2TXLiveBufferType}。
  175 + * @return 返回值 {@link V2TXLiveCode}
  176 + * - V2TXLIVE_OK: 成功
  177 + * - V2TXLIVE_ERROR_NOT_SUPPORTED: 像素格式或者数据格式不支持
  178 + */
  179 +- (V2TXLiveCode)enableCustomRendering:(BOOL)enable pixelFormat:(V2TXLivePixelFormat)pixelFormat bufferType:(V2TXLiveBufferType)bufferType;
  180 +
  181 +/**
  182 + * 开启接收 SEI 消息
  183 + *
  184 + * @param enable true: 开启接收 SEI 消息; false: 关闭接收 SEI 消息。【默认值】: false
  185 + * @param payloadType 指定接收 SEI 消息的 payloadType,支持 5、242,请与发送端的 payloadType 保持一致。
  186 + *
  187 + * @return 返回值 {@link V2TXLiveCode}
  188 + * - V2TXLIVE_OK: 成功
  189 + */
  190 +- (V2TXLiveCode)enableReceiveSeiMessage:(BOOL)enable payloadType:(int)payloadType;
  191 +
  192 +/**
  193 + * 是否显示播放器状态信息的调试浮层。
  194 + *
  195 + * @param isShow 是否显示。【默认值】:NO
  196 + */
  197 +- (void)showDebugView:(BOOL)isShow;
  198 +
  199 +/**
  200 + * 调用 V2TXLivePlayer 的高级 API 接口。
  201 + *
  202 + * @note 该接口用于调用一些高级功能。
  203 + * @param key 高级 API 对应的 key。
  204 + * @param value 调用 key 所对应的高级 API 时,需要的参数。
  205 + * @return 返回值 {@link V2TXLiveCode}
  206 + * - V2TXLIVE_OK: 成功
  207 + * - V2TXLIVE_ERROR_INVALID_PARAMETER: 操作失败,key 不允许为 nil
  208 + */
  209 +- (V2TXLiveCode)setProperty:(NSString *)key value:(NSObject *)value;
  210 +
  211 +@end
  212 +
  213 +/// @}
  214 +
  215 +@interface V2TXLivePlayer : NSObject <V2TXLivePlayer>
  216 +
  217 +@end
  1 +//
  2 +// Copyright © 2020 Tencent. All rights reserved.
  3 +//
  4 +// Module: V2TXLive
  5 +//
  6 +
  7 +#import "V2TXLiveDef.h"
  8 +
  9 +@protocol V2TXLivePlayer;
  10 +
  11 +/// @defgroup V2TXLivePlayerObserver_ios V2TXLivePlayerObserver
  12 +/// 腾讯云直播的播放器回调通知。<br/>
  13 +/// 可以接收 V2TXLivePlayer 播放器的一些回调通知,包括播放器状态、播放音量回调、音视频首帧回调、统计数据、警告和错误信息等。
  14 +/// @{
  15 +
  16 +@protocol V2TXLivePlayerObserver <NSObject>
  17 +
  18 +@optional
  19 +
  20 +/**
  21 + * 直播播放器错误通知,播放器出现错误时,会回调该通知
  22 + *
  23 + * @param player 回调该通知的播放器对象
  24 + * @param code 错误码 {@link V2TXLiveCode}
  25 + * @param msg 错误信息
  26 + * @param extraInfo 扩展信息
  27 + */
  28 +- (void)onError:(id<V2TXLivePlayer>)player code:(V2TXLiveCode)code message:(NSString *)msg extraInfo:(NSDictionary *)extraInfo;
  29 +
  30 +/**
  31 + * 直播播放器警告通知
  32 + *
  33 + * @param player 回调该通知的播放器对象
  34 + * @param code 警告码 {@link V2TXLiveCode}
  35 + * @param msg 警告信息
  36 + * @param extraInfo 扩展信息
  37 + */
  38 +- (void)onWarning:(id<V2TXLivePlayer>)player code:(V2TXLiveCode)code message:(NSString *)msg extraInfo:(NSDictionary *)extraInfo;
  39 +
  40 +/**
  41 + * 直播播放器视频状态变化通知
  42 + *
  43 + * @param player 回调该通知的播放器对象
  44 + * @param status 状态码 {@link V2TXLivePlayStatus}
  45 + * @param reason 状态对应的原因 {@link V2TXLiveStatusChangeReason}
  46 + * @param extraInfo 扩展信息
  47 + */
  48 +- (void)onVideoPlayStatusUpdate:(id<V2TXLivePlayer>)player status:(V2TXLivePlayStatus)status reason:(V2TXLiveStatusChangeReason)reason extraInfo:(NSDictionary *)extraInfo;
  49 +
  50 +/**
  51 + * 直播播放器音频状态变化通知
  52 + *
  53 + * @param player 回调该通知的播放器对象
  54 + * @param status 状态码 {@link V2TXLivePlayStatus}
  55 + * @param reason 状态对应的原因 {@link V2TXLiveStatusChangeReason}
  56 + * @param extraInfo 扩展信息
  57 + */
  58 +- (void)onAudioPlayStatusUpdate:(id<V2TXLivePlayer>)player status:(V2TXLivePlayStatus)status reason:(V2TXLiveStatusChangeReason)reason extraInfo:(NSDictionary *)extraInfo;
  59 +
  60 +/**
  61 + * 播放器音量大小回调
  62 + *
  63 + * @param player 回调该通知的播放器对象
  64 + * @param volume 音量大小
  65 + * @note 调用 [enableVolumeEvaluation](@ref V2TXLivePlayer#enableVolumeEvaluation:) 开启播放音量大小提示之后,会收到这个回调通知。
  66 + */
  67 +- (void)onPlayoutVolumeUpdate:(id<V2TXLivePlayer>)player volume:(NSInteger)volume;
  68 +
  69 +/**
  70 + * 直播播放器统计数据回调
  71 + *
  72 + * @param player 回调该通知的播放器对象
  73 + * @param statistics 播放器统计数据 {@link V2TXLivePlayerStatistics}
  74 + */
  75 +- (void)onStatisticsUpdate:(id<V2TXLivePlayer>)player statistics:(V2TXLivePlayerStatistics *)statistics;
  76 +
  77 +/**
  78 + * 截图回调
  79 + *
  80 + * @note 调用 [snapshot](@ref V2TXLivePlayer#snapshot) 截图之后,会收到这个回调通知
  81 + * @param player 回调该通知的播放器对象
  82 + * @param image 已截取的视频画面
  83 + */
  84 +- (void)onSnapshotComplete:(id<V2TXLivePlayer>)player image:(TXImage *)image;
  85 +
  86 +/**
  87 + * 自定义视频渲染回调
  88 + *
  89 + * @param player 回调该通知的播放器对象
  90 + * @param videoFrame 视频帧数据 {@link V2TXLiveVideoFrame}
  91 + * @note 调用 [enableCustomRendering](@ref V2TXLivePlayer#enableCustomRendering:pixelFormat:bufferType:) 开启自定义渲染之后,会收到这个回调通知
  92 + */
  93 +- (void)onRenderVideoFrame:(id<V2TXLivePlayer>)player frame:(V2TXLiveVideoFrame *)videoFrame;
  94 +
  95 +/**
  96 + * 收到 SEI 消息的回调,发送端通过 {@link V2TXLivePusher} 中的 `sendSeiMessage` 来发送 SEI 消息。
  97 + *
  98 + * @note 调用 {@link V2TXLivePlayer} 中的 `enableReceiveSeiMessage` 开启接收 SEI 消息之后,会收到这个回调通知
  99 + *
  100 + * @param player 回调该通知的播放器对象。
  101 + * @param payloadType 回调数据的SEI payloadType
  102 + * @param data 数据
  103 + */
  104 +- (void)onReceiveSeiMessage:(id<V2TXLivePlayer>)player payloadType:(int)payloadType data:(NSData *)data;
  105 +
  106 +@end
  107 +/// @}
  1 +//
  2 +// Copyright © 2020 Tencent. All rights reserved.
  3 +//
  4 +// Module: V2TXLive
  5 +//
  6 +#import "V2TXLiveDef.h"
  7 +
  8 +NS_ASSUME_NONNULL_BEGIN
  9 +
  10 +/// @defgroup V2TXLivePremier_ios V2TXLivePremier
  11 +///
  12 +/// @{
  13 +
  14 +/////////////////////////////////////////////////////////////////////////////////
  15 +//
  16 +// V2TXLive 高级接口
  17 +//
  18 +/////////////////////////////////////////////////////////////////////////////////
  19 +
  20 +@protocol V2TXLivePremierObserver;
  21 +@protocol V2TXLivePremier <NSObject>
  22 +
  23 +/**
  24 + * 1. 获取 SDK 版本号
  25 + */
  26 ++ (NSString *)getSDKVersionStr;
  27 +
  28 +/**
  29 + * 2. 设置 V2TXLivePremier 回调接口
  30 + */
  31 ++ (void)setObserver:(id<V2TXLivePremierObserver>)observer;
  32 +
  33 +/**
  34 + * 3. 设置 Log 的配置信息
  35 + */
  36 ++ (V2TXLiveCode)setLogConfig:(V2TXLiveLogConfig *)config;
  37 +
  38 +/**
  39 + * 4. 设置 SDK 接入环境
  40 + *
  41 + * @note 如您的应用无特殊需求,请不要调用此接口进行设置。
  42 + * @param env 目前支持 “default” 和 “GDPR” 两个参数
  43 + * - default:默认环境,SDK 会在全球寻找最佳接入点进行接入。
  44 + * - GDPR:所有音视频数据和质量统计数据都不会经过中国大陆地区的服务器。
  45 + */
  46 ++ (V2TXLiveCode)setEnvironment:(const char *)env;
  47 +
  48 +/**
  49 + * 5. 设置 SDK 的授权 License
  50 + *
  51 + * 文档地址:https://cloud.tencent.com/document/product/454/34750
  52 + * @param url licence的地址
  53 + * @param key licence的秘钥
  54 + */
  55 +#if TARGET_OS_IPHONE
  56 ++ (void)setLicence:(NSString *)url key:(NSString *)key;
  57 +#endif
  58 +
  59 +/**
  60 + * 6. 设置 SDK sock5 代理配置
  61 + *
  62 + * @param host sock5 代理服务器的地址
  63 + * @param port sock5 代理服务器的端口
  64 + * @param username sock5 代理服务器的验证的用户名
  65 + * @param password sock5 代理服务器的验证的密码
  66 + */
  67 ++ (V2TXLiveCode)setSocks5Proxy:(NSString *)host port:(NSInteger)port username:(NSString *)username password:(NSString *)password;
  68 +
  69 +@end
  70 +
  71 +/////////////////////////////////////////////////////////////////////////////////
  72 +//
  73 +// V2TXLive 高级回调接口
  74 +//
  75 +/////////////////////////////////////////////////////////////////////////////////
  76 +
  77 +@protocol V2TXLivePremierObserver <NSObject>
  78 +@optional
  79 +
  80 +/**
  81 + * 自定义 Log 输出回调接口
  82 + */
  83 +- (void)onLog:(V2TXLiveLogLevel)level log:(NSString *)log;
  84 +
  85 +/**
  86 + * setLicence 接口回调
  87 + *
  88 + * @param result 设置 licence 结果 0 成功,负数失败
  89 + * @param reason 设置 licence 失败原因
  90 + */
  91 +- (void)onLicenceLoaded:(int)result Reason:(NSString *)reason;
  92 +
  93 +@end
  94 +
  95 +@interface V2TXLivePremier : NSObject <V2TXLivePremier>
  96 +
  97 +@end
  98 +
  99 +NS_ASSUME_NONNULL_END
  100 +
  101 +/// @}