Browse Source

iOS完善

邓博 7 years ago
parent
commit
8223e175e6

+ 28
- 0
RTCEngine.js View File

1
+import {
2
+    NativeModules,
3
+    findNodeHandle,
4
+    NativeAppEventEmitter
5
+} from 'react-native';
6
+
7
+const { Agora } = NativeModules
8
+
9
+export default {
10
+    ...Agora,
11
+    init(options = {}) {
12
+        this.listener && this.listener.remove();
13
+        Agora.init(options);
14
+    },
15
+    joinChannel(channelName = '001'){
16
+        Agora.joinChannel(channelName)
17
+    },
18
+    eventEmitter(fnConf) {
19
+        //there are no `removeListener` for NativeAppEventEmitter & DeviceEventEmitter
20
+        this.listener && this.listener.remove();
21
+        this.listener = NativeAppEventEmitter.addListener('agoraEvent', event => {
22
+            fnConf[event['type']] && fnConf[event['type']](event);
23
+        });
24
+    },
25
+    removeEmitter() {
26
+        this.listener && this.listener.remove();
27
+    }
28
+};

BIN
android/libs/agora-rtc-sdk.jar View File


+ 18
- 3
android/src/main/java/com/syan/agora/AgoraModule.java View File

128
          */
128
          */
129
         @Override
129
         @Override
130
         public void onLeaveChannel(RtcStats stats) {
130
         public void onLeaveChannel(RtcStats stats) {
131
-
131
+            runOnUiThread(new Runnable() {
132
+                @Override
133
+                public void run() {
134
+                    WritableMap map = Arguments.createMap();
135
+                    map.putString("type", "onLeaveChannel");
136
+                    commonEvent(map);
137
+                }
138
+            });
132
         }
139
         }
133
 
140
 
134
         /**
141
         /**
135
          * 用户uid离线时的回调
142
          * 用户uid离线时的回调
136
          */
143
          */
137
         @Override
144
         @Override
138
-        public void onUserOffline(int uid, int reason) {
139
-
145
+        public void onUserOffline(final int uid, int reason) {
146
+            runOnUiThread(new Runnable() {
147
+                @Override
148
+                public void run() {
149
+                    WritableMap map = Arguments.createMap();
150
+                    map.putString("type", "onUserOffline");
151
+                    map.putInt("uid", uid);
152
+                    commonEvent(map);
153
+                }
154
+            });
140
         }
155
         }
141
     };
156
     };
142
 
157
 

BIN
android/src/main/jniLibs/arm64-v8a/libHDACEngine.so View File


BIN
android/src/main/jniLibs/arm64-v8a/libagora-rtc-sdk-jni.so View File


BIN
android/src/main/jniLibs/armeabi-v7a/libHDACEngine.so View File


BIN
android/src/main/jniLibs/armeabi-v7a/libagora-rtc-sdk-jni.so View File


+ 68
- 22
android/src/main/jniLibs/include/IAgoraRtcEngine.h View File

123
     WARN_ADM_RECORD_AUDIO_SILENCE = 1019,
123
     WARN_ADM_RECORD_AUDIO_SILENCE = 1019,
124
     WARN_ADM_PLAYOUT_MALFUNCTION = 1020,
124
     WARN_ADM_PLAYOUT_MALFUNCTION = 1020,
125
     WARN_ADM_RECORD_MALFUNCTION = 1021,
125
     WARN_ADM_RECORD_MALFUNCTION = 1021,
126
+    WARN_ADM_RECORD_AUDIO_LOWLEVEL = 1031,
126
     WARN_APM_HOWLING = 1051,
127
     WARN_APM_HOWLING = 1051,
127
 
128
 
128
     // sdk: 100~1000
129
     // sdk: 100~1000
213
 
214
 
214
 enum MAX_DEVICE_ID_LENGTH_TYPE
215
 enum MAX_DEVICE_ID_LENGTH_TYPE
215
 {
216
 {
216
-    MAX_DEVICE_ID_LENGTH = 128
217
+    MAX_DEVICE_ID_LENGTH = 512
217
 };
218
 };
218
 
219
 
219
 enum QUALITY_REPORT_FORMAT_TYPE
220
 enum QUALITY_REPORT_FORMAT_TYPE
237
     MEDIA_ENGINE_ROLE_COMM_PEER = 23,
238
     MEDIA_ENGINE_ROLE_COMM_PEER = 23,
238
     MEDIA_ENGINE_ROLE_GAME_PEER = 24,
239
     MEDIA_ENGINE_ROLE_GAME_PEER = 24,
239
     // iOS adm sample rate changed
240
     // iOS adm sample rate changed
240
-    MEDIA_ENGINE_AUDIO_ADM_SAMPLE_RATE_CHANGE = 110
241
+    MEDIA_ENGINE_AUDIO_ADM_REQUIRE_RESTART = 110
241
 };
242
 };
242
 
243
 
243
 enum MEDIA_DEVICE_STATE_TYPE
244
 enum MEDIA_DEVICE_STATE_TYPE
434
     {}
435
     {}
435
 };
436
 };
436
 
437
 
438
+#if defined(_WIN32)
439
+
440
+enum RTMP_STREAM_LIFE_CYCLE_TYPE
441
+{
442
+	RTMP_STREAM_LIFE_CYCLE_BIND2CHANNEL = 1,
443
+	RTMP_STREAM_LIFE_CYCLE_BIND2OWNER = 2,
444
+};
445
+
446
+struct PublisherConfiguration {
447
+	int width;
448
+	int height;
449
+	int framerate;
450
+	int bitrate;
451
+	int defaultLayout;
452
+	int lifecycle;
453
+	bool owner;
454
+	const char* publishUrl;
455
+	const char* rawStreamUrl;
456
+	const char* extraInfo;
457
+
458
+	PublisherConfiguration()
459
+		: width(640)
460
+		, height(360)
461
+		, framerate(15)
462
+		, bitrate(500)
463
+		, defaultLayout(1)
464
+		, lifecycle(RTMP_STREAM_LIFE_CYCLE_BIND2CHANNEL)
465
+		, owner(true)
466
+		, publishUrl(NULL)
467
+		, rawStreamUrl(NULL)
468
+		, extraInfo(NULL)
469
+	{}
470
+
471
+};
472
+#endif
437
 #if !defined(__ANDROID__)
473
 #if !defined(__ANDROID__)
438
 struct VideoCanvas
474
 struct VideoCanvas
439
 {
475
 {
570
     * @param [in] uid
606
     * @param [in] uid
571
     *        the uid of the peer
607
     *        the uid of the peer
572
     * @param [in] quality
608
     * @param [in] quality
573
-    *        the quality of the user 0~5 the higher the better
609
+    *        the quality of the user, see QUALITY_TYPE for value definition
574
     * @param [in] delay
610
     * @param [in] delay
575
     *        the average time of the audio packages delayed
611
     *        the average time of the audio packages delayed
576
     * @param [in] lost
612
     * @param [in] lost
900
     */
936
     */
901
     virtual void onRequestChannelKey() {
937
     virtual void onRequestChannelKey() {
902
     }
938
     }
939
+
940
+    /**
941
+    * when the first local audio frame generated, the function will be called
942
+    * @param [in] elapsed
943
+    *        the time elapsed from remote user called joinChannel in ms
944
+    */
945
+    virtual void onFirstLocalAudioFrame(int elapsed) {
946
+        (void)elapsed;
947
+    }
948
+
949
+    /**
950
+    * when the first remote audio frame arrived, the function will be called
951
+    * @param [in] uid
952
+    *        the UID of the remote user
953
+    * @param [in] elapsed
954
+    *        the time elapsed from remote user called joinChannel in ms
955
+    */
956
+    virtual void onFirstRemoteAudioFrame(uid_t uid, int elapsed) {
957
+        (void)uid;
958
+        (void)elapsed;
959
+    }
960
+
903
 };
961
 };
904
 
962
 
905
 /**
963
 /**
1339
 
1397
 
1340
     virtual int setVideoCompositingLayout(const VideoCompositingLayout& sei) = 0;
1398
     virtual int setVideoCompositingLayout(const VideoCompositingLayout& sei) = 0;
1341
     virtual int clearVideoCompositingLayout() = 0;
1399
     virtual int clearVideoCompositingLayout() = 0;
1400
+
1401
+#if defined(_WIN32)
1402
+	virtual int configPublisher(const PublisherConfiguration& config) = 0;
1403
+#endif
1342
 };
1404
 };
1343
 
1405
 
1344
 
1406
 
1616
         return setObject("rtc.video.set_remote_video_stream", "{\"uid\":%u,\"stream\":%d}", uid, streamType);
1678
         return setObject("rtc.video.set_remote_video_stream", "{\"uid\":%u,\"stream\":%d}", uid, streamType);
1617
     }
1679
     }
1618
 
1680
 
1619
-
1620
-    /**
1621
-     * play the video stream from network
1622
-     * @param [in] uri the link of video source
1623
-     * @return return 0 if success or an error code
1624
-     */
1625
-    int startPlayingStream(const char* uri) {
1626
-        return m_parameter ? m_parameter->setString("rtc.api.video.start_play_stream", uri) : -ERR_NOT_INITIALIZED;
1627
-    }
1628
-
1629
-    /**
1630
-     *  stop playing the video stream from network
1631
-     *
1632
-     * @return return 0 if success or an error code
1633
-     */
1634
-    int stopPlayingStream() {
1635
-        return m_parameter ? m_parameter->setBool("rtc.api.video.stop_play_stream", true) : -ERR_NOT_INITIALIZED;
1636
-    }
1637
-
1638
     /**
1681
     /**
1639
     * set play sound volume
1682
     * set play sound volume
1640
     * @param [in] volume
1683
     * @param [in] volume
1752
             r = pos;
1795
             r = pos;
1753
         return r;
1796
         return r;
1754
     }
1797
     }
1798
+    int setAudioMixingPosition(int pos /*in ms*/) {
1799
+        return m_parameter ? m_parameter->setInt("che.audio.mixing.file.position", pos) : -ERR_NOT_INITIALIZED;
1800
+    }
1755
 #if defined(__APPLE__)
1801
 #if defined(__APPLE__)
1756
 	/**
1802
 	/**
1757
 	* start screen capture
1803
 	* start screen capture

BIN
android/src/main/jniLibs/x86/libHDACEngine.so View File


BIN
android/src/main/jniLibs/x86/libagora-rtc-sdk-jni.so View File


+ 4
- 36
index.js View File

1
-import {
2
-    NativeModules,
3
-    findNodeHandle,
4
-    NativeAppEventEmitter
5
-} from 'react-native';
6
 
1
 
7
-const { Agora } = NativeModules
2
+import _AgoraView from './AgoraView'
3
+import _RTCEngine from './RTCEngine'
8
 
4
 
9
-export default {
10
-
11
-    init(options = {}) {
12
-        this.listener && this.listener.remove();
13
-        Agora.init(options);
14
-    },
15
-    joinChannel(channelName = '001'){
16
-        Agora.joinChannel(channelName)
17
-    },
18
-    eventEmitter(fnConf) {
19
-        // const {
20
-        //     onFirstRemoteVideoDecoded = () => {},
21
-        //     onJoinChannelSuccess = () => {},
22
-        //     onUserJoined = () => {},
23
-        //     onError = () => {},
24
-        //     onWarning = () => {}
25
-        // } = options;
26
-
27
-        // let fnConf = {...options};
28
-        //there are no `removeListener` for NativeAppEventEmitter & DeviceEventEmitter
29
-        this.listener && this.listener.remove();
30
-        this.listener = NativeAppEventEmitter.addListener('agoraEvent', event => {
31
-            fnConf[event['type']] && fnConf[event['type']](event);
32
-        });
33
-    },
34
-    removeEmitter() {
35
-        this.listener && this.listener.remove();
36
-    }
37
-
38
-};
5
+export const AgoraView = _AgoraView;
6
+export const RTCEngine = _RTCEngine;

+ 17
- 0
ios/RCTAgora/AgoraConst.h View File

1
+//
2
+//  MyAgoraRtcEngineKit.h
3
+//  RCTAgora
4
+//
5
+//  Created by 邓博 on 2017/6/30.
6
+//  Copyright © 2017年 Syan. All rights reserved.
7
+//
8
+
9
+#import <AgoraRtcEngineKit/AgoraRtcEngineKit.h>
10
+
11
+@interface AgoraConst : NSObject
12
+
13
+@property (nonatomic, copy) NSString *appid;
14
+
15
++ (instancetype)share;
16
+
17
+@end

+ 36
- 0
ios/RCTAgora/AgoraConst.m View File

1
+//
2
+//  MyAgoraRtcEngineKit.m
3
+//  RCTAgora
4
+//
5
+//  Created by 邓博 on 2017/6/30.
6
+//  Copyright © 2017年 Syan. All rights reserved.
7
+//
8
+
9
+#import "AgoraConst.h"
10
+
11
+@implementation AgoraConst
12
+
13
+static AgoraConst *_person;
14
++ (instancetype)allocWithZone:(struct _NSZone *)zone{
15
+    static dispatch_once_t predicate;
16
+    dispatch_once(&predicate, ^{
17
+        _person = [super allocWithZone:zone];
18
+    });
19
+    return _person;
20
+}
21
+
22
++ (instancetype)share {
23
+    static dispatch_once_t onceToken;
24
+    dispatch_once(&onceToken, ^{
25
+        _person = [[self alloc]init];
26
+    });
27
+    return _person;
28
+}
29
+
30
+- (id)copyWithZone:(NSZone *)zone {
31
+    return _person;
32
+}
33
+
34
+
35
+
36
+@end

+ 59
- 38
ios/RCTAgora/RCTAgora.m View File

11
 #import <React/RCTBridge.h>
11
 #import <React/RCTBridge.h>
12
 #import <React/RCTUIManager.h>
12
 #import <React/RCTUIManager.h>
13
 #import <React/RCTView.h>
13
 #import <React/RCTView.h>
14
+#import "AgoraConst.h"
14
 
15
 
15
 @interface RCTAgora ()
16
 @interface RCTAgora ()
16
 @property (strong, nonatomic) AgoraRtcEngineKit *rtcEngine;
17
 @property (strong, nonatomic) AgoraRtcEngineKit *rtcEngine;
45
  *  @param reactTag        绑定view的tag
46
  *  @param reactTag        绑定view的tag
46
  *  @return 0 when executed successfully. return negative value if failed.
47
  *  @return 0 when executed successfully. return negative value if failed.
47
  */
48
  */
48
-RCT_EXPORT_METHOD(loadAgoraKit:(NSDictionary *)options callback:(RCTResponseSenderBlock)callback) {
49
+RCT_EXPORT_METHOD(init:(NSDictionary *)options) {
50
+    
51
+    [AgoraConst share].appid = options[@"appid"];
49
     
52
     
50
     self.rtcEngine = [AgoraRtcEngineKit sharedEngineWithAppId:options[@"appid"] delegate:self];
53
     self.rtcEngine = [AgoraRtcEngineKit sharedEngineWithAppId:options[@"appid"] delegate:self];
51
     
54
     
60
     //开启预览
63
     //开启预览
61
     [self.rtcEngine startPreview];
64
     [self.rtcEngine startPreview];
62
     
65
     
63
-    [self.rtcEngine joinChannelByKey:nil channelName:options[@"channelName"] info:options[@"info"] uid:0 joinSuccess:^(NSString *channel, NSUInteger uid, NSInteger elapsed) {
64
-        
65
-        NSMutableDictionary *params = [NSMutableDictionary dictionary];
66
-        
67
-        params[@"channel"] = channel;
68
-        params[@"uid"] = [NSNumber numberWithInteger:uid];
69
-        params[@"elapsed"] = [NSNumber numberWithInteger:elapsed];
70
-        callback(@[params]);
71
-        
72
-        //绑定本地视图
73
-        AgoraRtcVideoCanvas *canvas = [[AgoraRtcVideoCanvas alloc] init];
74
-        canvas.uid = uid;
75
-        canvas.view = [self.bridge.uiManager viewForReactTag:options[@"reactTag"]];
76
-        canvas.renderMode = AgoraRtc_Render_Hidden;
77
-        [self.rtcEngine setupLocalVideo:canvas];
78
-        
79
-    }];
80
-    
81
     //Agora Native SDK 与 Agora Web SDK 间的互通
66
     //Agora Native SDK 与 Agora Web SDK 间的互通
82
     [self.rtcEngine enableWebSdkInteroperability:YES];
67
     [self.rtcEngine enableWebSdkInteroperability:YES];
83
     
68
     
84
 }
69
 }
85
 
70
 
71
+//加入房间
72
+RCT_EXPORT_METHOD(joinChannel:(NSString *)channelName) {
73
+    [self.rtcEngine joinChannelByKey:nil channelName:channelName info:nil uid:0 joinSuccess:NULL];
74
+}
86
 
75
 
87
 //离开频道
76
 //离开频道
88
 RCT_EXPORT_METHOD(leaveChannel){
77
 RCT_EXPORT_METHOD(leaveChannel){
89
-    [AgoraRtcEngineKit destroy];
90
     [self.rtcEngine leaveChannel:^(AgoraRtcStats *stat) {
78
     [self.rtcEngine leaveChannel:^(AgoraRtcStats *stat) {
79
+        NSMutableDictionary *params = @{}.mutableCopy;
80
+        params[@"type"] = @"onLeaveChannel";
91
         
81
         
82
+        [self sendEvent:params];
92
     }];
83
     }];
93
 }
84
 }
94
 
85
 
175
     [self.rtcEngine stopRecordingService:recordingKey];
166
     [self.rtcEngine stopRecordingService:recordingKey];
176
 }
167
 }
177
 
168
 
169
+//获取版本号
170
+RCT_EXPORT_METHOD(getSdkVersion:(RCTResponseSenderBlock)callback){
171
+    callback(@[[AgoraRtcEngineKit getSdkVersion]]);
172
+}
173
+
174
+
178
 /*
175
 /*
179
  该回调方法表示SDK运行时出现了(网络或媒体相关的)错误。通常情况下,SDK上报的错误意味着SDK无法自动恢复,需要应用程序干预或提示用户。
176
  该回调方法表示SDK运行时出现了(网络或媒体相关的)错误。通常情况下,SDK上报的错误意味着SDK无法自动恢复,需要应用程序干预或提示用户。
180
  比如启动通话失败时,SDK会上报AgoraRtc_Error_StartCall(1002)错误。
177
  比如启动通话失败时,SDK会上报AgoraRtc_Error_StartCall(1002)错误。
181
  应用程序可以提示用户启动通话失败,并调用leaveChannel退出频道。
178
  应用程序可以提示用户启动通话失败,并调用leaveChannel退出频道。
182
  */
179
  */
183
 - (void)rtcEngine:(AgoraRtcEngineKit *)engine didOccurError:(AgoraRtcErrorCode)errorCode{
180
 - (void)rtcEngine:(AgoraRtcEngineKit *)engine didOccurError:(AgoraRtcErrorCode)errorCode{
181
+    NSMutableDictionary *params = @{}.mutableCopy;
182
+    params[@"type"] = @"onError";
183
+    params[@"err"] = [NSNumber numberWithInteger:errorCode];;
184
+    
185
+    [self sendEvent:params];
186
+}
187
+
188
+/*
189
+ 警告
190
+ */
191
+- (void)rtcEngine:(AgoraRtcEngineKit *)engine didOccurWarning:(AgoraRtcWarningCode)warningCode {
192
+    NSMutableDictionary *params = @{}.mutableCopy;
193
+    params[@"type"] = @"onWarning";
194
+    params[@"err"] = [NSNumber numberWithInteger:warningCode];;
184
     
195
     
196
+    [self sendEvent:params];
185
 }
197
 }
186
 
198
 
199
+
187
 /*
200
 /*
188
  客户端成功加入了指定的频道
201
  客户端成功加入了指定的频道
189
  */
202
  */
190
 - (void)rtcEngine:(AgoraRtcEngineKit *)engine didJoinChannel:(NSString*)channel withUid:(NSUInteger)uid elapsed:(NSInteger) elapsed {
203
 - (void)rtcEngine:(AgoraRtcEngineKit *)engine didJoinChannel:(NSString*)channel withUid:(NSUInteger)uid elapsed:(NSInteger) elapsed {
204
+
205
+    NSMutableDictionary *params = @{}.mutableCopy;
206
+    params[@"type"] = @"onJoinChannelSuccess";
207
+    params[@"uid"] = [NSNumber numberWithInteger:uid];
208
+    params[@"channel"] = channel;
191
     
209
     
210
+    [self sendEvent:params];
192
 }
211
 }
193
 
212
 
194
 /*
213
 /*
196
  */
215
  */
197
 - (void)rtcEngine:(AgoraRtcEngineKit *)engine firstRemoteVideoDecodedOfUid:(NSUInteger)uid size:(CGSize)size elapsed:(NSInteger)elapsed {
216
 - (void)rtcEngine:(AgoraRtcEngineKit *)engine firstRemoteVideoDecodedOfUid:(NSUInteger)uid size:(CGSize)size elapsed:(NSInteger)elapsed {
198
     
217
     
199
-    NSMutableDictionary *params = [NSMutableDictionary dictionary];
200
-    
218
+    NSMutableDictionary *params = @{}.mutableCopy;
219
+    params[@"type"] = @"onFirstRemoteVideoDecoded";
201
     params[@"uid"] = [NSNumber numberWithInteger:uid];
220
     params[@"uid"] = [NSNumber numberWithInteger:uid];
202
-    params[@"size"] = @{@"width": [NSString stringWithFormat:@"%f", size.width], @"height": [NSString stringWithFormat:@"%f", size.height]};
203
-    params[@"elapsed"] = [NSNumber numberWithInteger:elapsed];
204
     
221
     
205
-    [_bridge.eventDispatcher sendDeviceEventWithName:@"firstRemoteVideoDecodedOfUid" body:params];
222
+    [self sendEvent:params];
206
 
223
 
207
 }
224
 }
208
 
225
 
210
  用户加入回调
227
  用户加入回调
211
  */
228
  */
212
 - (void)rtcEngine:(AgoraRtcEngineKit *)engine didJoinedOfUid:(NSUInteger)uid elapsed:(NSInteger)elapsed {
229
 - (void)rtcEngine:(AgoraRtcEngineKit *)engine didJoinedOfUid:(NSUInteger)uid elapsed:(NSInteger)elapsed {
213
- 
214
-    [_bridge.eventDispatcher sendDeviceEventWithName:@"didJoinedOfUid" body:[NSNumber numberWithInteger:uid]];
230
+    NSMutableDictionary *params = @{}.mutableCopy;
231
+    params[@"type"] = @"onUserJoined";
232
+    params[@"uid"] = [NSNumber numberWithInteger:uid];
233
+    
234
+    [self sendEvent:params];
215
 }
235
 }
216
 
236
 
217
 /*
237
 /*
218
  用户离线回调
238
  用户离线回调
219
  */
239
  */
220
 - (void)rtcEngine:(AgoraRtcEngineKit *)engine didOfflineOfUid:(NSUInteger)uid reason:(AgoraRtcUserOfflineReason)reason {
240
 - (void)rtcEngine:(AgoraRtcEngineKit *)engine didOfflineOfUid:(NSUInteger)uid reason:(AgoraRtcUserOfflineReason)reason {
241
+    NSMutableDictionary *params = @{}.mutableCopy;
242
+    params[@"type"] = @"onUserOffline";
243
+    params[@"uid"] = [NSNumber numberWithInteger:uid];
221
     
244
     
245
+    [self sendEvent:params];
222
 }
246
 }
223
 
247
 
224
-/*
225
- 报告本地用户的网络质量,该回调方法每两秒触发一次
226
- */
227
-- (void)rtcEngine:(AgoraRtcEngineKit *)engine lastmileQuality:(AgoraRtcQuality)quality {
228
-    
248
+- (void)sendEvent:(NSDictionary *)params {
249
+    [_bridge.eventDispatcher sendDeviceEventWithName:@"agoraEvent" body:params];
229
 }
250
 }
230
 
251
 
231
 - (dispatch_queue_t)methodQueue {
252
 - (dispatch_queue_t)methodQueue {
232
     return dispatch_get_main_queue();
253
     return dispatch_get_main_queue();
233
 }
254
 }
234
 
255
 
235
-RCT_EXPORT_METHOD(getViewWithTag:(nonnull NSNumber *)reactTag) {
236
-    
237
-    UIView *view = [self.bridge.uiManager viewForReactTag:reactTag];
238
-    NSLog(@"%@",view);
239
-    
240
-}
256
+//RCT_EXPORT_METHOD(getViewWithTag:(nonnull NSNumber *)reactTag) {
257
+//    
258
+//    UIView *view = [self.bridge.uiManager viewForReactTag:reactTag];
259
+//    NSLog(@"%@",view);
260
+//    
261
+//}
241
 
262
 
242
 @end
263
 @end
243
 
264
 

+ 19
- 0
ios/RCTAgora/RCTAgoraVideoView.h View File

1
+//
2
+//  RCTAgoraVideoView.h
3
+//  RCTAgora
4
+//
5
+//  Created by 邓博 on 2017/6/30.
6
+//  Copyright © 2017年 Syan. All rights reserved.
7
+//
8
+
9
+#import <UIKit/UIKit.h>
10
+#import "AgoraConst.h"
11
+
12
+@interface RCTAgoraVideoView : UIView
13
+
14
+@property (strong, nonatomic) AgoraRtcEngineKit *rtcEngine;
15
+
16
+@property (nonatomic) NSInteger localUid;
17
+@property (nonatomic) NSInteger remoteUid;
18
+
19
+@end

+ 42
- 0
ios/RCTAgora/RCTAgoraVideoView.m View File

1
+//
2
+//  RCTAgoraVideoView.m
3
+//  RCTAgora
4
+//
5
+//  Created by 邓博 on 2017/6/30.
6
+//  Copyright © 2017年 Syan. All rights reserved.
7
+//
8
+
9
+#import "RCTAgoraVideoView.h"
10
+
11
+@implementation RCTAgoraVideoView
12
+
13
+- (instancetype)init{
14
+    
15
+    if (self == [super init]) {
16
+        _rtcEngine =  [AgoraRtcEngineKit sharedEngineWithAppId:[AgoraConst share].appid delegate:nil];
17
+    }
18
+    
19
+    return self;
20
+}
21
+
22
+- (void)setLocalUid:(NSInteger)localUid {
23
+    if (localUid == 0) {
24
+        AgoraRtcVideoCanvas *canvas = [[AgoraRtcVideoCanvas alloc] init];
25
+        canvas.uid = localUid;
26
+        canvas.view = self;
27
+        canvas.renderMode = AgoraRtc_Render_Hidden;
28
+        [_rtcEngine setupLocalVideo:canvas];
29
+    }
30
+}
31
+
32
+-(void)setRemoteUid:(NSInteger)remoteUid {
33
+    if (remoteUid > 0) {
34
+        AgoraRtcVideoCanvas *canvas = [[AgoraRtcVideoCanvas alloc] init];
35
+        canvas.uid = remoteUid;
36
+        canvas.view = self;
37
+        canvas.renderMode = AgoraRtc_Render_Hidden;
38
+        [_rtcEngine setupRemoteVideo:canvas];
39
+    }
40
+}
41
+
42
+@end

+ 14
- 0
ios/RCTAgora/RCTAgoraViewManager.h View File

1
+//
2
+//  AgoraViewManager.h
3
+//  RCTAgora
4
+//
5
+//  Created by 邓博 on 2017/6/30.
6
+//  Copyright © 2017年 Syan. All rights reserved.
7
+//
8
+
9
+#import "RCTViewManager.h"
10
+
11
+
12
+@interface RCTAgoraViewManager : RCTViewManager
13
+
14
+@end

+ 25
- 0
ios/RCTAgora/RCTAgoraViewManager.m View File

1
+//
2
+//  AgoraViewManager.m
3
+//  RCTAgora
4
+//
5
+//  Created by 邓博 on 2017/6/30.
6
+//  Copyright © 2017年 Syan. All rights reserved.
7
+//
8
+
9
+#import "RCTAgoraViewManager.h"
10
+#import "RCTAgoraVideoView.h"
11
+
12
+@implementation RCTAgoraViewManager
13
+
14
+RCT_EXPORT_MODULE()
15
+
16
+RCT_EXPORT_VIEW_PROPERTY(localUid, NSInteger)
17
+RCT_EXPORT_VIEW_PROPERTY(remoteUid, NSInteger)
18
+
19
+- (UIView *)view {
20
+
21
+    return [RCTAgoraVideoView new];
22
+}
23
+
24
+
25
+@end

BIN
ios/RCTAgora/libs/AgoraRtcCryptoLoader.framework/AgoraRtcCryptoLoader View File


BIN
ios/RCTAgora/libs/AgoraRtcEngineKit.framework/AgoraRtcEngineKit View File


+ 52
- 10
ios/RCTAgora/libs/AgoraRtcEngineKit.framework/Headers/AgoraRtcEngineKit.h View File

208
     AgoraRtc_LogFilter_Critical = 0x0008,
208
     AgoraRtc_LogFilter_Critical = 0x0008,
209
 };
209
 };
210
 
210
 
211
+typedef NS_ENUM(NSInteger, AgoraRtmpStreamLifeCycle) {
212
+    RtmpStream_LifeCycle_Bind2Channel = 1,
213
+    RtmpStream_LifeCycle_Bind2Ownner = 2,
214
+};
211
 
215
 
212
 typedef NS_ENUM(NSUInteger, AgoraRtcRenderMode) {
216
 typedef NS_ENUM(NSUInteger, AgoraRtcRenderMode) {
213
     /**
217
     /**
317
 @property (assign, nonatomic) NSUInteger txVideoKBitrate;
321
 @property (assign, nonatomic) NSUInteger txVideoKBitrate;
318
 @property (assign, nonatomic) NSUInteger rxVideoKBitrate;
322
 @property (assign, nonatomic) NSUInteger rxVideoKBitrate;
319
 @property (assign, nonatomic) NSUInteger users;
323
 @property (assign, nonatomic) NSUInteger users;
324
+@property (assign, nonatomic) double cpuAppUsage;
325
+@property (assign, nonatomic) double cpuTotalUsage;
320
 @end
326
 @end
321
 
327
 
322
 __attribute__((visibility("default"))) @interface AgoraRtcLocalVideoStats : NSObject
328
 __attribute__((visibility("default"))) @interface AgoraRtcLocalVideoStats : NSObject
358
 @property (copy, nonatomic) NSString* appData;//app defined data
364
 @property (copy, nonatomic) NSString* appData;//app defined data
359
 @end
365
 @end
360
 
366
 
367
+__attribute__((visibility("default"))) @interface AgoraPublisherConfiguration : NSObject
368
+@property (assign, nonatomic) BOOL owner;
369
+@property (assign, nonatomic) NSInteger width;
370
+@property (assign, nonatomic) NSInteger height;
371
+@property (assign, nonatomic) NSInteger framerate;
372
+@property (assign, nonatomic) NSInteger bitrate;
373
+@property (assign, nonatomic) NSInteger defaultLayout;
374
+@property (assign, nonatomic) AgoraRtmpStreamLifeCycle lifeCycle;
375
+@property (copy, nonatomic) NSString* publishUrl;
376
+@property (copy, nonatomic) NSString* rawStreamUrl;
377
+@property (copy, nonatomic) NSString* extraInfo;
378
+-(BOOL) validate;
379
+-(NSString *) toJsonString;
380
+@end
381
+
382
+__attribute__((visibility("default"))) @interface AgoraPublisherConfigurationBuilder : NSObject
383
+- (AgoraPublisherConfigurationBuilder *) setOwner:(BOOL)isOwner;
384
+- (AgoraPublisherConfigurationBuilder *) setWidth:(NSInteger)width height:(NSInteger)height framerate:(NSInteger)framerate bitrate:(NSInteger)bitrate;
385
+- (AgoraPublisherConfigurationBuilder *) setDefaultLayout:(NSInteger)layoutStyle;
386
+- (AgoraPublisherConfigurationBuilder *) setLifeCycle:(AgoraRtmpStreamLifeCycle)lifecycle;
387
+- (AgoraPublisherConfigurationBuilder *) setPublisherUrl:(NSString*)url;
388
+- (AgoraPublisherConfigurationBuilder *) setRawStreamUrl:(NSString*)url;
389
+- (AgoraPublisherConfigurationBuilder *) setExtraInfo:(NSString *)info;
390
+- (AgoraPublisherConfiguration *) build;
391
+@end
361
 
392
 
362
 @class AgoraRtcEngineKit;
393
 @class AgoraRtcEngineKit;
363
 @protocol AgoraRtcEngineDelegate <NSObject>
394
 @protocol AgoraRtcEngineDelegate <NSObject>
674
  *  @param engine The engine kit
705
  *  @param engine The engine kit
675
  */
706
  */
676
 - (void)rtcEngineRequestChannelKey:(AgoraRtcEngineKit *)engine;
707
 - (void)rtcEngineRequestChannelKey:(AgoraRtcEngineKit *)engine;
708
+
709
+/**
710
+ *  Event of the first audio frame is sent.
711
+ *
712
+ *  @param engine  The engine kit
713
+ *  @param elapsed The elapsed time(ms) from the beginning of the session.
714
+ */
715
+- (void)rtcEngine:(AgoraRtcEngineKit *)engine firstLocalAudioFrame:(NSInteger)elapsed;
716
+
717
+/**
718
+ *  Event of the first audio frame from remote user is received.
719
+ *
720
+ *  @param engine  The engine kit
721
+ *  @param uid     The remote user id
722
+ *  @param elapsed The elapsed time(ms) from the beginning of the session.
723
+ */
724
+- (void)rtcEngine:(AgoraRtcEngineKit *)engine firstRemoteAudioFrameOfUid:(NSUInteger)uid elapsed:(NSInteger)elapsed;
725
+
677
 @end
726
 @end
678
 
727
 
679
 
728
 
978
 - (int)adjustAudioMixingVolume:(NSInteger) volume;
1027
 - (int)adjustAudioMixingVolume:(NSInteger) volume;
979
 - (int)getAudioMixingDuration;
1028
 - (int)getAudioMixingDuration;
980
 - (int)getAudioMixingCurrentPosition;
1029
 - (int)getAudioMixingCurrentPosition;
981
-
1030
+- (int)setAudioMixingPosition:(NSInteger) pos;
982
 
1031
 
983
 /**
1032
 /**
984
  *  Start screen capture
1033
  *  Start screen capture
1217
 - (int) setRemoteVideoStream: (NSUInteger) uid
1266
 - (int) setRemoteVideoStream: (NSUInteger) uid
1218
                         type: (AgoraRtcVideoStreamType) streamType;
1267
                         type: (AgoraRtcVideoStreamType) streamType;
1219
 
1268
 
1220
-/**
1221
- * play the video stream from network
1222
- *
1223
- * @param [in] uri the link of video source
1224
- *
1225
- * @return return 0 if success or an error code
1226
- */
1227
-- (int) startPlayingStream:(NSString*)uri __deprecated;
1228
-- (int) stopPlayingStream __deprecated;
1229
 
1269
 
1230
 - (int) startRecordingService:(NSString*)recordingKey;
1270
 - (int) startRecordingService:(NSString*)recordingKey;
1231
 - (int) stopRecordingService:(NSString*)recordingKey;
1271
 - (int) stopRecordingService:(NSString*)recordingKey;
1275
 
1315
 
1276
 - (int)setVideoQualityParameters:(BOOL)preferFrameRateOverImageQuality;
1316
 - (int)setVideoQualityParameters:(BOOL)preferFrameRateOverImageQuality;
1277
 
1317
 
1318
+- (int)configPublisher:(AgoraPublisherConfiguration *)config;
1319
+
1278
 - (int)setVideoCompositingLayout:(AgoraRtcVideoCompositingLayout*)layout;
1320
 - (int)setVideoCompositingLayout:(AgoraRtcVideoCompositingLayout*)layout;
1279
 
1321
 
1280
 - (int)clearVideoCompositingLayout;
1322
 - (int)clearVideoCompositingLayout;

+ 68
- 22
ios/RCTAgora/libs/AgoraRtcEngineKit.framework/Headers/IAgoraRtcEngine.h View File

123
     WARN_ADM_RECORD_AUDIO_SILENCE = 1019,
123
     WARN_ADM_RECORD_AUDIO_SILENCE = 1019,
124
     WARN_ADM_PLAYOUT_MALFUNCTION = 1020,
124
     WARN_ADM_PLAYOUT_MALFUNCTION = 1020,
125
     WARN_ADM_RECORD_MALFUNCTION = 1021,
125
     WARN_ADM_RECORD_MALFUNCTION = 1021,
126
+    WARN_ADM_RECORD_AUDIO_LOWLEVEL = 1031,
126
     WARN_APM_HOWLING = 1051,
127
     WARN_APM_HOWLING = 1051,
127
 
128
 
128
     // sdk: 100~1000
129
     // sdk: 100~1000
213
 
214
 
214
 enum MAX_DEVICE_ID_LENGTH_TYPE
215
 enum MAX_DEVICE_ID_LENGTH_TYPE
215
 {
216
 {
216
-    MAX_DEVICE_ID_LENGTH = 128
217
+    MAX_DEVICE_ID_LENGTH = 512
217
 };
218
 };
218
 
219
 
219
 enum QUALITY_REPORT_FORMAT_TYPE
220
 enum QUALITY_REPORT_FORMAT_TYPE
237
     MEDIA_ENGINE_ROLE_COMM_PEER = 23,
238
     MEDIA_ENGINE_ROLE_COMM_PEER = 23,
238
     MEDIA_ENGINE_ROLE_GAME_PEER = 24,
239
     MEDIA_ENGINE_ROLE_GAME_PEER = 24,
239
     // iOS adm sample rate changed
240
     // iOS adm sample rate changed
240
-    MEDIA_ENGINE_AUDIO_ADM_SAMPLE_RATE_CHANGE = 110
241
+    MEDIA_ENGINE_AUDIO_ADM_REQUIRE_RESTART = 110
241
 };
242
 };
242
 
243
 
243
 enum MEDIA_DEVICE_STATE_TYPE
244
 enum MEDIA_DEVICE_STATE_TYPE
434
     {}
435
     {}
435
 };
436
 };
436
 
437
 
438
+#if defined(_WIN32)
439
+
440
+enum RTMP_STREAM_LIFE_CYCLE_TYPE
441
+{
442
+	RTMP_STREAM_LIFE_CYCLE_BIND2CHANNEL = 1,
443
+	RTMP_STREAM_LIFE_CYCLE_BIND2OWNER = 2,
444
+};
445
+
446
+struct PublisherConfiguration {
447
+	int width;
448
+	int height;
449
+	int framerate;
450
+	int bitrate;
451
+	int defaultLayout;
452
+	int lifecycle;
453
+	bool owner;
454
+	const char* publishUrl;
455
+	const char* rawStreamUrl;
456
+	const char* extraInfo;
457
+
458
+	PublisherConfiguration()
459
+		: width(640)
460
+		, height(360)
461
+		, framerate(15)
462
+		, bitrate(500)
463
+		, defaultLayout(1)
464
+		, lifecycle(RTMP_STREAM_LIFE_CYCLE_BIND2CHANNEL)
465
+		, owner(true)
466
+		, publishUrl(NULL)
467
+		, rawStreamUrl(NULL)
468
+		, extraInfo(NULL)
469
+	{}
470
+
471
+};
472
+#endif
437
 #if !defined(__ANDROID__)
473
 #if !defined(__ANDROID__)
438
 struct VideoCanvas
474
 struct VideoCanvas
439
 {
475
 {
570
     * @param [in] uid
606
     * @param [in] uid
571
     *        the uid of the peer
607
     *        the uid of the peer
572
     * @param [in] quality
608
     * @param [in] quality
573
-    *        the quality of the user 0~5 the higher the better
609
+    *        the quality of the user, see QUALITY_TYPE for value definition
574
     * @param [in] delay
610
     * @param [in] delay
575
     *        the average time of the audio packages delayed
611
     *        the average time of the audio packages delayed
576
     * @param [in] lost
612
     * @param [in] lost
900
     */
936
     */
901
     virtual void onRequestChannelKey() {
937
     virtual void onRequestChannelKey() {
902
     }
938
     }
939
+
940
+    /**
941
+    * when the first local audio frame generated, the function will be called
942
+    * @param [in] elapsed
943
+    *        the time elapsed from remote user called joinChannel in ms
944
+    */
945
+    virtual void onFirstLocalAudioFrame(int elapsed) {
946
+        (void)elapsed;
947
+    }
948
+
949
+    /**
950
+    * when the first remote audio frame arrived, the function will be called
951
+    * @param [in] uid
952
+    *        the UID of the remote user
953
+    * @param [in] elapsed
954
+    *        the time elapsed from remote user called joinChannel in ms
955
+    */
956
+    virtual void onFirstRemoteAudioFrame(uid_t uid, int elapsed) {
957
+        (void)uid;
958
+        (void)elapsed;
959
+    }
960
+
903
 };
961
 };
904
 
962
 
905
 /**
963
 /**
1339
 
1397
 
1340
     virtual int setVideoCompositingLayout(const VideoCompositingLayout& sei) = 0;
1398
     virtual int setVideoCompositingLayout(const VideoCompositingLayout& sei) = 0;
1341
     virtual int clearVideoCompositingLayout() = 0;
1399
     virtual int clearVideoCompositingLayout() = 0;
1400
+
1401
+#if defined(_WIN32)
1402
+	virtual int configPublisher(const PublisherConfiguration& config) = 0;
1403
+#endif
1342
 };
1404
 };
1343
 
1405
 
1344
 
1406
 
1616
         return setObject("rtc.video.set_remote_video_stream", "{\"uid\":%u,\"stream\":%d}", uid, streamType);
1678
         return setObject("rtc.video.set_remote_video_stream", "{\"uid\":%u,\"stream\":%d}", uid, streamType);
1617
     }
1679
     }
1618
 
1680
 
1619
-
1620
-    /**
1621
-     * play the video stream from network
1622
-     * @param [in] uri the link of video source
1623
-     * @return return 0 if success or an error code
1624
-     */
1625
-    int startPlayingStream(const char* uri) {
1626
-        return m_parameter ? m_parameter->setString("rtc.api.video.start_play_stream", uri) : -ERR_NOT_INITIALIZED;
1627
-    }
1628
-
1629
-    /**
1630
-     *  stop playing the video stream from network
1631
-     *
1632
-     * @return return 0 if success or an error code
1633
-     */
1634
-    int stopPlayingStream() {
1635
-        return m_parameter ? m_parameter->setBool("rtc.api.video.stop_play_stream", true) : -ERR_NOT_INITIALIZED;
1636
-    }
1637
-
1638
     /**
1681
     /**
1639
     * set play sound volume
1682
     * set play sound volume
1640
     * @param [in] volume
1683
     * @param [in] volume
1752
             r = pos;
1795
             r = pos;
1753
         return r;
1796
         return r;
1754
     }
1797
     }
1798
+    int setAudioMixingPosition(int pos /*in ms*/) {
1799
+        return m_parameter ? m_parameter->setInt("che.audio.mixing.file.position", pos) : -ERR_NOT_INITIALIZED;
1800
+    }
1755
 #if defined(__APPLE__)
1801
 #if defined(__APPLE__)
1756
 	/**
1802
 	/**
1757
 	* start screen capture
1803
 	* start screen capture

+ 1
- 1
package.json View File

1
 {
1
 {
2
   "name": "react-native-agora",
2
   "name": "react-native-agora",
3
-  "version": "1.0.4",
3
+  "version": "1.0.5",
4
   "description": "声网Agora",
4
   "description": "声网Agora",
5
   "main": "index.js",
5
   "main": "index.js",
6
   "scripts": {
6
   "scripts": {