QNRTCClient.h 12 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447
  1. //
  2. // QNRTCClient.h
  3. // QNRTCKit
  4. //
  5. // Created by 何云旗 on 2021/6/18.
  6. // Copyright © 2021 Pili Engineering, Qiniu Inc. All rights reserved.
  7. //
  8. #import <Foundation/Foundation.h>
  9. #import "QNTypeDefines.h"
  10. #import "QNTrack.h"
  11. #import "QNMessageInfo.h"
  12. #import "QNTypeDefines.h"
  13. #import "QNAudioVolumeInfo.h"
  14. @class QNRTCClient;
  15. @class QNRemoteTrack;
  16. @class QNRemoteVideoTrack;
  17. @class QNRemoteAudioTrack;
  18. @class QNDirectLiveStreamingConfig;
  19. @class QNTranscodingLiveStreamingConfig;
  20. @class QNLiveStreamingErrorInfo;
  21. @class QNTranscodingLiveStreamingTrack;
  22. @class QNNetworkQuality;
  23. @class QNConnectionDisconnectedInfo;
  24. @class QNRemoteUser;
  25. @class QNRoomMediaRelayInfo;
  26. @class QNRoomMediaRelayConfiguration;
  27. NS_ASSUME_NONNULL_BEGIN
  28. @protocol QNRTCClientDelegate <NSObject>
  29. @optional
  30. /*!
  31. * @abstract 房间状态变更的回调。
  32. *
  33. * @discussion 当状态变为 QNConnectionStateReconnecting 时,SDK 会为您自动重连,如果希望退出,直接调用 leave 即可。
  34. * 重连成功后的状态为 QNConnectionStateReconnected。
  35. *
  36. * @since v4.0.0
  37. */
  38. - (void)RTCClient:(QNRTCClient *)client didConnectionStateChanged:(QNConnectionState)state disconnectedInfo:(QNConnectionDisconnectedInfo *)info;
  39. /*!
  40. * @abstract 远端用户加入房间的回调。
  41. *
  42. * @since v4.0.0
  43. */
  44. - (void)RTCClient:(QNRTCClient *)client didJoinOfUserID:(NSString *)userID userData:(NSString *)userData;
  45. /*!
  46. * @abstract 远端用户离开房间的回调。
  47. *
  48. * @since v4.0.0
  49. */
  50. - (void)RTCClient:(QNRTCClient *)client didLeaveOfUserID:(NSString *)userID;
  51. /*!
  52. * @abstract 订阅远端用户成功的回调。
  53. *
  54. * @since v4.0.0
  55. */
  56. - (void)RTCClient:(QNRTCClient *)client didSubscribedRemoteVideoTracks:(NSArray<QNRemoteVideoTrack *> *)videoTracks audioTracks:(NSArray<QNRemoteAudioTrack *> *)audioTracks ofUserID:(NSString *)userID;
  57. /*!
  58. * @abstract 远端用户发布音/视频的回调。
  59. *
  60. * @since v4.0.0
  61. */
  62. - (void)RTCClient:(QNRTCClient *)client didUserPublishTracks:(NSArray<QNRemoteTrack *> *)tracks ofUserID:(NSString *)userID;
  63. /*!
  64. * @abstract 远端用户取消发布音/视频的回调。
  65. *
  66. * @since v4.0.0
  67. */
  68. - (void)RTCClient:(QNRTCClient *)client didUserUnpublishTracks:(NSArray<QNRemoteTrack *> *)tracks ofUserID:(NSString *)userID;
  69. /*!
  70. * @abstract 远端用户发生重连的回调。
  71. *
  72. * @since v4.0.0
  73. */
  74. - (void)RTCClient:(QNRTCClient *)client didReconnectingOfUserID:(NSString *)userID;
  75. /*!
  76. * @abstract 远端用户重连成功的回调。
  77. *
  78. * @since v4.0.0
  79. */
  80. - (void)RTCClient:(QNRTCClient *)client didReconnectedOfUserID:(NSString *)userID;
  81. /*!
  82. * @abstract 成功创建转推/合流转推任务的回调。
  83. *
  84. * @since v5.0.0
  85. */
  86. - (void)RTCClient:(QNRTCClient *)client didStartLiveStreaming:(NSString *)streamID;
  87. /*!
  88. * @abstract 停止转推/合流转推任务的回调。
  89. *
  90. * @since v5.0.0
  91. */
  92. - (void)RTCClient:(QNRTCClient *)client didStopLiveStreaming:(NSString *)streamID;
  93. /*!
  94. * @abstract 更新合流布局的回调。
  95. *
  96. * @since v4.0.0
  97. */
  98. - (void)RTCClient:(QNRTCClient *)client didTranscodingTracksUpdated:(NSString *)streamID;
  99. /*!
  100. * @abstract 合流转推出错的回调。
  101. *
  102. * @since v5.0.0
  103. */
  104. - (void)RTCClient:(QNRTCClient *)client didErrorLiveStreaming:(NSString *)streamID errorInfo:(QNLiveStreamingErrorInfo *)errorInfo;
  105. /*!
  106. * @abstract 收到远端用户发送给自己的消息时回调。
  107. *
  108. * @since v4.0.0
  109. */
  110. - (void)RTCClient:(QNRTCClient *)client didReceiveMessage:(QNMessageInfo *)message;
  111. /*!
  112. * @abstract 远端用户视频首帧解码后的回调。
  113. *
  114. * @since v4.0.0
  115. */
  116. - (void)RTCClient:(QNRTCClient *)client firstVideoDidDecodeOfTrack:(QNRemoteVideoTrack *)videoTrack remoteUserID:(NSString *)userID;
  117. /*!
  118. * @abstract 远端用户视频取消渲染到 renderView 上的回调。
  119. *
  120. * @since v4.0.0
  121. */
  122. - (void)RTCClient:(QNRTCClient *)client didDetachRenderTrack:(QNRemoteVideoTrack *)videoTrack remoteUserID:(NSString *)userID;
  123. /*!
  124. * @abstract 跨房媒体转发状态变更的回调。
  125. *
  126. * @warning 非主动调用触发,由目标房间状态变化引起此通知。目前仅当目标房间关闭(QNMediaRelayStateRoomClosed)时,会触发此通知。
  127. *
  128. * @param relayRoom 目标房间名称
  129. *
  130. * @param state 目标房间媒体转发状态
  131. *
  132. * @since v4.0.1
  133. */
  134. - (void)RTCClient:(QNRTCClient *)client didMediaRelayStateChanged:(NSString *)relayRoom state:(QNMediaRelayState)state;
  135. /*!
  136. * @abstract 远端音频 track mix 数据的回调。
  137. *
  138. * @discussion 需要注意的是这个回调在 AU Remote IO 线程,请不要做过于耗时的操作,否则可能阻塞该线程影响音频输出或其他未知问题。
  139. *
  140. * @since v5.0.0
  141. */
  142. - (void)RTCClient:(QNRTCClient *)client remoteTrackMixedDidGetAudioBuffer:(AudioBuffer *)audioBuffer;
  143. /*!
  144. * @abstract 本地网络质量信息的回调。
  145. *
  146. * @param quality 当前应用上下行的网络质量
  147. *
  148. * @since v5.0.0
  149. */
  150. - (void)RTCClient:(QNRTCClient *)client didNetworkQualityNotified:(QNNetworkQuality *)quality;
  151. /*!
  152. * @abstract 用户音量提示回调,本地远端一起回调,本地 user id 为空。
  153. *
  154. * @param userVolumeList 用户音量信息,按音量由高到低排序
  155. *
  156. * @since v5.2.6
  157. */
  158. - (void)RTCClient:(QNRTCClient *)client didUserVolumeIndication:(NSArray<QNAudioVolumeInfo *>*)userVolumeList;
  159. @end
  160. @interface QNRTCClient : NSObject
  161. /*!
  162. * @abstract 状态回调的 delegate。
  163. *
  164. * @since v4.0.0
  165. */
  166. @property (nonatomic, weak) id<QNRTCClientDelegate> delegate;
  167. /*!
  168. * @abstract 房间状态。
  169. *
  170. * @since v5.0.0
  171. */
  172. @property (nonatomic, assign, readonly) QNConnectionState connectionState;
  173. /*!
  174. * @abstract 是否自动订阅远端的流,默认为 YES。
  175. *
  176. * @since v4.0.0
  177. */
  178. @property (nonatomic, assign) BOOL autoSubscribe;
  179. /*!
  180. * @abstract 远端用户列表
  181. *
  182. * @since v4.0.0
  183. */
  184. @property (nonatomic, strong, readonly) NSArray<QNRemoteUser *> *remoteUserList;
  185. /*!
  186. * @abstract 已发布 track 列表
  187. *
  188. * @since v4.0.0
  189. */
  190. @property (nonatomic, strong, readonly) NSArray<QNLocalTrack *> *publishedTracks;
  191. - (instancetype)init NS_UNAVAILABLE;
  192. /*!
  193. * @abstract 设置直播场景下的用户角色。
  194. *
  195. * @param role 直播场景里的用户角色。
  196. * @see QNClientRole.
  197. *
  198. * @discussion 该方法在加入频道前后均可调用。
  199. *
  200. * @warning 该方法仅适用于直播场景。
  201. *
  202. * @since v4.0.1
  203. */
  204. - (void)setClientRole:(QNClientRole)role completeCallback:(nullable QNClientRoleResultCallback)callback;
  205. /*!
  206. * @abstract 加入房间。
  207. *
  208. * @since v4.0.0
  209. */
  210. - (void)join:(NSString *)token;
  211. /*!
  212. * @abstract 加入房间。
  213. *
  214. * @since v4.0.0
  215. */
  216. - (void)join:(NSString *)token userData:(NSString *)userData;
  217. /*!
  218. * @abstract 退出房间。
  219. *
  220. * @since v4.0.0
  221. */
  222. - (void)leave;
  223. /*!
  224. * @abstract 发布 tracks。
  225. *
  226. * @since v4.0.0
  227. */
  228. - (void)publish:(NSArray<QNLocalTrack *> *)tracks;
  229. /*!
  230. * @abstract 发布 tracks。
  231. *
  232. * @since v4.0.0
  233. */
  234. - (void)publish:(NSArray<QNLocalTrack *> *)tracks completeCallback:(QNPublishResultCallback)callback;
  235. /*!
  236. * @abstract 取消发布 tracks。
  237. *
  238. * @since v4.0.0
  239. */
  240. - (void)unpublish:(NSArray<QNLocalTrack *> *)tracks;
  241. /*!
  242. * @abstract 订阅 tracks。
  243. *
  244. * @since v4.0.0
  245. */
  246. - (void)subscribe:(NSArray<QNRemoteTrack *> *)tracks;
  247. /*!
  248. * @abstract 取消订阅。
  249. *
  250. * @since v4.0.0
  251. */
  252. - (void)unsubscribe:(NSArray<QNRemoteTrack *> *)tracks;
  253. /*!
  254. * @abstract 开启单路转推。
  255. *
  256. * @since v4.0.0
  257. */
  258. - (void)startLiveStreamingWithDirect:(QNDirectLiveStreamingConfig *)config;
  259. /*!
  260. * @abstract 开启合流转推。
  261. *
  262. * @since v4.0.0
  263. */
  264. - (void)startLiveStreamingWithTranscoding:(QNTranscodingLiveStreamingConfig *)config;
  265. /*!
  266. * @abstract 停止单路转推。
  267. *
  268. * @since v4.0.0
  269. */
  270. - (void)stopLiveStreamingWithDirect:(QNDirectLiveStreamingConfig *)config;
  271. /*!
  272. * @abstract 停止合流转推。
  273. *
  274. * @since v4.0.0
  275. */
  276. - (void)stopLiveStreamingWithTranscoding:(QNTranscodingLiveStreamingConfig *)config;
  277. /*!
  278. * @abstract 将对应的音视频 Track 加入合流。
  279. *
  280. * @discussion 需要更新合流布局时,重新调用该接口即可。若使用默认的合流任务,则 streamID 传入 nil 即可。
  281. *
  282. * @since v4.0.0
  283. */
  284. - (void)setTranscodingLiveStreamingID:(nullable NSString *)streamID withTracks:(NSArray <QNTranscodingLiveStreamingTrack *> *)tracks;
  285. /*!
  286. * @abstract 将对应的音视频 Track 从合流中移除。
  287. *
  288. * @discussion 此处 QNMergeStreamLayout 中只需要设置 trackID 即可,其它参数可忽略。若使用默认的合流任务,则 streamID 传入 nil 即可。
  289. *
  290. * @since v4.0.0
  291. */
  292. - (void)removeTranscodingLiveStreamingID:(nullable NSString *)streamID withTracks:(NSArray <QNTranscodingLiveStreamingTrack *> *)tracks;
  293. /*!
  294. * @abstract 发送消息给 users 数组中的所有 userID。若需要给房间中的所有人发消息,数组传入 nil 即可。
  295. *
  296. * @since v4.0.0
  297. */
  298. - (void)sendMessage:(NSString *)messsage toUsers:(nullable NSArray<NSString *> *)users messageId:(nullable NSString *)messageId;
  299. /*!
  300. * @abstract 开启跨房媒体转发
  301. *
  302. * @discussion 如果已经开启,则调用失败
  303. * 当所有目标房间跨房媒体转发都失败,则本次跨房媒体转发请求视为失败,使用跨房媒体转发功能需要再次调用此 API
  304. * 当有任意一个目标或多个目标房间媒体转发成功,则本次跨房媒体转发请求视为成功,具体每个房间的状态参考回调结果。
  305. *
  306. * @param config 跨房间媒体转发参数配置。
  307. *
  308. * @see QNRoomMediaRelayConfiguration
  309. *
  310. * @warning 该方法仅适用直播类型房间中角色类型为主播的用户。
  311. *
  312. * @since v4.0.1
  313. */
  314. - (void)startRoomMediaRelay:(QNRoomMediaRelayConfiguration *_Nonnull)config completeCallback:(nullable QNMediaRelayResultCallback)callback;
  315. /*!
  316. * @abstract 更新媒体流转发的房间。
  317. *
  318. * @discussion 成功开启跨房媒体转发后,如果你希望将流转发到多个目标房间,或退出当前正在转发的房间,可以调用该方法。
  319. * 此 API 为全量更新,正在跨房媒体转发中却未被包含在参数 configuration 中的房间,将停止媒体转发。
  320. *
  321. * @param config 跨房间媒体流转发参数配置。
  322. *
  323. * @see QNRoomMediaRelayConfiguration
  324. *
  325. * @warning 调用此 API 前必须确保已经成功开启跨房媒体转发,否则将调用失败;该方法仅适用直播类型房间中角色类型为主播的用户。
  326. *
  327. * @since v4.0.1
  328. */
  329. - (void)updateRoomMediaRelay:(QNRoomMediaRelayConfiguration *_Nonnull)config completeCallback:(nullable QNMediaRelayResultCallback)callback;
  330. /*!
  331. * @abstract 停止跨房间媒体流转发。
  332. *
  333. * @discussion 如果未开启,则调用失败。
  334. *
  335. * @warning 一旦停止,会停止在所有目标房间中的媒体转发;该方法仅适用直播类型房间中角色类型为主播的用户。
  336. *
  337. * @since v4.0.1
  338. */
  339. - (void)stopRoomMediaRelay:(nullable QNMediaRelayResultCallback)callback;
  340. /*!
  341. * @abstract 获取远端用户。
  342. *
  343. * @since v4.0.0
  344. */
  345. - (QNRemoteUser *)getRemoteUser:(NSString *)userID;
  346. /*!
  347. * @abstract 获取当前订阅的远端用户网络质量。
  348. *
  349. * @since v5.0.0
  350. */
  351. - (NSDictionary *)getUserNetworkQuality;
  352. /*!
  353. * @abstract 获取远端用户视频传输统计信息。
  354. *
  355. * @since v4.0.0
  356. */
  357. - (NSDictionary *)getRemoteVideoTrackStats;
  358. /*!
  359. * @abstract 获取远端用户音频传输统计信息。
  360. *
  361. * @since v4.0.0
  362. */
  363. - (NSDictionary *)getRemoteAudioTrackStats;
  364. /*!
  365. * @abstract 获取本地视频传输统计信息。
  366. *
  367. * @since v4.0.0
  368. */
  369. - (NSDictionary *)getLocalVideoTrackStats;
  370. /*!
  371. * @abstract 获取本地音频传输统计信息。
  372. *
  373. * @since v4.0.0
  374. */
  375. - (NSDictionary *)getLocalAudioTrackStats;
  376. /**
  377. * 开启语音音量监测
  378. *
  379. * @param interval 指定音量提示的时间间隔,≤ 0: 禁用音量提示功能,> 0: 音量提示的间隔,单位为毫秒,最小取值为 100。
  380. *
  381. * @since v5.2.6
  382. */
  383. - (void)enableAudioVolumeIndication:(int)interval;
  384. @end
  385. NS_ASSUME_NONNULL_END