WFAVEngineKit.h 12 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482
  1. //
  2. // WFAVEngineKit.h
  3. // WFAVEngineKit
  4. //
  5. // Created by heavyrain on 17/9/27.
  6. // Copyright © 2017年 WildFireChat. All rights reserved.
  7. //
  8. #import <UIKit/UIKit.h>
  9. //! Project version number for WFAVEngineKit.
  10. FOUNDATION_EXPORT double WFAVEngineKitVersionNumber;
  11. //! Project version string for WFAVEngineKit.
  12. FOUNDATION_EXPORT const unsigned char WFAVEngineKitVersionString[];
  13. #import <Foundation/Foundation.h>
  14. #import <WebRTC/WebRTC.h>
  15. #import <WFChatClient/WFCChatClient.h>
  16. @class WFAVCallSession;
  17. #pragma mark - 通知定义
  18. //通话状态更新通知
  19. extern NSString *kCallStateUpdated;
  20. #pragma mark - 枚举值定义
  21. /**
  22. 通话状态
  23. - kWFAVEngineStateIdle: 无通话状态
  24. - kWFAVEngineStateOutgoing: 呼出中
  25. - kWFAVEngineStateIncomming: 呼入中
  26. - kWFAVEngineStateConnecting: 建立中
  27. - kWFAVEngineStateConnected: 通话中
  28. */
  29. typedef NS_ENUM(NSInteger, WFAVEngineState) {
  30. kWFAVEngineStateIdle,
  31. kWFAVEngineStateOutgoing,
  32. kWFAVEngineStateIncomming,
  33. kWFAVEngineStateConnecting,
  34. kWFAVEngineStateConnected
  35. };
  36. /**
  37. 缩放模式
  38. - kWFAVVideoScalingTypeAspectFit: 填满屏幕,裁去多余部分。如果视图和视频的方向不一致,则缩放模式自动采用kWFAVVideoScalingTypeAspectFill模式,因为如果要是裁边会裁去过多内容。
  39. - kWFAVVideoScalingTypeAspectFill: 显示所有内容,背景会留黑边
  40. - kWFAVVideoScalingTypeAspectBalanced: 平衡,Fit和Fill折中
  41. - kWFAVVideoScalingTypeScaleFill: 拉伸填满
  42. */
  43. typedef NS_ENUM(NSInteger, WFAVVideoScalingType) {
  44. kWFAVVideoScalingTypeAspectFit,
  45. kWFAVVideoScalingTypeAspectFill,
  46. kWFAVVideoScalingTypeAspectBalanced,
  47. kWFAVVideoScalingTypeScaleFill
  48. };
  49. /**
  50. 视频属性
  51. 分辨率(宽x高), 帧率(fps),码率(kpbs)
  52. - kWFAVVideoProfile120P: 160x120, 15, 120
  53. - kWFAVVideoProfile120P_3: 120x120, 15, 100
  54. - kWFAVVideoProfile180P: 320x180, 15, 280
  55. - kWFAVVideoProfile180P_3: 180x180, 15, 200
  56. - kWFAVVideoProfile180P_4: 240x180, 15, 240
  57. - kWFAVVideoProfile240P: 320x240, 15, 360
  58. - kWFAVVideoProfile240P_3: 240x240, 15, 280
  59. - kWFAVVideoProfile240P_4: 424x240, 15, 400
  60. - kWFAVVideoProfile360P: 640x360, 15, 800
  61. - kWFAVVideoProfile360P_3: 360x360, 15, 520
  62. - kWFAVVideoProfile360P_4: 640x360, 30, 1200
  63. - kWFAVVideoProfile360P_6: 360x360, 30, 780
  64. - kWFAVVideoProfile360P_7: 480x360, 15, 1000
  65. - kWFAVVideoProfile360P_8: 480x360, 30, 1500
  66. - kWFAVVideoProfile480P: 640x480, 15, 1000
  67. - kWFAVVideoProfile480P_3: 480x480, 15, 800
  68. - kWFAVVideoProfile480P_4: 640x480, 30, 1500
  69. - kWFAVVideoProfile480P_6: 480x480, 30, 1200
  70. - kWFAVVideoProfile480P_8: 848x480, 15, 1200
  71. - kWFAVVideoProfile480P_9: 848x480, 30, 1800
  72. - kWFAVVideoProfile720P: 1280x720, 15, 2400
  73. - kWFAVVideoProfile720P_3: 1280x720, 30, 3699
  74. - kWFAVVideoProfile720P_5: 960x720, 15, 1920
  75. - kWFAVVideoProfile720P_6: 960x720, 30, 2880
  76. - kWFAVVideoProfileDefault: 默认值kWFAVVideoProfile360P
  77. */
  78. typedef NS_ENUM(NSInteger, WFAVVideoProfile) {
  79. kWFAVVideoProfile120P = 0,
  80. kWFAVVideoProfile120P_3 = 2,
  81. kWFAVVideoProfile180P = 10,
  82. kWFAVVideoProfile180P_3 = 12,
  83. kWFAVVideoProfile180P_4 = 13,
  84. kWFAVVideoProfile240P = 20,
  85. kWFAVVideoProfile240P_3 = 22,
  86. kWFAVVideoProfile240P_4 = 23,
  87. kWFAVVideoProfile360P = 30,
  88. kWFAVVideoProfile360P_3 = 32,
  89. kWFAVVideoProfile360P_4 = 33,
  90. kWFAVVideoProfile360P_6 = 35,
  91. kWFAVVideoProfile360P_7 = 36,
  92. kWFAVVideoProfile360P_8 = 37,
  93. kWFAVVideoProfile480P = 40,
  94. kWFAVVideoProfile480P_3 = 42,
  95. kWFAVVideoProfile480P_4 = 43,
  96. kWFAVVideoProfile480P_6 = 45,
  97. kWFAVVideoProfile480P_8 = 47,
  98. kWFAVVideoProfile480P_9 = 48,
  99. kWFAVVideoProfile720P = 50,
  100. kWFAVVideoProfile720P_3 = 52,
  101. kWFAVVideoProfile720P_5 = 54,
  102. kWFAVVideoProfile720P_6 = 55,
  103. kWFAVVideoProfileDefault = kWFAVVideoProfile360P
  104. };
  105. /**
  106. 通话结束原因
  107. - kWFAVCallEndReasonUnknown: 未知错误
  108. - kWFAVCallEndReasonBusy: 忙线
  109. - kWFAVCallEndReasonSignalError: 链路错误
  110. - kWFAVCallEndReasonHangup: 用户挂断
  111. - kWFAVCallEndReasonMediaError: 媒体错误
  112. - kWFAVCallEndReasonRemoteHangup: 对方挂断
  113. - kWFAVCallEndReasonOpenCameraFailure: 摄像头错误
  114. - kWFAVCallEndReasonTimeout: 未接听
  115. - kWFAVCallEndReasonAcceptByOtherClient: 被其它端接听
  116. */
  117. typedef NS_ENUM(NSInteger, WFAVCallEndReason) {
  118. kWFAVCallEndReasonUnknown = 0,
  119. kWFAVCallEndReasonBusy,
  120. kWFAVCallEndReasonSignalError,
  121. kWFAVCallEndReasonHangup,
  122. kWFAVCallEndReasonMediaError,
  123. kWFAVCallEndReasonRemoteHangup,
  124. kWFAVCallEndReasonOpenCameraFailure,
  125. kWFAVCallEndReasonTimeout,
  126. kWFAVCallEndReasonAcceptByOtherClient,
  127. kWFAVCallEndReasonAllLeft,
  128. kWFAVCallEndReasonRemoteBusy,
  129. kWFAVCallEndReasonRemoteTimeout,
  130. kWFAVCallEndReasonRemoteNetworkError
  131. };
  132. #pragma mark - 通话监听
  133. /**
  134. 全局的通话事件监听
  135. */
  136. @protocol WFAVEngineDelegate <NSObject>
  137. /**
  138. 收到通话的回调
  139. @param session 通话Session
  140. */
  141. - (void)didReceiveCall:(WFAVCallSession *)session;
  142. /**
  143. 播放铃声的回调
  144. @param isIncoming 来电或去电
  145. */
  146. - (void)shouldStartRing:(BOOL)isIncoming;
  147. /**
  148. 停止播放铃声的回调
  149. */
  150. - (void)shouldStopRing;
  151. @end
  152. /**
  153. 每次通话Session的事件监听
  154. */
  155. @protocol WFAVCallSessionDelegate <NSObject>
  156. /**
  157. 通话状态变更的回调
  158. @param state 通话状态
  159. */
  160. - (void)didChangeState:(WFAVEngineState)state;
  161. //多人音视频版本会调用到
  162. - (void)didParticipantJoined:(NSString *)userId;
  163. //多人音视频版本会调用到
  164. - (void)didParticipantConnected:(NSString *)userId;
  165. //多人音视频版本会调用到
  166. - (void)didParticipantLeft:(NSString *)userId withReason:(WFAVCallEndReason)reason;
  167. /**
  168. 通话结束的回调
  169. @param reason 通话结束的原因
  170. */
  171. - (void)didCallEndWithReason:(WFAVCallEndReason)reason;
  172. /**
  173. 通话发生错误的回调
  174. @param error 错误
  175. */
  176. - (void)didError:(NSError *)error;
  177. /**
  178. 通话模式发生变化的回调
  179. @param isAudioOnly 是否是纯语音
  180. */
  181. - (void)didChangeMode:(BOOL)isAudioOnly;
  182. /**
  183. 通话状态统计的回调
  184. @param stats 统计信息
  185. */
  186. - (void)didGetStats:(NSArray *)stats;
  187. /**
  188. 创建本地视频流的回调
  189. @param localVideoTrack 本地视频流
  190. */
  191. - (void)didCreateLocalVideoTrack:(RTCVideoTrack *)localVideoTrack;
  192. /**
  193. 收到对方视频流的回调
  194. @param remoteVideoTrack 对方视频流
  195. */
  196. - (void)didReceiveRemoteVideoTrack:(RTCVideoTrack *)remoteVideoTrack fromUser:(NSString *)targetId;
  197. @end
  198. #pragma mark - 通话引擎
  199. /**
  200. 通话引擎
  201. */
  202. @interface WFAVEngineKit : NSObject
  203. /**
  204. 单例
  205. @return 通话引擎的单例
  206. */
  207. + (instancetype)sharedEngineKit;
  208. /*
  209. 是否支持多人通话
  210. */
  211. @property(nonatomic, assign, readonly)BOOL supportMultiCall;
  212. /*
  213. 最大音频通话路数,单人音视频默认为2,无法修改。
  214. */
  215. @property(nonatomic, assign)int maxAudioCallCount;
  216. /*
  217. 最大视频通话路数,单人音视频默认为2,无法修改。
  218. */
  219. @property(nonatomic, assign)int maxVideoCallCount;
  220. /**
  221. 添加ICE服务地址和鉴权
  222. @param address 服务地址
  223. @param userName 用户名
  224. @param password 密码
  225. */
  226. - (void)addIceServer:(NSString *)address
  227. userName:(NSString *)userName
  228. password:(NSString *)password;
  229. /**
  230. 是否启用统计功能
  231. */
  232. @property(nonatomic, assign) BOOL shouldGetStats;
  233. /**
  234. 全局的通话事件监听
  235. */
  236. @property(nonatomic, weak) id<WFAVEngineDelegate> delegate;
  237. /**
  238. 当前的通话Session
  239. */
  240. @property(nonatomic, strong, readonly) WFAVCallSession *currentSession;
  241. /**
  242. 发起通话
  243. @param targetIds 接收用户ID,本sdk只支持一个用户
  244. @param conversation 通话所在会话
  245. @param sessionDelegate 通话Session的监听
  246. @return 通话Session
  247. */
  248. - (WFAVCallSession *)startCall:(NSArray<NSString *> *)targetIds
  249. audioOnly:(BOOL)audioOnly
  250. conversation:(WFCCConversation *)conversation
  251. sessionDelegate:(id<WFAVCallSessionDelegate>)sessionDelegate;
  252. /**
  253. 开启画面预览
  254. */
  255. - (void)startPreview;
  256. /**
  257. 设置视频参数
  258. @param videoProfile 视频属性
  259. @param swapWidthHeight 是否旋转
  260. */
  261. - (void)setVideoProfile:(WFAVVideoProfile)videoProfile swapWidthHeight:(BOOL)swapWidthHeight;
  262. /*!
  263. 模态弹出ViewController,是个工具方法。这里用来弹出通话界面,也可以弹出别的界面,但注意要配对这里的dismiss来关闭界面。弹出通话界面你也可以自己来处理,不一定必须使用此工具方法。
  264. */
  265. - (void)presentViewController:(UIViewController *)viewController;
  266. /*!
  267. 取消通话界面
  268. */
  269. - (void)dismissViewController:(UIViewController *)viewController;
  270. @end
  271. @interface WFAVParticipantProfile : NSObject
  272. @property(nonatomic, strong, readonly)NSString *userId;
  273. @property(nonatomic, assign, readonly)long long startTime;
  274. @property(nonatomic, assign, readonly)WFAVEngineState state;
  275. @property(nonatomic, assign, readonly)BOOL videoMuted;
  276. @end
  277. #pragma mark - 通话Session
  278. /**
  279. 通话的Session实体
  280. */
  281. @interface WFAVCallSession : NSObject
  282. /**
  283. 通话的唯一值
  284. */
  285. @property(nonatomic, strong, readonly) NSString *callId;
  286. /**
  287. 对方的用户ID
  288. */
  289. @property(nonatomic, strong, readonly) NSString *clientId;
  290. /**
  291. 通话Session的事件监听
  292. */
  293. @property(nonatomic, weak)id<WFAVCallSessionDelegate> delegate;
  294. /**
  295. 通话状态
  296. */
  297. @property(nonatomic, assign, readonly) WFAVEngineState state;
  298. /**
  299. 通话的开始时间,unix时间戳,单位为ms
  300. */
  301. @property(nonatomic, assign, readonly) long long startTime;
  302. /**
  303. 通话的持续时间,unix时间戳,单位为ms
  304. */
  305. @property(nonatomic, assign, readonly) long long connectedTime;
  306. /**
  307. 通话的结束时间,unix时间戳,单位为ms
  308. */
  309. @property(nonatomic, assign, readonly) long long endTime;
  310. /**
  311. 通话所在的会话
  312. */
  313. @property(nonatomic, strong, readonly) WFCCConversation *conversation;
  314. /**
  315. 是否是语音电话
  316. */
  317. @property(nonatomic, assign, getter=isAudioOnly) BOOL audioOnly;
  318. /**
  319. 通话结束原因
  320. */
  321. @property(nonatomic, assign, readonly)WFAVCallEndReason endReason;
  322. /**
  323. 是否是语音电话
  324. */
  325. @property(nonatomic, assign, getter=isSpeaker, readonly)BOOL speaker;
  326. /**
  327. 通话成员(不包含自己)
  328. */
  329. @property(nonatomic, assign, readonly)NSArray<NSString *> *participantIds;
  330. @property(nonatomic, assign, readonly)NSString *initiator;
  331. - (BOOL)isParticipant:(NSString *)userId;
  332. /**
  333. 通话成员(不包含自己)
  334. */
  335. @property(nonatomic, assign, readonly) NSArray<WFAVParticipantProfile *> *participants;
  336. @property(nonatomic, assign, readonly) WFAVParticipantProfile *myProfile;
  337. - (void)inviteNewParticipants:(NSArray<NSString *>*)targetIds;
  338. /**
  339. 是否是关掉视频
  340. */
  341. @property(nonatomic, assign, getter=isVideoMuted, readonly) BOOL videoMuted;
  342. /**
  343. 是否是关掉音频
  344. */
  345. @property(nonatomic, assign, getter=isAudioMuted, readonly) BOOL audioMuted;
  346. /**
  347. 接听通话
  348. */
  349. - (void)answerCall:(BOOL)audioOnly;
  350. /**
  351. 挂断通话
  352. */
  353. - (void)endCall;
  354. /**
  355. 开启或关闭声音
  356. @param muted 是否关闭
  357. @return 操作是否成功
  358. */
  359. - (BOOL)muteAudio:(BOOL)muted;
  360. /**
  361. 开启或关闭扬声器
  362. @param speaker 是否使用扬声器
  363. @return 操作是否成功
  364. */
  365. - (BOOL)enableSpeaker:(BOOL)speaker;
  366. /**
  367. 开启或关闭摄像头
  368. @param muted 是否关闭
  369. @return 操作是否成功
  370. */
  371. - (BOOL)muteVideo:(BOOL)muted;
  372. /**
  373. 切换前后摄像头
  374. */
  375. - (void)switchCamera;
  376. /**
  377. 设置本地视频视图Container
  378. @param videoContainerView 本地视频视图Container
  379. @param scalingType 缩放模式
  380. */
  381. - (void)setupLocalVideoView:(UIView *)videoContainerView scalingType:(WFAVVideoScalingType)scalingType;
  382. /**
  383. 设置对端视频视图Container
  384. @param videoContainerView 本地视频视图Container
  385. @param scalingType 缩放模式
  386. */
  387. - (void)setupRemoteVideoView:(UIView *)videoContainerView scalingType:(WFAVVideoScalingType)scalingType forUser:(NSString *)targetId;
  388. @end