iOS RTCLib SDK 开发指南

    开通方式

    音视频服务开通,请参考音视频开通方式说明。

    开发环境要求

    操作系统 开发工具 开发平台
    iOS 8.0 及以上 Xcode 8.3 及以上 Mac OSX

    SDK 使用

    工程配置

    1、 手动添加 RongRTCLib.framework 以及以下库(必须)

    • GPUImage.framework

    2、 添加以下系统依赖库

    • Foundation.framework
    • AudioToolbox.framework
    • VideoToolbox.framework
    • UIKit.framework
    • GLKit.framework
    • CoreFoundation.framework
    • CFNetwork.framework
    • AVFoundation.framework
    • SystemConfiguration.framework
    • Security.framework
    • libz.tbd
    • libbz2.tbd
    • libiconv.tbd
    • libstdc++.tbd

    3、 在工程的 Target 下选择 Build Settings 后,搜索 Enable Bitcode 将此设置为 NO,搜索 Other Linker Flags 在此设置里添加 -ObjC

    4、 权限访问 info.plist,由于音视频中需要用到摄像头和麦克风,请在 info.plist 中添加以下两个 Key 值,以便 iOS 系统提示权限请求时显示出描述内容,否则可能导致运行时出错

    • NSCameraUsageDescription
    • NSMicrophoneUsageDescription

    5、 如果需要用到 GCDAsyncSocket 或 GCDAsyncUdpSocket,请勿将源码导入工程,否则会导致冲突, RongRTCLib.framework 中已经包含,直接用

    CocoaPods 导入 SDK

    1、 Cocoapods 的安装、使用,可以参考IM SDK - 下载与导入SDK文档。

    2、 使用 CocoaPods 导入融云 SDK

    在您的工程根目录下新建一个 Podfile 文件,在文件中输入以下内容。(在此以 2.9.6 版本为例,其中 “MyApp” 为自己工程名)

      target 'MyApp' do
        pod 'RongCloudRTC', '~> 2.9.6'
      end
    

    然后在终端中运行以下命令:

      pod install
    

    完成后,CocoaPods 会在您的工程根目录下生成一个 .xcworkspace 文件。您需要通过此文件打开您的工程,而不是之前的 .xcodeproj

    创建实例

    1、 在 ViewController 中导入头文件(必要)

    #import <RongRTCLib/RongRTCEngine.h>
    

    2、 后面将要用到的两个 URL,例如:

    3、 Token 字符串(必要)

    • 获取 RTCToken

      RTCToken 即用户令牌,相当于您 APP 上当前用户连接融云的身份凭证。 在您连接融云服务器之前,您需要请求您的 App Server,您的 App Server 通过 Server API 获取 RTCToken 并返回给您的客户端,客户端获取后即可进入下一步连接融云服务器。详细请参考 Server 开发指南

    • URL: 查询 Token URL

    • http方式: POST
    • Body: uid= 你的 UserID&appid= 你的 AppKey
    • Http 查询示例代码如下
    __weak typeof(self) weakSelf = self;
    NSString *postBody = [NSString stringWithFormat:@"uid=%@&appid=%@", @"你的UserID", @"你的用户AppKey"];
    
    NSURLSession *session = [NSURLSession sharedSession];
    NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:查询Token URL];
    request.HTTPMethod = @"POST";
    request.HTTPBody = [postBody dataUsingEncoding:NSUTF8StringEncoding];
    
    NSURLSessionTask *task = [session dataTaskWithRequest:request completionHandler:^(NSData * _Nullable data, NSURLResponse * _Nullable response, NSError * _Nullable error) {
    dispatch_async(dispatch_get_main_queue(), ^{
    weakSelf.keyToken = [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding]; //此处就是查询回来的Token
    weakSelf.rongRTCEngine = [[RongRTCEngine alloc] initEngine:@"你的CMP URL"]; //初始化RongRTCEngine
    [weakSelf.rongRTCEngine setDelegate:你的实现RongRTCEngineDelegate的对象]; //设置delegate
    });
    }];
    [task resume];
    

    4、 初始化 RongRTCEngine,创建实例对象:

    RongRTCEngine *rongRTCEngine = [[RongRTCEngine alloc] initEngine:@"你的CMP URL"];
    

    5、 设置 delegate,等待状态回调。

    加入会话

    1、 delegate 的 onConnectionStateChanged 回调

    - (void)rongRTCEngine:(RongRTCEngine *)engine onConnectionStateChanged:(RongRTCConnectionState)state
    

    state: 返回 RongRTC_ConnectionState_Connected 之后可以加入房间

    2、 调用 joinChannel

    - (void)joinChannel:(NSString*)channel withKeyToken:(NSString *)token withUserID:(NSString *)userID withUserName:(NSString *)userName;
    

    channel: 房间号

    token: 为通过 http 查询到你的专有 Token 字符串,不要对之前查询到的 Token 字符串做任何字符处理,原封不动的在 joinChannel 中使用

    userID: 用户 ID

    userName: 用户名

    3、 加入会话状态回调,通过此方法返回加入状态。Yes:加入成功,NO:加入失败

    - (void)rongRTCEngine:(RongRTCEngine *)engine onJoinComplete:(BOOL)success
    

    创建视图

    1、 加入成功后,可创建本地视频 View 用来显示

    - (UIView *)createLocalVideoViewFrame:(CGRect)frame withDisplayType:(RongRTCVideoViewDisplayType)type;
    

    示例如下:

    self.localVideoView = [self.rongRTCEngine createLocalVideoViewFrame:CGRectMake(0, 0, ScreenWidth, ScreenHeight) withDisplayType:RongRTC_VideoViewDisplay_CompleteView];
    

    2、 当有远端用户加入时,delegate 方法会回调,此时可获得新加入远端用户的 ID 和用户类型 type

    - (void)rongRTCEngine:(RongRTCEngine *)engine onUserJoined:(NSString *)userId userName:(NSString *)userName userType:(RongRTCUserType)type audioVideoType:(RongRTCAudioVideoType)avType screenSharingStatus:(RongRTCScreenSharingState)screenSharingStatus;
    

    3、 根据 2 中 ID 调用如下方法可创建远端用户视频 View

    - (UIView *)createRemoteVideoViewFrame:(CGRect)frame forUser:(NSString *)userId withDisplayType:(RongRTCVideoViewDisplayType)type
    

    可得到远端用户的视频 View,此时可展示本地/远端视频并进行通话。以上为加入聊天室流程。

    退出会话

    从聊天室退出时,必须调用 leaveChannel,否则再次 joinChannel 会失败

    - (void)leaveChannel;
    

    白板功能

    请求白板 URL

    /*!
    @method
    @abstract 请求白板页面HTTP URL, 自己已在聊天室中且聊天室中至少还有一个远程用户, 在请求之后会异步通过delegate中的rongRTCEngine: onWhiteBoardURL:方法返回白板页面的URL
    */
    - (void)requestWhiteBoardURL;
    
    /*!
    @method
    @abstract 请求白板页面是否存在, 在请求之后会异步通过delegate中的rongRTCEngine: onWhiteBoardExist:方法返回是否存在
    */
    - (void)requestWhiteBoardExist;
    

    白板 URL 异步返回

    /*!
    @method
    @abstract 自己已在聊天室中且聊天室中至少还有一个远程用户, - (void)requestWhiteBoardURL 请求白板页面的HTTP URL之后的回调
    @param url Web白板连接
    */
    - (void)rongRTCEngine:(RongRTCEngine *)engine onWhiteBoardURL:(NSString *)url;
    
    /*!
    @method
    @abstract 自己已在聊天室中查询该房间内是否已经创建白板, - (void)requestWhiteBoardExist 之后的回调
    @param isExist YES:存在 NO:不存在
    */
    - (void)rongRTCEngine:(RongRTCEngine *)engine onWhiteBoardExist:(BOOL)isExist;
    

    常用数据类型

    1、 宏定义说明,设置视频聊天参数时的 Key 值,参见 SetVideoParameters: 方法

    
    #define kAudioOnly      @"AudioOnly"
    #define kVideoProfile   @"VideoProfile"
    #define kAdaptVideoProfile   @"AdaptVideoProfile"
    #define kMaxBandWidth   @"MaxBandWidth"
    #define kUserType       @"UserType"
    #define kCloseCamera    @"CloseCamera"
    #define kGPUFilter      @"GPUFilter"
    

    2、 RongRTCVideoProfile,kVideoProfile 对应的 Value 值枚举选项

    /**
    *无效
    */
    RongRTC_VideoProfile_Invalid   = -1,
    /**
    *分辨率:256x144,  帧率:15
    */
    RongRTC_VideoProfile_256_144P      = 0,
    /**
    *分辨率:256x144,  帧率:24
    */
    RongRTC_VideoProfile_256_144P_1    = 1,
    /**
    *分辨率:256x144,  帧率:30
    */
    RongRTC_VideoProfile_256_144P_2    = 2,
    /**
    *分辨率:320x240,  帧率:15
    */
    RongRTC_VideoProfile_320_240P      = 10,
    /**
    *分辨率:320x240,  帧率:24
    */
    RongRTC_VideoProfile_320_240P_1    = 11,
    /**
    *分辨率:320x240,  帧率:30
    */
    RongRTC_VideoProfile_320_240P_2    = 12,
    /**
    *分辨率:480x360,  帧率:15
    */
    RongRTC_VideoProfile_480_360P      = 20,
    /**
    *分辨率:480x360,  帧率:24
    */
    RongRTC_VideoProfile_480_360P_1    = 21,
    /**
    *分辨率:480x360,  帧率:30
    */
    RongRTC_VideoProfile_480_360P_2    = 22,
    
    /**
    *分辨率:640x360,  帧率:15
    */
    RongRTC_VideoProfile_640_360P      = 30,
    /**
    *分辨率:640x360,  帧率:24
    */
    RongRTC_VideoProfile_640_360P_1    = 31,
    /**
    *分辨率:640x360,  帧率:30
    */
    RongRTC_VideoProfile_640_360P_2    = 32,
    /**
    *分辨率:640x480,  帧率:15
    */
    RongRTC_VideoProfile_640_480P      = 40,
    /**
    *分辨率:640x480,  帧率:24
    */
    RongRTC_VideoProfile_640_480P_1    = 41,
    /**
    *分辨率:640x480,  帧率:30
    */
    RongRTC_VideoProfile_640_480P_2    = 42,
    /**
    *分辨率:720x480,  帧率:15
    */
    RongRTC_VideoProfile_720_480P      = 50,
    /**
    *分辨率:720x480,  帧率:24
    */
    RongRTC_VideoProfile_720_480P_1    = 51,
    /**
    *分辨率:720x480,  帧率:30
    */
    RongRTC_VideoProfile_720_480P_2    = 52,
    /**
    *分辨率:1280x720,  帧率:15
    */
    RongRTC_VideoProfile_1280_720P      = 60,
    /**
    *分辨率:1280x720,  帧率:24
    */
    RongRTC_VideoProfile_1280_720P_1    = 61,
    /**
    *分辨率:1280x720,  帧率:30
    */
    RongRTC_VideoProfile_1280_720P_2    = 62,
    /**
    *分辨率:1920x1080,  帧率:15
    */
    RongRTC_VideoProfile_1920_1080P      = 70,
    /**
    *分辨率:1920x1080,  帧率:24
    */
    RongRTC_VideoProfile_1920_1080P_1    = 71,
    /**
    *分辨率:1920x1080,  帧率:30
    */
    RongRTC_VideoProfile_1920_1080P_2    = 72
    

    3、 RongRTCVideoViewDisplayType,设置远端/本地视频显示类型选项

    typedef NS_ENUM(NSInteger, RongRTCVideoViewDisplayType)
    {
        /**
         *在自定义frame中全屏显示视频, 可能会切掉两边超出原视频比例的视频
         */
        RongRTC_VideoViewDisplay_FullScreen,
        /**
         *在自定义frame中显示全部视频, 如果自定义CGSize与原比例不同会显示黑边
         */
        RongRTC_VideoViewDisplay_CompleteView
    };
    

    4、 RongRTCConnectionState,系统连接状态

    typedef NS_ENUM(NSInteger, RongRTCConnectionState)
    {
        /**
         *系统连接状态, 已连接
         */
        RongRTC_ConnectionState_Connected,
        /**
         *系统连接状态, 已断开
         */
        RongRTC_ConnectionState_Disconnected
    };
    

    5、 RongRTCUserType,用户类型

    typedef NS_ENUM(NSInteger, RongRTCUserType)
    {
        /**
         *正常音视频用户
         */
        RongRTC_User_Normal = 1,
        /**
         *观察者用户
         */
        RongRTC_User_Observer = 2,
        /**
         *主持人
         */
        RongRTC_User_Host = 3
    };
    

    RongRTCEngine.h 文件说明

    RongRTCEngine 类

    /*!
    @property delegate
    @abstract RongRTCEgnine delegate
    */
    @property (nonatomic, weak) id<RongRTCEngineDelegate> delegate;
    
    /*!
    @property isExecuteDelegateInMainQueue 是否在主线程中运行回调的delegate方法
    @abstract delegate方法是否在Main Queue中进行回调
    */
    @property (nonatomic, assign) BOOL isExecuteDelegateInMainQueue;
    
    /*!
    @property engineTLSCertificateData 在JoinChannel之前设置本地证书NSData,需要使用TLS加密时设置,默认为nil,不使用TLS
    */
    @property (nonatomic, strong) NSData *engineTLSCertificateData;
    
    /*!
    @property isSendLostReport 设置网络丢包率是否上报,当设置为Yes时通过 rongRTCEngine:onNetworkSentLost: 回调方法通知丢包值,取值范围0~100, 代表丢包率0%~100%
    @abstract Yes:上报 NO:不上报 默认值:NO
    */
    @property (nonatomic, assign) BOOL isSendLostReport;
    
    
    /*!
    @property isReceiveLostReport 设置网络接收丢包率是否上报,当设置为Yes时通过 rongRTCEngine:onNetworkReceiveLost: 回调方法通知丢包值,取值范围0~100, 代表丢包率0%~100%
    @abstract Yes:上报 NO:不上报 默认值:NO
    */
    @property (nonatomic, assign) BOOL isReceiveLostReport;
    
    /*!
    @method
    @abstract 初始化方法
    @param serverURL CMP的serverURL
    */
    - (instancetype)initEngine:(NSString *)serverURL;
    
    /*!
    @method
    @abstract RongRTCEngine单例, 不可用做RongRTCEngine的初始化, 仅用来初始化之后获取RongRTCEngine对象
    */
    + (RongRTCEngine *)sharedRongRTCEngine;
    
    /*!
    @method
    @abstract 返回当前SDK版本号
    */
    + (NSString *)sdkVersion;
    
    /*!
    @method
    @abstract 必须在调用joinChannel:前设置本地视频参数才能生效, 不设置则使用默认值
    @param parameters  kAudioOnly:    是否为纯音频, 默认值为NO
    kVideoProfile: 本地视频分辨率, 默认值为RongRTC_VideoProfile_640_480P
    kMaxBandWidth: 最大码率, 默认值为500
    kUserType:     用户类型, 默认值为RongRTC_User_Normal
    kCloseCamera:  是否关闭视频显示, 默认值为1,不关闭视频
    kGPUFilter:    是否打开滤镜, 默认为NO,不使用滤镜
    */
    - (void)setVideoParameters:(NSDictionary *)parameters;
    
    /*!
    @method
    @abstract 不设置则使用默认值
    @param parameters  videoMode:    视频观看模式, 默认值为RongRTC_VideoMode_Smooth
    */
    - (void)setVideoMode:(RongRTCVideoMode)videoMode;
    
    /*!
    @method
    @abstract 加入聊天室
    @param channel 不同聊天室的唯一标识
    @param token 通过HTTP的POST方式查询回来的字符串
    @param userID 用户ID
    */
    - (void)joinChannel:(NSString*)channel withKeyToken:(NSString *)token withUserID:(NSString *)userID withUserName:(NSString *)userName;
    
    /*!
    @method
    @abstract 单独发送JoinChannel消息
    @param userID 用户ID
    */
    - (void)sendJoinChannelMessage:(NSString *)userID;
    
    /*!
    @method
    @abstract 单独发送JoinChannel消息
    @param userID 用户标识唯一ID
    @param channel 不同聊天室的唯一标识
    */
    - (void)sendJoinChannelMessage:(NSString *)userID withChannel:(NSString *)channel;
    
    /*!
    @method
    @abstract 离开当前聊天室
    */
    - (void)leaveChannel;
    
    /*!
    @method
    @abstract joinChannel之后修改本地发送视频的分辨率
    @param videoProfile 视频分辨率
    */
    - (void)changeVideoSize:(RongRTCVideoProfile)videoProfile;
    
    /*!
    @method
    @abstract 请求白板页面HTTP URL, 自己已在聊天室中且聊天室中至少还有一个远程用户, 在请求之后会异步通过delegate中的rongRTCEngine: onWhiteBoardURL:方法返回白板页面的URL
    */
    - (void)requestWhiteBoardURL;
    
    /*!
    @method
    @abstract 请求白板页面是否存在, 在请求之后会异步通过delegate中的rongRTCEngine: onWhiteBoardExist:方法返回是否存在
    */
    - (void)requestWhiteBoardExist;
    
    /*!
    @method
    @abstract 根据自定义frame和视频的显示类型, 创建本地视频View
    @param frame 自定义本地视频的frame  type:本地视频显示类型
    @param type 本地视频显示类型
    */
    - (UIView *)createLocalVideoViewFrame:(CGRect)frame withDisplayType:(RongRTCVideoViewDisplayType)type;
    
    /*!
    @method
    @abstract 根据userId确定某个远端用户, 用自定义frame和视频的显示类型type, 创建远端视频View
    @param frame 自定义本地视频的frame
    @param userId 某个远端用户
    @param type 本地视频显示类型
    */
    - (UIView *)createRemoteVideoViewFrame:(CGRect)frame forUser:(NSString *)userId withDisplayType:(RongRTCVideoViewDisplayType)type;
    
    /*!
    @method
    @abstract 根据所选RongRTCVideoViewDisplayType, 重新设置本地视频, 需要变换本地视频View frame时使用
    @param frame 自定义本地视频的frame
    @param type 本地视频显示类型
    */
    - (UIView *)changeLocalVideoViewFrame:(CGRect)frame withDisplayType:(RongRTCVideoViewDisplayType)type;
    
    /*!
    @method
    @abstract 根据所选RongRTCVideoViewDisplayType, 重新设置远端视频, 需要变换远端视频View frame时使用
    @param frame 自定义远端视频的frame
    @param userId 需要修改frame的视频的用户userId
    @param type 远端视频显示类型
    */
    - (UIView *)changeRemoteVideoViewFrame:(CGRect)frame withUserID:(NSString *)userId withDisplayType:(RongRTCVideoViewDisplayType)type;
    
    #pragma mark - Meeting
    /*!
    @method
    @abstract 观察者调用, 请求发言(需要主持人应答)
    @return 0:成功 1:参数错误 2:状态错误
    */
    - (NSInteger)observerRequestBecomeNormalUser;
    
    /*!
    @method
    @abstract 任何与会人员调用, 已在房间里的用户获取邀请链接
    @return 0:成功 1:参数错误 2:状态错误
    */
    - (NSInteger)getInviteURL;
    
    /*!
    @method
    @abstract 与会正常用户调用, 请求获取主持人权限
    @return 0:成功 1:参数错误 2:状态错误
    */
    - (NSInteger)normalUserRequestHostAuthority;
    
    /*!
    @method
    @abstract 主持人调用发起, 将正常用户降级为观察者
    @param userID 用户标识唯一ID
    @return 0:成功 1:参数错误 2:状态错误
    */
    - (NSInteger)degradeNormalUserToObserver:(NSString *)userID;
    
    /*!
    @method
    @abstract 主持人调用发起, 将观察者升级为正常用户(需要被操作的观察者应答)
    @param userID 用户标识唯一ID
    @return 0:成功 1:参数错误 2:状态错误
    */
    - (NSInteger)upgradeObserverToNormalUser:(NSString *)userID;
    
    /*!
    @method
    @abstract 主持人调用, 移除与会人员
    @param userID 用户标识唯一ID
    @return 0:成功 1:参数错误 2:状态错误
    */
    - (NSInteger)removeUser:(NSString *)userID;
    
    /*!
    @method
    @abstract 主持人调用, 操作与会人员麦克风/摄像头的打开/关闭, 需要被操作人通过 - (NSInteger)answerHostControlUserDevice:(NSString *)userID withDeviceType:(RongRTC_Device_Type)dType open:(BOOL)isOpen status:(BOOL)isAccept; 给出应答
    @param userID 用户标识唯一ID
    @param type 设备类型
    @param isOpen 是否打开
    @return 0:成功 1:参数错误 2:状态错误
    */
    - (NSInteger)hostControlUserDevice:(NSString *)userID withDeviceType:(RongRTC_Device_Type)type open:(BOOL)isOpen;
    
    /*!
    @method
    @abstract 主持人邀请观察者升级成正常用户时, 观察者的应答调用
    @param userID 用户标识唯一ID
    @param isAccept 是否接受
    @return 0:成功 1:参数错误 2:状态错误
    */
    - (NSInteger)answerUpgradeObserverToNormalUser:(NSString *)userID status:(BOOL)isAccept;
    
    /*!
    @method
    @abstract 观察者向主持人申请升级成正常用户时, 主持人的应答调用
    @param userID 用户标识唯一ID
    @param isAccept 是否接受
    @return 0:成功 1:参数错误 2:状态错误
    */
    - (NSInteger)answerObserverRequestBecomeNormalUser:(NSString *)userID status:(RongRTC_Accept_Type)isAccept;
    
    /*!
    @method
    @abstract 麦克风/摄像头被主持人打开/关闭时, 被打开/关闭人的应答调用
    @param userID 用户标识唯一ID
    @param dType 设备类型
    @param isAccept 是否接受
    @return 0:成功 1:参数错误 2:状态错误
    */
    - (NSInteger)answerHostControlUserDevice:(NSString *)userID withDeviceType:(RongRTC_Device_Type)dType open:(BOOL)isOpen status:(BOOL)isAccept;
    
    /*!
    @method
    @abstract 主持人将正常用户降级为观察者时, 观察者的应答调用
    @param userID 用户标识唯一ID
    @param isAccept 是否接受
    @return 0:成功 1:参数错误 2:状态错误
    */
    - (NSInteger)answerDegradeNormalUserToObserver:(NSString *)userID status:(BOOL)isAccept;
    
    #pragma mark - UI切换操作
    /*!
    @method
    @abstract 切换前后摄像头
    */
    - (void)switchCamera;
    
    /*!
    @method
    @abstract 打开/关闭本地视频,UI操作并通过代理 rongRTCEngine:onUser:audioVideoType: 通知其他用户视频已关闭
    @param enable Yes:关闭本地视频  NO:打开本地视频
    */
    - (void)closeLocalVideo:(BOOL)enable;
    
    /*!
    @method
    @abstract  订阅小流视频
    @param
    */
    - (void)subscribeStreamForTiny:(NSArray *)tinyStreamUserIDs forOrigin:(NSString *)originStreamUserID;
    
    /*!
    @method
    @abstract 设置小流视频分辨率
    @param
    */
    - (void)setVideoSizeForTinyStream:(CGFloat)width height:(CGFloat) height;
    
    /*!
    @method
    @abstract 打开/关闭本地视频,通过信令通知服务端.
    @param avType RongRTC_User_Only_Audio:关闭本地视频,仅音频  RongRTC_User_Audio_Video:打开本地视频
    */
    - (void)modifyAudioVideoType:(RongRTCAudioVideoType)avType;
    
    /*!
    @method
    @abstract 打开/关闭本地音频/视频, 通过信令通知服务端.
    @param type 操作的音视频设备类型
    @param isOpen YES:打开 NO:关闭
    */
    - (NSInteger)controlAudioVideoDevice:(RongRTC_Device_Type)type open:(BOOL)isOpen;
    
    /*!
    @method
    @abstract 打开/关闭外放声音
    @param enable Yes:开启声音  NO:关闭声音
    */
    - (void)switchSpeaker:(BOOL)enable;
    
    /*!
    @method
    @abstract 打开/关闭麦克风
    @param enable Yes:静音,麦克风不收录声音  NO:不静音,麦克风可以收录声音
    */
    - (void)muteMicrophone:(BOOL)enable;
    
    #pragma mark - 录制
    /*!
    @method
    @abstract 开始录制
    @param filePath 录制文件保存路径
    */
    - (NSInteger)startRecording:(NSString *)filePath;
    
    /*!
    @method
    @abstract 停止录制
    */
    - (NSInteger)stopRecording;
    
    #pragma mark - 日志
    /*!
    @method
    @abstract 设置RongRTC日志文件位置, 不需要指定文件名, 只能在[RongRTCEngine alloc]之前设置才能生效
    @param path 沙盒路径
    */
    + (void)setRongRTCLogPath:(NSString *)path;
    

    RongRTCEngineDelegate 协议

    #pragma mark - 用户操作
    /*!
    @method
    @abstract 系统连接状态回调方法. 初始化成功后, 通过此方法返回RongRTC_ConnectionState_Connected. 如果出现断开连接情况还会返回RongRTC_ConnectionState_Disconnected, 重连成功后返回RongRTC_ConnectionState_Connected, 以正确反应系统连接状态. 如果连接一直不成功会不停的尝试连接直至成功.
    @param state 系统连接状态
    */
    - (void)rongRTCEngine:(RongRTCEngine *)engine onConnectionStateChanged:(RongRTCConnectionState)state;
    
    /*!
    @method
    @abstract 调用加入聊天室joinChannel:方法后, 通过此方法返回加入状态
    @param success Yes:加入成功  NO:加入失败
    */
    - (void)rongRTCEngine:(RongRTCEngine *)engine onJoinComplete:(BOOL)success;
    
    /*!
    @method
    @abstract 调用leaveChannel方法自己离开聊天室后, 通过此方法返回离开状态
    @param success Yes:离开成功  NO:离开失败
    */
    - (void)rongRTCEngine:(RongRTCEngine *)engine onLeaveComplete:(BOOL)success;
    
    /*!
    @method
    @abstract 自己已在聊天室中, 其他用户加入聊天室时, 有用户A进入
    @param userId 新加入用户ID
    @param userName 用户名
    @param type 用户类型
    @param avType 0关闭视频仅有音频 1视频和音频
    */
    - (void)rongRTCEngine:(RongRTCEngine *)engine onUserJoined:(NSString *)userId userName:(NSString *)userName  userType:(RongRTCUserType)type audioVideoType:(RongRTCAudioVideoType)avType screenSharingStatus:(RongRTCScreenSharingState)screenSharingStatus;
    
    /*!
    @method
    @abstract 自己已在聊天室中, 其他用户加入聊天室时, 用户A的视频流已添加的回调, 在此之后可调用createRemoteVideoViewFrame:forUser:withDisplayType:
    @param userId 新加入用户ID
    */
    - (void)rongRTCEngine:(RongRTCEngine *)engine OnNotifyUserVideoCreated:(NSString *)userId;
    
    /*!
    @method
    @abstract 自己已在聊天室中, 其他用户离开时, 通过userId可知是哪个用户已离开, 据此移除该用户视频
    @param userId 离开用户ID
    */
    - (void)rongRTCEngine:(RongRTCEngine *)engine onUserLeft:(NSString *)userId;
    
    /*!
    @method
    @abstract 自己已在聊天室中, 其他用户修改音视频类型后, 通过userId可知是哪个用户打开/关闭视频, 据此处理视频是否显示
    @param userId 用户ID
    @param avType 0关闭视频仅有音频 1视频和音频
    */
    - (void)rongRTCEngine:(RongRTCEngine *)engine onUser:(NSString *)userId audioVideoType:(RongRTCAudioVideoType)avType;
    
    /*!
    @method
    @abstract 自己已在聊天室中且聊天室中至少还有一个远程用户, - (void)requestWhiteBoardURL 请求白板页面的HTTP URL之后的回调
    @param url Web白板连接
    */
    - (void)rongRTCEngine:(RongRTCEngine *)engine onWhiteBoardURL:(NSString *)url;
    
    /*!
    @method
    @abstract 自己已在聊天室中查询该房间内是否已经创建白板, - (void)requestWhiteBoardExist 之后的回调
    @param isExist YES:存在 NO:不存在
    */
    - (void)rongRTCEngine:(RongRTCEngine *)engine onWhiteBoardExist:(BOOL)isExist;
    
    /*!
    @method
    @abstract 自己已在聊天室中, 其他人创建白板后收到的回调
    @param userId 创建白板的用户ID
    */
    - (void)rongRTCEngine:(RongRTCEngine *)engine onNotifyWhiteBoardCreateBy:(NSString *)userId;
    
    /*!
    @method
    @abstract 自己本地调用 controlAudioVideoDevice:open: 后, 自己收到的信令发送成功与否的回调, 以反馈信令是否发送成功
    */
    - (void)rongRTCEngine:(RongRTCEngine *)engine onControlAudioVideoDevice:(NSInteger)code;
    
    /*!
    @method
    @abstract 某与会人调用  - (NSInteger)controlAudioVideoDevice:(RongRTC_Device_Type)type open:(BOOL)isOpen  打开/关闭指定设备类型后, 其他与会人员收到的回调
    @param userId 离开用户ID
    */
    - (void)rongRTCEngine:(RongRTCEngine *)engine onNotifyControlAudioVideoDevice:(RongRTC_Device_Type)type withUserID:(NSString *)userId open:(BOOL)isOpen;
    
    #pragma mark - Meeting
    /*!
    @method
    @abstract 观察请求升级成正常用户后, 观察者收到的回调, 以反馈信令是否发送成功
    */
    - (void)rongRTCEngine:(RongRTCEngine *)engine onObserverRequestBecomeNormalUser:(NSInteger)code;
    
    /*!
    @method
    @abstract 已在房间中的用户, 调用 - (void)inviteUser 方法后的回调, 以反馈信令是否发送成功
    @param url 邀请连接
    */
    - (void)rongRTCEngine:(RongRTCEngine *)engine onGetInviteURL:(NSString *)url responseCode:(NSInteger)code;
    
    /*!
    @method
    @abstract 正常用户, 调用 - (NSInteger)normalUserRequestHostAuthority 方法后的回调, 以反馈信令是否发送成功
    */
    - (void)rongRTCEngine:(RongRTCEngine *)engine onNormalUserRequestHostAuthority:(NSInteger)code;
    
    /*!
    @method
    @abstract 某正常用户成为主持人后, 其他与会人员收到的回调
    @param userId 离开用户ID
    */
    - (void)rongRTCEngine:(RongRTCEngine *)engine onNotifyNormalUserRequestHostAuthority:(NSString *)userId;
    
    /*!
    @method
    @abstract 主持人调用 - (NSInteger)degradeNormalUserToObserver:(NSString *)userID 后, 主持人收到的信令发送成功与否的回调, 以反馈信令是否发送成功
    */
    - (void)rongRTCEngine:(RongRTCEngine *)engine onDegradeNormalUserToObserver:(NSInteger)code;
    
    /*!
    @method
    @abstract 自己已在聊天室中, 自己或其他用户被降级为观察者时, 通过userId可知是哪个用户已被降级, 据此处理该用户
    @param userId 离开用户ID
    */
    - (void)rongRTCEngine:(RongRTCEngine *)engine onNotifyDegradeNormalUserToObserver:(NSString *)userId;
    
    /*!
    @method
    @abstract 主持人调用 - (NSInteger)upgradeObserverToNormalUser:(NSString *)userID 后, 主持人收到的信令发送成功与否的回调, 以反馈信令是否发送成功
    */
    - (void)rongRTCEngine:(RongRTCEngine *)engine onUpgradeObserverToNormalUser:(NSInteger)code;
    
    /*!
    @method
    @abstract 自己是观察者且已在聊天室中, 主持人邀请自己升级成为正常用户时的回调, 在此回调中需要给出应答, 即:调用 - (NSInteger)answerHostControlUserDevice:(NSString *)userID withDeviceType:(RongRTC_Device_Type)dType status:(BOOL)isAccept
    @param userId 离开用户ID
    */
    - (void)rongRTCEngine:(RongRTCEngine *)engine onNotifyUpgradeObserverToNormalUser:(NSString *)userId;
    
    /*!
    @method
    @abstract 主持人调用 - (void)removeUser:(NSString *)userID 后, 主持人收到的信令发送成功与否的回调, 以反馈信令是否发送成功
    */
    - (void)rongRTCEngine:(RongRTCEngine *)engine onRemoveUser:(NSInteger)code;
    
    /*!
    @method
    @abstract 自己已在聊天室中, 主持人将自己移出会议室时收到此回调
    @param userId 离开用户ID
    */
    - (void)rongRTCEngine:(RongRTCEngine *)engine onNotifyRemoveUser:(NSString *)userId;
    
    /*!
    @method
    @abstract 自己已在聊天室中, 其他用户打开/关闭屏幕共享
    @param userId 打开/关闭屏幕共享的用户ID
    @param isOpen Yes:打开  NO:关闭
    */
    - (void)rongRTCEngine:(RongRTCEngine *)engine onNotifyScreenSharing:(NSString *)userId open:(BOOL)isOpen;
    
    /*!
    @method
    @abstract 观察者用户请求主持人成为正常用户后, 主持人收到的回调
    @param userId 用户ID
    @param type 授权类型
    */
    - (void)rongRTCEngine:(RongRTCEngine *)engine onNotifyObserverRequestBecomeNormalUser:(NSString *)userId authorityType:(RongRTC_Authority_Type)type;
    
    /*!
    @method
    @abstract 所有与会人员收到的, 某正常用户打开或关闭麦克风/摄像头的回调
    @param userId 用户ID
    @param hostId 主持人ID
    @param dType 操作的设备类型
    @param isOpen 是否打开
    */
    - (void)rongRTCEngine:(RongRTCEngine *)engine onNotifyHostControlUserDevice:(NSString *)userId host:(NSString *)hostId deviceType:(RongRTC_Device_Type)dType open:(BOOL)isOpen;
    
    /*!
    @method
    @abstract 主持人调用 - (NSInteger)hostControlUserDevice:(NSString *)userID withDeviceType:(RongRTC_Device_Type)dType status:(BOOL)isOpen 后收到, 将某正常用户打开或关闭指定设备的成功的回调, 以反馈信令是否发送成功
    @param userId 用户ID
    @param dType 操作的设备类型
    */
    - (void)rongRTCEngine:(RongRTCEngine *)engine onHostControlUserDevice:(NSString *)userId withDeviceType:(RongRTC_Device_Type)dType responseCode:(NSInteger)code;
    
    /*!
    @method
    @abstract 主持人邀请观察者升级成正常用户, 观察者做出接受/拒绝之后, 给主持人的回调
    @param userId 用户ID
    @param isAccept 是否接受
    */
    - (void)rongRTCEngine:(RongRTCEngine *)engine onNotifyAnswerUpgradeObserverToNormalUser:(NSString *)userId status:(BOOL)isAccept;
    
    /*!
    @method
    @abstract 观察者向主持人请求成为正常用户, 主持人做出接受/拒绝之后之后, 给观察者的回调
    @param userId 用户ID
    @param acceptType 是否接受
    */
    - (void)rongRTCEngine:(RongRTCEngine *)engine onNotifyAnswerObserverRequestBecomeNormalUser:(NSString *)userId status:(RongRTC_Accept_Type)acceptType;
    
    /*!
    @method
    @abstract 主持人打开与会某正常用户的麦克风/摄像头, 某正常用户做出接受/拒绝之后之后, 给主持人的回调
    @param userId 用户ID
    @param dType 设备类型
    @param isAccept 是否接受
    */
    - (void)rongRTCEngine:(RongRTCEngine *)engine onNotifyAnswerHostControlUserDevice:(NSString *)userId withAnswerType:(RongRTC_Answer_Type)type withDeviceType:(RongRTC_Device_Type)dType status:(BOOL)isAccept;
    /*!
    @method
    @abstract 主持人将正常用户降级为观察者, 正常用户做出接受/拒绝之后, 给除该用户以外其他与会人的回调
    @param userId 用户ID
    @param isAccept 是否接受
    */
    - (void)rongRTCEngine:(RongRTCEngine *)engine onNotifyAnswerDegradeNormalUserToObserver:(NSString *)userId status:(BOOL)isAccept;
    
    #pragma mark - AudioVideo
    /*!
    @method
    @abstract 所有设备完成准备,UI中可进行状态设置
    */
    - (void)rongRTCEngineOnAudioDeviceReady:(RongRTCEngine *)engine;
    
    /*!
    @method
    @abstract 耳机插入/拨出时, 回调此方法
    @param enable Yes:扬声器打开  NO:扬声器关闭
    */
    - (void)rongRTCEngine:(RongRTCEngine *)engine onOutputAudioPortSpeaker:(BOOL)enable;
    
    /*!
    @method
    @abstract 探测麦克风/相机权限后, 返回的麦克风/相机权限信息
    @param enableAudio Yes:已打开权限  NO:已关闭权限
    @param enableVideo Yes:已打开权限  NO:已关闭权限
    */
    - (void)rongRTCEngine:(RongRTCEngine *)engine onAudioAuthority:(BOOL)enableAudio onVideoAuthority:(BOOL)enableVideo;
    
    /*!
    @method
    @abstract 返回userId用户videoView及其分辨率. 当videoView分辨率发生多次变化时, 此方法会被多次调用.
    @param videoView 远端用户视频View
    @param size 远端用户的视频分辨率,例如:640*480
    @param userId 用户ID
    */
    - (void)rongRTCEngine:(RongRTCEngine *)engine onRemoteVideoView:(UIView *)videoView vidoeSize:(CGSize)size remoteUserID:(NSString*)userId;
    
    /*!
    @method
    @abstract 自定义GPU滤镜,将参数中的buffer进行处理后return.
    需要自定义滤镜时, 需要在setVideoParameters方法中将kGPUFilter设置为YES, 并且实现此delegate方法.
    如果仅将kGPUFilter设置为YES而不实现此方法,则使用默认滤镜.
    @param buffer GPU滤镜buffer
    */
    - (CMSampleBufferRef)rongRTCEngine:(RongRTCEngine *)engine onGPUFilterSource:(CMSampleBufferRef)buffer;
    
    /*!
    @method
    @abstract 当丢包率大于等于所设置的值时,通过此方法回调,并返回此次丢包率
    @param lost 取值范围0~100, 代表丢包率0%~100%
    */
    - (void)rongRTCEngine:(RongRTCEngine *)engine onNetworkSentLost:(NSInteger)lost;
    
    /*!
    @method
    @abstract 当丢包率大于等于所设置的值时,通过此方法回调,并返回此次丢包率
    @param lost 取值范围0~100, 代表丢包率0%~100%
    */
    - (void)rongRTCEngine:(RongRTCEngine *)engine onNetworkReceiveLost:(NSInteger)lost;
    
    /*!
    @method
    @abstract 传递本地和远端的声音大小, 取值: 0-9
    @param levelArray 保存NSDictionary, 包括自己的音量
    */
    - (void)rongRTCEngine:(RongRTCEngine *)engine onNotifyUserAudioLevel:(NSArray *)levelArray;
    
    @end
    
    
    __attribute__((visibility("default"))) @interface RongRTCEngine : NSObject
    
    /*!
    @property delegate
    @abstract RongRTCEgnine delegate
    */
    @property (nonatomic, weak) id<RongRTCEngineDelegate> delegate;
    
    /*!
    @property isExecuteDelegateInMainQueue 是否在主线程中运行回调的delegate方法
    @abstract delegate方法是否在Main Queue中进行回调
    */
    @property (nonatomic, assign) BOOL isExecuteDelegateInMainQueue;
    
    /*!
    @property engineTLSCertificateData 在JoinChannel之前设置本地证书NSData,需要使用TLS加密时设置,默认为nil,不使用TLS
    */
    @property (nonatomic, strong) NSData *engineTLSCertificateData;
    
    /*!
    @property isSendLostReport 设置网络丢包率是否上报,当设置为Yes时通过 rongRTCEngine:onNetworkSentLost: 回调方法通知丢包值,取值范围0~100, 代表丢包率0%~100%
    @abstract Yes:上报 NO:不上报 默认值:NO
    */
    @property (nonatomic, assign) BOOL isSendLostReport;
    
    
    /*!
    @property isReceiveLostReport 设置网络接收丢包率是否上报,当设置为Yes时通过 rongRTCEngine:onNetworkReceiveLost: 回调方法通知丢包值,取值范围0~100, 代表丢包率0%~100%
    @abstract Yes:上报 NO:不上报 默认值:NO
    */
    @property (nonatomic, assign) BOOL isReceiveLostReport;
    
    /*!
    @method
    @abstract 初始化方法
    @param serverURL CMP的serverURL
    */
    - (instancetype)initEngine:(NSString *)serverURL;
    
    /*!
    @method
    @abstract RongRTCEngine单例, 不可用做RongRTCEngine的初始化, 仅用来初始化之后获取RongRTCEngine对象
    */
    + (RongRTCEngine *)sharedRongRTCEngine;
    
    /*!
    @method
    @abstract 返回当前SDK版本号
    */
    + (NSString *)sdkVersion;
    
    /*!
    @method
    @abstract 必须在调用joinChannel:前设置本地视频参数才能生效, 不设置则使用默认值
    @param parameters  kAudioOnly:    是否为纯音频, 默认值为NO
    kVideoProfile: 本地视频分辨率, 默认值为RongRTC_VideoProfile_640_480P
    kMaxBandWidth: 最大码率, 默认值为500
    kUserType:     用户类型, 默认值为RongRTC_User_Normal
    kCloseCamera:  是否关闭视频显示, 默认值为1,不关闭视频
    kGPUFilter:    是否打开滤镜, 默认为NO,不使用滤镜
    */
    - (void)setVideoParameters:(NSDictionary *)parameters;
    
    /*!
    @method
    @abstract 不设置则使用默认值
    @param parameters  videoMode:    视频观看模式, 默认值为RongRTC_VideoMode_Smooth
    */
    - (void)setVideoMode:(RongRTCVideoMode)videoMode;
    
    /*!
    @method
    @abstract 加入聊天室
    @param channel 不同聊天室的唯一标识
    @param token 通过HTTP的POST方式查询回来的字符串
    @param userID 用户ID
    */
    - (void)joinChannel:(NSString*)channel withKeyToken:(NSString *)token withUserID:(NSString *)userID withUserName:(NSString *)userName;
    
    /*!
    @method
    @abstract 单独发送JoinChannel消息
    @param userID 用户ID
    */
    - (void)sendJoinChannelMessage:(NSString *)userID;
    
    /*!
    @method
    @abstract 单独发送JoinChannel消息
    @param userID 用户标识唯一ID
    @param channel 不同聊天室的唯一标识
    */
    - (void)sendJoinChannelMessage:(NSString *)userID withChannel:(NSString *)channel;
    
    /*!
    @method
    @abstract 离开当前聊天室
    */
    - (void)leaveChannel;
    
    /*!
    @method
    @abstract joinChannel之后修改本地发送视频的分辨率
    @param videoProfile 视频分辨率
    */
    - (void)changeVideoSize:(RongRTCVideoProfile)videoProfile;
    
    /*!
    @method
    @abstract 请求白板页面HTTP URL, 自己已在聊天室中且聊天室中至少还有一个远程用户, 在请求之后会异步通过delegate中的rongRTCEngine: onWhiteBoardURL:方法返回白板页面的URL
    */
    - (void)requestWhiteBoardURL;
    
    /*!
    @method
    @abstract 请求白板页面是否存在, 在请求之后会异步通过delegate中的rongRTCEngine: onWhiteBoardExist:方法返回是否存在
    */
    - (void)requestWhiteBoardExist;
    
    /*!
    @method
    @abstract 根据自定义frame和视频的显示类型, 创建本地视频View
    @param frame 自定义本地视频的frame  type:本地视频显示类型
    @param type 本地视频显示类型
    */
    - (UIView *)createLocalVideoViewFrame:(CGRect)frame withDisplayType:(RongRTCVideoViewDisplayType)type;
    
    /*!
    @method
    @abstract 根据userId确定某个远端用户, 用自定义frame和视频的显示类型type, 创建远端视频View
    @param frame 自定义本地视频的frame
    @param userId 某个远端用户
    @param type 本地视频显示类型
    */
    - (UIView *)createRemoteVideoViewFrame:(CGRect)frame forUser:(NSString *)userId withDisplayType:(RongRTCVideoViewDisplayType)type;
    
    /*!
    @method
    @abstract 根据所选RongRTCVideoViewDisplayType, 重新设置本地视频, 需要变换本地视频View frame时使用
    @param frame 自定义本地视频的frame
    @param type 本地视频显示类型
    */
    - (UIView *)changeLocalVideoViewFrame:(CGRect)frame withDisplayType:(RongRTCVideoViewDisplayType)type;
    
    /*!
    @method
    @abstract 根据所选RongRTCVideoViewDisplayType, 重新设置远端视频, 需要变换远端视频View frame时使用
    @param frame 自定义远端视频的frame
    @param userId 需要修改frame的视频的用户userId
    @param type 远端视频显示类型
    */
    - (UIView *)changeRemoteVideoViewFrame:(CGRect)frame withUserID:(NSString *)userId withDisplayType:(RongRTCVideoViewDisplayType)type;
    
    #pragma mark - Meeting
    /*!
    @method
    @abstract 观察者调用, 请求发言(需要主持人应答)
    @return 0:成功 1:参数错误 2:状态错误
    */
    - (NSInteger)observerRequestBecomeNormalUser;
    
    /*!
    @method
    @abstract 任何与会人员调用, 已在房间里的用户获取邀请链接
    @return 0:成功 1:参数错误 2:状态错误
    */
    - (NSInteger)getInviteURL;
    
    /*!
    @method
    @abstract 与会正常用户调用, 请求获取主持人权限
    @return 0:成功 1:参数错误 2:状态错误
    */
    - (NSInteger)normalUserRequestHostAuthority;
    
    /*!
    @method
    @abstract 主持人调用发起, 将正常用户降级为观察者
    @param userID 用户标识唯一ID
    @return 0:成功 1:参数错误 2:状态错误
    */
    - (NSInteger)degradeNormalUserToObserver:(NSString *)userID;
    
    /*!
    @method
    @abstract 主持人调用发起, 将观察者升级为正常用户(需要被操作的观察者应答)
    @param userID 用户标识唯一ID
    @return 0:成功 1:参数错误 2:状态错误
    */
    - (NSInteger)upgradeObserverToNormalUser:(NSString *)userID;
    
    /*!
    @method
    @abstract 主持人调用, 移除与会人员
    @param userID 用户标识唯一ID
    @return 0:成功 1:参数错误 2:状态错误
    */
    - (NSInteger)removeUser:(NSString *)userID;
    
    /*!
    @method
    @abstract 主持人调用, 操作与会人员麦克风/摄像头的打开/关闭, 需要被操作人通过 - (NSInteger)answerHostControlUserDevice:(NSString *)userID withDeviceType:(RongRTC_Device_Type)dType open:(BOOL)isOpen status:(BOOL)isAccept; 给出应答
    @param userID 用户标识唯一ID
    @param type 设备类型
    @param isOpen 是否打开
    @return 0:成功 1:参数错误 2:状态错误
    */
    - (NSInteger)hostControlUserDevice:(NSString *)userID withDeviceType:(RongRTC_Device_Type)type open:(BOOL)isOpen;
    
    /*!
    @method
    @abstract 主持人邀请观察者升级成正常用户时, 观察者的应答调用
    @param userID 用户标识唯一ID
    @param isAccept 是否接受
    @return 0:成功 1:参数错误 2:状态错误
    */
    - (NSInteger)answerUpgradeObserverToNormalUser:(NSString *)userID status:(BOOL)isAccept;
    
    /*!
    @method
    @abstract 观察者向主持人申请升级成正常用户时, 主持人的应答调用
    @param userID 用户标识唯一ID
    @param isAccept 是否接受
    @return 0:成功 1:参数错误 2:状态错误
    */
    - (NSInteger)answerObserverRequestBecomeNormalUser:(NSString *)userID status:(RongRTC_Accept_Type)isAccept;
    
    /*!
    @method
    @abstract 麦克风/摄像头被主持人打开/关闭时, 被打开/关闭人的应答调用
    @param userID 用户标识唯一ID
    @param dType 设备类型
    @param isAccept 是否接受
    @return 0:成功 1:参数错误 2:状态错误
    */
    - (NSInteger)answerHostControlUserDevice:(NSString *)userID withDeviceType:(RongRTC_Device_Type)dType open:(BOOL)isOpen status:(BOOL)isAccept;
    
    /*!
    @method
    @abstract 主持人将正常用户降级为观察者时, 观察者的应答调用
    @param userID 用户标识唯一ID
    @param isAccept 是否接受
    @return 0:成功 1:参数错误 2:状态错误
    */
    - (NSInteger)answerDegradeNormalUserToObserver:(NSString *)userID status:(BOOL)isAccept;
    
    #pragma mark - UI切换操作
    /*!
    @method
    @abstract 切换前后摄像头
    */
    - (void)switchCamera;
    
    /*!
    @method
    @abstract 打开/关闭本地视频,UI操作并通过代理 rongRTCEngine:onUser:audioVideoType: 通知其他用户视频已关闭
    @param enable Yes:关闭本地视频  NO:打开本地视频
    */
    - (void)closeLocalVideo:(BOOL)enable;
    
    /*!
    @method
    @abstract  订阅小流视频
    @param
    */
    - (void)subscribeStreamForTiny:(NSArray *)tinyStreamUserIDs forOrigin:(NSString *)originStreamUserID;
    
    /*!
    @method
    @abstract 设置小流视频分辨率
    @param
    */
    - (void)setVideoSizeForTinyStream:(CGFloat)width height:(CGFloat) height;
    
    /*!
    @method
    @abstract 打开/关闭本地视频,通过信令通知服务端.
    @param avType RongRTC_User_Only_Audio:关闭本地视频,仅音频  RongRTC_User_Audio_Video:打开本地视频
    */
    - (void)modifyAudioVideoType:(RongRTCAudioVideoType)avType;
    
    /*!
    @method
    @abstract 打开/关闭本地音频/视频, 通过信令通知服务端.
    @param type 操作的音视频设备类型
    @param isOpen YES:打开 NO:关闭
    */
    - (NSInteger)controlAudioVideoDevice:(RongRTC_Device_Type)type open:(BOOL)isOpen;
    
    /*!
    @method
    @abstract 打开/关闭外放声音
    @param enable Yes:开启声音  NO:关闭声音
    */
    - (void)switchSpeaker:(BOOL)enable;
    
    /*!
    @method
    @abstract 打开/关闭麦克风
    @param enable Yes:静音,麦克风不收录声音  NO:不静音,麦克风可以收录声音
    */
    - (void)muteMicrophone:(BOOL)enable;
    
    #pragma mark - 录制
    /*!
    @method
    @abstract 开始录制
    @param filePath 录制文件保存路径
    */
    - (NSInteger)startRecording:(NSString *)filePath;
    
    /*!
    @method
    @abstract 停止录制
    */
    - (NSInteger)stopRecording;
    
    #pragma mark - 日志
    /*!
    @method
    @abstract 设置RongRTC日志文件位置, 不需要指定文件名, 只能在[RongRTCEngine alloc]之前设置才能生效
    @param path 沙盒路径
    */
    + (void)setRongRTCLogPath:(NSString *)path;