Sin descripción

RCTAgora.m 10KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340
  1. //
  2. // RCTAgora.m
  3. // RCTAgora
  4. //
  5. // Created by 邓博 on 2017/6/13.
  6. // Copyright © 2017年 Syan. All rights reserved.
  7. //
  8. #import "RCTAgora.h"
  9. #import <React/RCTEventDispatcher.h>
  10. #import <React/RCTBridge.h>
  11. #import <React/RCTUIManager.h>
  12. #import <React/RCTView.h>
  13. #import "AgoraConst.h"
  14. @interface RCTAgora ()
  15. @property (strong, nonatomic) AgoraRtcEngineKit *rtcEngine;
  16. @end
  17. @implementation RCTAgora
  18. RCT_EXPORT_MODULE();
  19. @synthesize bridge = _bridge;
  20. //销毁引擎实例
  21. - (void)dealloc {
  22. [AgoraRtcEngineKit destroy];
  23. }
  24. //导出常量
  25. - (NSDictionary *)constantsToExport {
  26. return @{};
  27. }
  28. /**
  29. * 初始化AgoraKit
  30. *
  31. * @param appid
  32. * @param channelProfile 设置频道模式
  33. * @param videoProfile 视频模式
  34. * @param clientRole 创建角色
  35. * @param channelName 频道名称
  36. * @param info 附加字段
  37. * @param reactTag 绑定view的tag
  38. * @return 0 when executed successfully. return negative value if failed.
  39. */
  40. RCT_EXPORT_METHOD(init:(NSDictionary *)options) {
  41. [AgoraConst share].appid = options[@"appid"];
  42. self.rtcEngine = [AgoraRtcEngineKit sharedEngineWithAppId:options[@"appid"] delegate:self];
  43. [AgoraConst share].rtcEngine = self.rtcEngine;
  44. //频道模式
  45. [self.rtcEngine setChannelProfile:[options[@"channelProfile"] integerValue]];
  46. //启用双流模式
  47. [self.rtcEngine enableDualStreamMode:YES];
  48. [self.rtcEngine enableVideo];
  49. [self.rtcEngine setVideoProfile:[options[@"videoProfile"] integerValue]swapWidthAndHeight:[options[@"swapWidthAndHeight"]boolValue]];
  50. [self.rtcEngine setClientRole:[options[@"clientRole"] integerValue] withKey:nil];
  51. //Agora Native SDK 与 Agora Web SDK 间的互通
  52. [self.rtcEngine enableWebSdkInteroperability:YES];
  53. }
  54. //加入房间
  55. RCT_EXPORT_METHOD(joinChannel:(NSString *)channelName uid:(NSInteger)uid) {
  56. //保存一下uid 在自定义视图使用
  57. [AgoraConst share].localUid = uid;
  58. [self.rtcEngine joinChannelByKey:nil channelName:channelName info:nil uid:uid joinSuccess:NULL];
  59. }
  60. //离开频道
  61. RCT_EXPORT_METHOD(leaveChannel){
  62. [self.rtcEngine leaveChannel:^(AgoraRtcStats *stat) {
  63. NSMutableDictionary *params = @{}.mutableCopy;
  64. params[@"type"] = @"onLeaveChannel";
  65. [self sendEvent:params];
  66. }];
  67. }
  68. //销毁引擎实例
  69. RCT_EXPORT_METHOD(destroy){
  70. [AgoraRtcEngineKit destroy];
  71. }
  72. //设置 本地 视频显示属性
  73. RCT_EXPORT_METHOD(setupLocalVideo:(NSDictionary *)options){
  74. AgoraRtcVideoCanvas *canvas = [[AgoraRtcVideoCanvas alloc] init];
  75. canvas.uid = [options[@"uid"] integerValue];
  76. canvas.view = [self.bridge.uiManager viewForReactTag:options[@"reactTag"]];
  77. canvas.renderMode = [options[@"renderMode"] integerValue];
  78. [self.rtcEngine setupLocalVideo:canvas];
  79. }
  80. //设置 远端 视频显示视图
  81. RCT_EXPORT_METHOD(setupRemoteVideo:(NSDictionary *)options){
  82. AgoraRtcVideoCanvas *canvas = [[AgoraRtcVideoCanvas alloc] init];
  83. canvas.uid = [options[@"uid"] integerValue];
  84. canvas.view = [self.bridge.uiManager viewForReactTag:options[@"reactTag"]];
  85. canvas.renderMode = [options[@"renderMode"] integerValue];
  86. [self.rtcEngine setupRemoteVideo:canvas];
  87. }
  88. //开启视频预览
  89. RCT_EXPORT_METHOD(startPreview){
  90. [self.rtcEngine startPreview];
  91. }
  92. //配置旁路直播推流(configPublisher)
  93. //请确保用户已经调用 setClientRole() 且已将用户角色设为主播
  94. //主播必须在加入频道前调用本章 API
  95. RCT_EXPORT_METHOD(configPublisher:(NSDictionary *)config){
  96. AgoraPublisherConfiguration *apc = [AgoraPublisherConfiguration new];
  97. apc.width = [config[@"width"] integerValue]; //旁路直播的输出码流的宽度
  98. apc.height = [config[@"height"] integerValue]; //旁路直播的输出码流的高度
  99. apc.framerate = [config[@"framerate"] integerValue]; //旁路直播的输出码率帧率
  100. apc.bitrate = [config[@"bitrate"] integerValue]; //旁路直播输出码流的码率
  101. apc.defaultLayout = [config[@"defaultLayout"] integerValue]; //设置流生命周期
  102. apc.lifeCycle = [config[@"lifeCycle"] integerValue]; //默认合图布局
  103. apc.publishUrl = config[@"publishUrl"]; //合图推流地址
  104. apc.rawStreamUrl = config[@"rawStreamUrl"]; //单流地址
  105. apc.extraInfo = config[@"extraInfo"]; //其他信息
  106. apc.owner = [config[@"owner"] boolValue]; //是否将当前主播设为该 RTMP 流的主人
  107. [self.rtcEngine configPublisher:apc];
  108. }
  109. //设置本地视频显示模式
  110. RCT_EXPORT_METHOD(setLocalRenderMode:(NSUInteger)mode){
  111. [self.rtcEngine setLocalRenderMode:mode];
  112. }
  113. //设置远端视频显示模式
  114. RCT_EXPORT_METHOD(setRemoteRenderMode:(NSUInteger)uid mode:(NSUInteger)mode){
  115. [self.rtcEngine setRemoteRenderMode:uid mode:mode];
  116. }
  117. //启用说话者音量提示
  118. RCT_EXPORT_METHOD(enableAudioVolumeIndication:(NSUInteger)interval smooth:(NSUInteger)smooth){
  119. [self.rtcEngine enableAudioVolumeIndication:interval smooth:smooth];
  120. }
  121. //开启屏幕共享
  122. //RCT_EXPORT_METHOD(startScreenCapture:(NSUInteger)windowId){
  123. //
  124. //}
  125. //关闭视频预览
  126. RCT_EXPORT_METHOD(stopPreview){
  127. [self.rtcEngine stopPreview];
  128. }
  129. //切换前置/后置摄像头
  130. RCT_EXPORT_METHOD(switchCamera){
  131. [self.rtcEngine switchCamera];
  132. }
  133. //开启视频模式
  134. RCT_EXPORT_METHOD(enableVideo){
  135. [self.rtcEngine enableVideo];
  136. }
  137. //关闭视频
  138. RCT_EXPORT_METHOD(disableVideo){
  139. [self.rtcEngine disableVideo];
  140. }
  141. //开启扬声器 Yes: 音频输出至扬声器 No: 音频输出至听筒
  142. RCT_EXPORT_METHOD(setEnableSpeakerphone:(BOOL)enableSpeaker){
  143. [self.rtcEngine setEnableSpeakerphone: enableSpeaker];
  144. }
  145. //将自己静音
  146. RCT_EXPORT_METHOD(muteLocalAudioStream:(BOOL)mute){
  147. [self.rtcEngine muteLocalAudioStream:mute];
  148. }
  149. //静音所有远端 音频
  150. RCT_EXPORT_METHOD(muteAllRemoteAudioStreams:(BOOL)mute){
  151. [self.rtcEngine muteAllRemoteAudioStreams:mute];
  152. }
  153. //静音指定用户 音频
  154. RCT_EXPORT_METHOD(muteRemoteAudioStream:(NSUInteger)uid muted:(BOOL)mute){
  155. [self.rtcEngine muteRemoteAudioStream:uid mute:mute];
  156. }
  157. //暂停发送本地 视频流
  158. RCT_EXPORT_METHOD(muteLocalVideoStream:(BOOL)muted){
  159. [self.rtcEngine muteLocalVideoStream:muted];
  160. }
  161. //禁用本地视频功能
  162. RCT_EXPORT_METHOD(enableLocalVideo:(BOOL)enabled){
  163. [self.rtcEngine enableLocalVideo:enabled];
  164. }
  165. //暂停所有远端视频流
  166. RCT_EXPORT_METHOD(muteAllRemoteVideoStreams:(BOOL)muted){
  167. [self.rtcEngine muteAllRemoteVideoStreams:muted];
  168. }
  169. //暂停指定远端视频流
  170. RCT_EXPORT_METHOD(muteRemoteVideoStream:(NSUInteger)uid mute:(BOOL)mute){
  171. [self.rtcEngine muteRemoteVideoStream:uid mute:mute];
  172. }
  173. //启动服务端录制服务
  174. RCT_EXPORT_METHOD(startRecordingService:(NSString*)recordingKey){
  175. [self.rtcEngine startRecordingService:recordingKey];
  176. }
  177. //停止服务端录制服务
  178. RCT_EXPORT_METHOD(stopRecordingService:(NSString*)recordingKey){
  179. [self.rtcEngine stopRecordingService:recordingKey];
  180. }
  181. //获取版本号
  182. RCT_EXPORT_METHOD(getSdkVersion:(RCTResponseSenderBlock)callback){
  183. callback(@[[AgoraRtcEngineKit getSdkVersion]]);
  184. }
  185. /*
  186. 该回调方法表示SDK运行时出现了(网络或媒体相关的)错误。通常情况下,SDK上报的错误意味着SDK无法自动恢复,需要应用程序干预或提示用户。
  187. 比如启动通话失败时,SDK会上报AgoraRtc_Error_StartCall(1002)错误。
  188. 应用程序可以提示用户启动通话失败,并调用leaveChannel退出频道。
  189. */
  190. - (void)rtcEngine:(AgoraRtcEngineKit *)engine didOccurError:(AgoraRtcErrorCode)errorCode{
  191. NSMutableDictionary *params = @{}.mutableCopy;
  192. params[@"type"] = @"onError";
  193. params[@"err"] = [NSNumber numberWithInteger:errorCode];;
  194. [self sendEvent:params];
  195. }
  196. /*
  197. 警告
  198. */
  199. - (void)rtcEngine:(AgoraRtcEngineKit *)engine didOccurWarning:(AgoraRtcWarningCode)warningCode {
  200. NSMutableDictionary *params = @{}.mutableCopy;
  201. params[@"type"] = @"onWarning";
  202. params[@"err"] = [NSNumber numberWithInteger:warningCode];;
  203. [self sendEvent:params];
  204. }
  205. /*
  206. 客户端成功加入了指定的频道
  207. */
  208. - (void)rtcEngine:(AgoraRtcEngineKit *)engine didJoinChannel:(NSString*)channel withUid:(NSUInteger)uid elapsed:(NSInteger) elapsed {
  209. NSMutableDictionary *params = @{}.mutableCopy;
  210. params[@"type"] = @"onJoinChannelSuccess";
  211. params[@"uid"] = [NSNumber numberWithInteger:uid];
  212. params[@"channel"] = channel;
  213. [self sendEvent:params];
  214. }
  215. /*
  216. 远端首帧视频接收解码回调
  217. */
  218. - (void)rtcEngine:(AgoraRtcEngineKit *)engine firstRemoteVideoDecodedOfUid:(NSUInteger)uid size:(CGSize)size elapsed:(NSInteger)elapsed {
  219. NSMutableDictionary *params = @{}.mutableCopy;
  220. params[@"type"] = @"onFirstRemoteVideoDecoded";
  221. params[@"uid"] = [NSNumber numberWithInteger:uid];
  222. [self sendEvent:params];
  223. }
  224. /*
  225. 用户加入回调
  226. */
  227. - (void)rtcEngine:(AgoraRtcEngineKit *)engine didJoinedOfUid:(NSUInteger)uid elapsed:(NSInteger)elapsed {
  228. NSMutableDictionary *params = @{}.mutableCopy;
  229. params[@"type"] = @"onUserJoined";
  230. params[@"uid"] = [NSNumber numberWithInteger:uid];
  231. [self sendEvent:params];
  232. }
  233. /*
  234. 用户离线回调
  235. */
  236. - (void)rtcEngine:(AgoraRtcEngineKit *)engine didOfflineOfUid:(NSUInteger)uid reason:(AgoraRtcUserOfflineReason)reason {
  237. NSMutableDictionary *params = @{}.mutableCopy;
  238. params[@"type"] = @"onUserOffline";
  239. params[@"uid"] = [NSNumber numberWithInteger:uid];
  240. [self sendEvent:params];
  241. }
  242. /*
  243. 音量提示回调
  244. 需要开启enableAudioVolumeIndication
  245. */
  246. - (void)rtcEngine:(AgoraRtcEngineKit *)engine reportAudioVolumeIndicationOfSpeakers:(NSArray*)speakers totalVolume:(NSInteger)totalVolume {
  247. NSMutableDictionary *params = @{}.mutableCopy;
  248. params[@"type"] = @"onAudioVolumeIndication";
  249. NSMutableArray *arr = [NSMutableArray array];
  250. for (AgoraRtcAudioVolumeInfo *obj in speakers) {
  251. [arr addObject:@{@"uid":[NSNumber numberWithInteger:obj.uid], @"volume":[NSNumber numberWithInteger:obj.volume]}];
  252. }
  253. params[@"speakers"] = arr;
  254. params[@"totalVolume"] = [NSNumber numberWithInteger:totalVolume];
  255. [self sendEvent:params];
  256. }
  257. - (void)sendEvent:(NSDictionary *)params {
  258. [_bridge.eventDispatcher sendDeviceEventWithName:@"agoraEvent" body:params];
  259. }
  260. - (dispatch_queue_t)methodQueue {
  261. return dispatch_get_main_queue();
  262. }
  263. //RCT_EXPORT_METHOD(getViewWithTag:(nonnull NSNumber *)reactTag) {
  264. //
  265. // UIView *view = [self.bridge.uiManager viewForReactTag:reactTag];
  266. // NSLog(@"%@",view);
  267. //
  268. //}
  269. @end