WFAVEngineKit.h 9.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413
  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. 通话状态
  20. - kWFAVEngineStateIdle: 无通话状态
  21. - kWFAVEngineStateOutgoing: 呼出中
  22. - kWFAVEngineStateIncomming: 呼入中
  23. - kWFAVEngineStateConnecting: 建立中
  24. - kWFAVEngineStateConnected: 通话中
  25. */
  26. typedef NS_ENUM(NSInteger, WFAVEngineState) {
  27. kWFAVEngineStateIdle,
  28. kWFAVEngineStateOutgoing,
  29. kWFAVEngineStateIncomming,
  30. kWFAVEngineStateConnecting,
  31. kWFAVEngineStateConnected
  32. };
  33. /**
  34. 缩放模式
  35. - kWFAVVideoScalingTypeAspectFit: 自适应
  36. - kWFAVVideoScalingTypeAspectFill: 拉伸
  37. - kWFAVVideoScalingTypeAspectBalanced: 平衡
  38. */
  39. typedef NS_ENUM(NSInteger, WFAVVideoScalingType) {
  40. kWFAVVideoScalingTypeAspectFit,
  41. kWFAVVideoScalingTypeAspectFill,
  42. kWFAVVideoScalingTypeAspectBalanced
  43. };
  44. /**
  45. 视频属性
  46. 分辨率(宽x高), 帧率(fps),码率(kpbs)
  47. - kWFAVVideoProfile120P: 160x120, 15, 120
  48. - kWFAVVideoProfile120P_3: 120x120, 15, 100
  49. - kWFAVVideoProfile180P: 320x180, 15, 280
  50. - kWFAVVideoProfile180P_3: 180x180, 15, 200
  51. - kWFAVVideoProfile180P_4: 240x180, 15, 240
  52. - kWFAVVideoProfile240P: 320x240, 15, 360
  53. - kWFAVVideoProfile240P_3: 240x240, 15, 280
  54. - kWFAVVideoProfile240P_4: 424x240, 15, 400
  55. - kWFAVVideoProfile360P: 640x360, 15, 800
  56. - kWFAVVideoProfile360P_3: 360x360, 15, 520
  57. - kWFAVVideoProfile360P_4: 640x360, 30, 1200
  58. - kWFAVVideoProfile360P_6: 360x360, 30, 780
  59. - kWFAVVideoProfile360P_7: 480x360, 15, 1000
  60. - kWFAVVideoProfile360P_8: 480x360, 30, 1500
  61. - kWFAVVideoProfile480P: 640x480, 15, 1000
  62. - kWFAVVideoProfile480P_3: 480x480, 15, 800
  63. - kWFAVVideoProfile480P_4: 640x480, 30, 1500
  64. - kWFAVVideoProfile480P_6: 480x480, 30, 1200
  65. - kWFAVVideoProfile480P_8: 848x480, 15, 1200
  66. - kWFAVVideoProfile480P_9: 848x480, 30, 1800
  67. - kWFAVVideoProfile720P: 1280x720, 15, 2400
  68. - kWFAVVideoProfile720P_3: 1280x720, 30, 3699
  69. - kWFAVVideoProfile720P_5: 960x720, 15, 1920
  70. - kWFAVVideoProfile720P_6: 960x720, 30, 2880
  71. - kWFAVVideoProfileDefault: 默认值kWFAVVideoProfile360P
  72. */
  73. typedef NS_ENUM(NSInteger, WFAVVideoProfile) {
  74. kWFAVVideoProfile120P = 0,
  75. kWFAVVideoProfile120P_3 = 2,
  76. kWFAVVideoProfile180P = 10,
  77. kWFAVVideoProfile180P_3 = 12,
  78. kWFAVVideoProfile180P_4 = 13,
  79. kWFAVVideoProfile240P = 20,
  80. kWFAVVideoProfile240P_3 = 22,
  81. kWFAVVideoProfile240P_4 = 23,
  82. kWFAVVideoProfile360P = 30,
  83. kWFAVVideoProfile360P_3 = 32,
  84. kWFAVVideoProfile360P_4 = 33,
  85. kWFAVVideoProfile360P_6 = 35,
  86. kWFAVVideoProfile360P_7 = 36,
  87. kWFAVVideoProfile360P_8 = 37,
  88. kWFAVVideoProfile480P = 40,
  89. kWFAVVideoProfile480P_3 = 42,
  90. kWFAVVideoProfile480P_4 = 43,
  91. kWFAVVideoProfile480P_6 = 45,
  92. kWFAVVideoProfile480P_8 = 47,
  93. kWFAVVideoProfile480P_9 = 48,
  94. kWFAVVideoProfile720P = 50,
  95. kWFAVVideoProfile720P_3 = 52,
  96. kWFAVVideoProfile720P_5 = 54,
  97. kWFAVVideoProfile720P_6 = 55,
  98. kWFAVVideoProfileDefault = kWFAVVideoProfile360P
  99. };
  100. /**
  101. 通话结束原因
  102. - kWFAVCallEndReasonUnknown: 未知错误
  103. - kWFAVCallEndReasonBusy: 忙线
  104. - kWFAVCallEndReasonSignalError: 链路错误
  105. - kWFAVCallEndReasonHangup: 用户挂断
  106. - kWFAVCallEndReasonMediaError: 媒体错误
  107. - kWFAVCallEndReasonRemoteHangup: 对方挂断
  108. - kWFAVCallEndReasonOpenCameraFailure: 摄像头错误
  109. - kWFAVCallEndReasonTimeout: 未接听
  110. - kWFAVCallEndReasonAcceptByOtherClient: 被其它端接听
  111. */
  112. typedef NS_ENUM(NSInteger, WFAVCallEndReason) {
  113. kWFAVCallEndReasonUnknown = 0,
  114. kWFAVCallEndReasonBusy,
  115. kWFAVCallEndReasonSignalError,
  116. kWFAVCallEndReasonHangup,
  117. kWFAVCallEndReasonMediaError,
  118. kWFAVCallEndReasonRemoteHangup,
  119. kWFAVCallEndReasonOpenCameraFailure,
  120. kWFAVCallEndReasonTimeout,
  121. kWFAVCallEndReasonAcceptByOtherClient
  122. };
  123. #pragma mark - 通话监听
  124. /**
  125. 全局的通话事件监听
  126. */
  127. @protocol WFAVEngineDelegate <NSObject>
  128. /**
  129. 收到通话的回调
  130. @param session 通话Session
  131. */
  132. - (void)didReceiveCall:(WFAVCallSession *)session;
  133. /**
  134. 播放铃声的回调
  135. @param isIncoming 来电或去电
  136. */
  137. - (void)shouldStartRing:(BOOL)isIncoming;
  138. /**
  139. 停止播放铃声的回调
  140. */
  141. - (void)shouldStopRing;
  142. @end
  143. /**
  144. 每次通话Session的事件监听
  145. */
  146. @protocol WFAVCallSessionDelegate <NSObject>
  147. /**
  148. 通话状态变更的回调
  149. @param state 通话状态
  150. */
  151. - (void)didChangeState:(WFAVEngineState)state;
  152. /**
  153. 通话结束的回调
  154. @param reason 通话结束的原因
  155. */
  156. - (void)didCallEndWithReason:(WFAVCallEndReason)reason;
  157. /**
  158. 通话发生错误的回调
  159. @param error 错误
  160. */
  161. - (void)didError:(NSError *)error;
  162. /**
  163. 通话模式发生变化的回调
  164. @param isAudioOnly 是否是纯语音
  165. */
  166. - (void)didChangeMode:(BOOL)isAudioOnly;
  167. /**
  168. 通话状态统计的回调
  169. @param stats 统计信息
  170. */
  171. - (void)didGetStats:(NSArray *)stats;
  172. /**
  173. 创建本地视频流的回调
  174. @param localVideoTrack 本地视频流
  175. */
  176. - (void)didCreateLocalVideoTrack:(RTCVideoTrack *)localVideoTrack;
  177. /**
  178. 收到对方视频流的回调
  179. @param remoteVideoTrack 对方视频流
  180. */
  181. - (void)didReceiveRemoteVideoTrack:(RTCVideoTrack *)remoteVideoTrack;
  182. @end
  183. #pragma mark - 通话引擎
  184. /**
  185. 通话引擎
  186. */
  187. @interface WFAVEngineKit : NSObject
  188. /**
  189. 单例
  190. @return 通话引擎的单例
  191. */
  192. + (instancetype)sharedEngineKit;
  193. /**
  194. 添加ICE服务地址和鉴权
  195. @param address 服务地址
  196. @param userName 用户名
  197. @param password 密码
  198. */
  199. - (void)addIceServer:(NSString *)address
  200. userName:(NSString *)userName
  201. password:(NSString *)password;
  202. /**
  203. 是否启用统计功能
  204. */
  205. @property(nonatomic, assign) BOOL shouldGetStats;
  206. /**
  207. 全局的通话事件监听
  208. */
  209. @property(nonatomic, weak) id<WFAVEngineDelegate> delegate;
  210. /**
  211. 当前的通话Session
  212. */
  213. @property(nonatomic, strong, readonly) WFAVCallSession *currentSession;
  214. /**
  215. 发起通话
  216. @param clientId 对方用户ID
  217. @param conversation 通话所在会话
  218. @param sessionDelegate 通话Session的监听
  219. @return 通话Session
  220. */
  221. - (WFAVCallSession *)startCall:(NSString *)clientId
  222. audioOnly:(BOOL)audioOnly
  223. conversation:(WFCCConversation *)conversation
  224. sessionDelegate:(id<WFAVCallSessionDelegate>)sessionDelegate;
  225. /**
  226. 开启画面预览
  227. */
  228. - (void)startPreview;
  229. /**
  230. 设置视频参数
  231. @param videoProfile 视频属性
  232. @param swapWidthHeight 是否旋转
  233. */
  234. - (void)setVideoProfile:(WFAVVideoProfile)videoProfile swapWidthHeight:(BOOL)swapWidthHeight;
  235. /*!
  236. 模态弹出ViewController,是个工具方法。这里用来弹出通话界面,也可以弹出别的界面,但注意要配对这里的dismiss来关闭界面。弹出通话界面你也可以自己来处理,不一定必须使用此工具方法。
  237. */
  238. - (void)presentViewController:(UIViewController *)viewController;
  239. /*!
  240. 取消通话界面
  241. */
  242. - (void)dismissViewController:(UIViewController *)viewController;
  243. @end
  244. #pragma mark - 通话Session
  245. /**
  246. 通话的Session实体
  247. */
  248. @interface WFAVCallSession : NSObject
  249. /**
  250. 通话的唯一值
  251. */
  252. @property(nonatomic, strong, readonly) NSString *callId;
  253. /**
  254. 对方的用户ID
  255. */
  256. @property(nonatomic, strong, readonly) NSString *clientId;
  257. /**
  258. 通话Session的事件监听
  259. */
  260. @property(nonatomic, weak)id<WFAVCallSessionDelegate> delegate;
  261. /**
  262. 通话状态
  263. */
  264. @property(nonatomic, assign, readonly) WFAVEngineState state;
  265. /**
  266. 通话的开始时间,unix时间戳,单位为ms
  267. */
  268. @property(nonatomic, assign, readonly) long long startTime;
  269. /**
  270. 通话的持续时间,unix时间戳,单位为ms
  271. */
  272. @property(nonatomic, assign, readonly) long long connectedTime;
  273. /**
  274. 通话的结束时间,unix时间戳,单位为ms
  275. */
  276. @property(nonatomic, assign, readonly) long long endTime;
  277. /**
  278. 通话所在的会话
  279. */
  280. @property(nonatomic, strong, readonly) WFCCConversation *conversation;
  281. /**
  282. 是否是语音电话
  283. */
  284. @property(nonatomic, assign, getter=isAudioOnly) BOOL audioOnly;
  285. /**
  286. 通话结束原因
  287. */
  288. @property(nonatomic, assign, readonly)WFAVCallEndReason endReason;
  289. /**
  290. 是否是语音电话
  291. */
  292. @property(nonatomic, assign, getter=isSpeaker, readonly)BOOL speaker;
  293. /**
  294. 接听通话
  295. */
  296. - (void)answerCall:(BOOL)audioOnly;
  297. /**
  298. 挂断通话
  299. */
  300. - (void)endCall;
  301. /**
  302. 开启或关闭声音
  303. @param muted 是否关闭
  304. @return 操作是否成功
  305. */
  306. - (BOOL)muteAudio:(BOOL)muted;
  307. /**
  308. 开启或关闭扬声器
  309. @param speaker 是否使用扬声器
  310. @return 操作是否成功
  311. */
  312. - (BOOL)enableSpeaker:(BOOL)speaker;
  313. /**
  314. 开启或关闭摄像头
  315. @param muted 是否关闭
  316. @return 操作是否成功
  317. */
  318. - (BOOL)muteVideo:(BOOL)muted;
  319. /**
  320. 切换前后摄像头
  321. */
  322. - (void)switchCamera;
  323. /**
  324. 设置本地视频视图Container
  325. @param videoContainerView 本地视频视图Container
  326. @param scalingType 缩放模式
  327. */
  328. - (void)setupLocalVideoView:(UIView *)videoContainerView scalingType:(WFAVVideoScalingType)scalingType;
  329. /**
  330. 设置对端视频视图Container
  331. @param videoContainerView 本地视频视图Container
  332. @param scalingType 缩放模式
  333. */
  334. - (void)setupRemoteVideoView:(UIView *)videoContainerView scalingType:(WFAVVideoScalingType)scalingType;
  335. @end