音视频 SDK 文档

    概述

    注:由于底层引擎技术升级,3.0.0 及之后版本的 RTCLib SDK 与 3.0.0 之前版本的 RTCLib SDK 不能互通。使用 RTCLib 3.0.0 SDK 时必须使用 IMLib 2.9.13 及以上版本进行集成。
    如您使用的是音视频 2.1.1 版本,详细可查看 RTCLib 2.1.1 开发指南

    融云音视频提供基于房间的音视频会议功能,支持一对一和多对多的实时音视频通话,支持自定义视频流,修改本端采集的音视频原始数据,修改接收到的音频原始数据,自定义渲染视频视图,纯语音通话和视频通话等功能。

    音视频框架简介

    音视频 SDK 使用房间、房间成员的概念来进行开发,进行音视频通话必须所有人加入到同一个房间,房间中每个人的音频、视频、其他媒体数据等都以流 (stream) 来抽象表示,房间中的人可以订阅其他人的流数据。

    SDK 常用框架和模型 描述
    RongRTCEEngine 音视频引擎,SDK 初始化管理类
    RongRTCRoom 音视频房间对象,负责管理房间内所有人员,包含当前登录用户 localUser 和远端用户 remoteUsers
    RongRTCLocalUser 当前登录用户,负责发布和取消发布本端资源
    RongRTCRemoteUser 远端房间内用户
    RongRTCAVCapturer 音视频采集类,负责音视频的采集,音视频参数设置,音视频数据回调监听和管理,音视频数据发送等
    RongRTCAVInputStream 要订阅的音视频流对象,App 通过 remoteUser 的订阅方法,传入该对象即可完成音视频的订阅功能,目前支持音频和视频功能
    RongRTCAVOutputStream 自定义音视频类,用户可以通过该自定义对象构建一个音视频流,通过该对象即可完成自定义音视频发布

    RongRTCLib 流程图

    image

    流程图解:

    1. 加入房间,获取房间内远端用户列表和当前用户列表;

    2. 发布音视频资源(SDK 提供发布默认音视频流 API 方便快速集成使用);

    3. 订阅远端用户音视频资源;

    4. 4、5 步监听房间内事件和音视频帧相关事件,获取事件回调内容;

    房间架构图

    image

    房间架构图解

    RongRTCRoom 中包含当前登录用户和远端用户列表,APP 可以直接获取当前用户进行资源发布,也可以通过房间内远端用户进行音视频资源订阅

    为确保终端用户音视频通话质量,同一房间建议最多音视频同时通话人数,如下:

    1. 单个房间内建议最多 9 人同时进行视频通话
    2. 单个房间内建议最多 20 人同时进行音频通话

    注:同一房间中建议可发起音视频通话总用户上限为 20 人。

    依赖 IMLib 版本说明

    RTCLib SDK 依赖于 IMLib SDK,两者版本对应关系如下:

    RTCLib SDK 对应 IMLib SDK
    3.0.0 ~ 3.0.5 版本 2.9.13 ~ 2.9.17 版本
    3.0.6 版本 2.9.18 及以上版本

    快速集成

    融云 iOS 音视频服务 SDK 可以使用 CocoaPod 的方式进行集成(推荐使用),也可以在融云官网下载实时音视频库进行集成,集成 RongRTCLib 时只需要导入 RongRTCLib 和 RongIMLib 库即可,集成 CallKit 和 CallLib 则需要导入 RongIMKit、RongIMLib、RongRTCLib 等库文件。

    iOS 需要 8.0 以上版本操作系统。

    CocoaPod 集成

    pod 'RongRTCLib', '~> 3.0.0'
    

    手动导入

    官网下载 RongRTCLib SDK(大于 3.0.0 版本)进行集成:

    1、 导入 RongRTCLib.framework、RongIMLib.framework、libopencore-amrnb.a (该库包含在 IMLib 软件包中) 以及下面系统库

    2、 添加以下系统依赖库

    • AssetsLibrary.framework
    • VideoToolBox.framework
    • GLKit.framework
    • MapKit.framework
    • ImageIO.framework
    • CoreLocation.framework
    • SystemConfiguration.framework
    • QuartzCore.framework
    • OpenGLES.framework
    • CoreVideo.framework
    • CoreTelephony.framework
    • CoreMedia.framework
    • CoreAudio.framework
    • CFNetwork.framework
    • AudioToolbox.framework
    • AVFoundation.framework
    • UIKit.framework
    • CoreGraphics.framework
    • c++.tbd
    • z.tbd
    • sqlite3.tbd
    • bz2.tbd

    快速集成示例

    流程如下:

    1. 加入房间
    2. 设置本地预览视图,发布资源
    3. 订阅远端用户音视频资源,设置远端预览视图
    4. 离开房间

    代码示例:

    - (void)viewDidLoad {
        [super viewDidLoad];
        // Do any additional setup after loading the view, typically from a nib.
    
        // AppKey 设置
        //    [[RCIMClient sharedRCIMClient] initWithAppKey:@"XXXXXXX"];
        //    连接 IM
        //[[RCIMClient sharedRCIMClient] connectWithToken:@"tokeen"
        //                            success:^(NSString *userId) {}
        //                            error:^(RCConnectErrorCode status){}
        //                            tokenIncorrect:^{ }];
    
        // 设置采集参数
        [[RongRTCAVCapturer sharedInstance] setCaptureParam:[RongRTCVideoCaptureParam defaultParameters]];
        RongRTCLocalVideoView * localView = [[RongRTCLocalVideoView alloc]initWithFrame:self.view.bounds];
        [self.view addSubview:localView];
        // 设置本地预览视图
        [[RongRTCAVCapturer sharedInstance] setVideoRender:localView];
        [[RongRTCAVCapturer sharedInstance] startCapture];
        // 加入房间
        [[RongRTCEngine sharedEngine] joinRoom:@"HelloRTC" completion:^(RongRTCRoom * _Nullable room, RongRTCCode code) {
            room.delegate = self;
            self.room = room;
            // 发布资源
            [room.localUser publishDefaultAVStream:^(BOOL isSuccess, RongRTCCode desc) {
    
            }];
        }];
    }
    
    // 监听发布资源消息
    -(void)didPublishStreams:(NSArray<RongRTCAVInputStream *> *)streams{
        // 订阅资源
        [self.room.remoteUsers.firstObject subscribeAVStream:streams tinyStreams:nil completion:^(BOOL isSuccess, RongRTCCode desc) {
    
        }];
        // 设置远端渲染视图
        for (RongRTCAVInputStream * stream in streams) {
            if (stream.streamType == RTCMediaTypeVideo) {
                RongRTCRemoteVideoView * videoView = [[RongRTCRemoteVideoView alloc]initWithFrame:CGRectMake(100, 250, 100, 100)];
                [stream setVideoRender:videoView];
            }
        }
    }
    

    快速集成 Demo

    融云在 GitHub 上提供了快速集成 Demo 代码示例,方便开发者参考。

    基础功能

    加入房间

    1、加入房间后返回房间对象,用户可以直接使用房间对象来进行音视频流的发布和订阅

    /**
     加入房间
    
     @param completion 加入房间回调
     */
    -(void)joinRoom:(NSString *)roomId
         completion:(nullable void (^)( RongRTCRoom  * _Nullable room,RongRTCCode code))completion;
    

    2、设置音视频采集参数,开启音视频的采集

    /**
     设置音视频采集参数
    
     @param params 参数
     */
    - (void)setCaptureParam:(RongRTCVideoCaptureParam*)params;
    
    /**
    开始音视频采集
     */
    - (void)startCapture;
    

    发布资源

    1、调用 RongRTCLocalUser 对象发布(或者取消发布)媒体流,其中包含默认音视频流

    /**
     发布默认音视频流
    
     @param completion 发布完成回调
     */
    - (void)publishDefaultAVStream:(RongRTCOperationCallback)completion;
    
    /**
     取消发布默认音视频流
    
     @param comletion 取消发布完成回调
     */
    - (void)unpublishDefaultAVStream:(RongRTCOperationCallback)comletion;
    

    2、设置视频渲染视图

    /**
     设置本地预览视图
    
     @param render 预览视图
     */
    - (void)setVideoRender:(RongRTCLocalVideoView*)render;
    

    加入房间设置本地渲染视图

    [[RongRTCEngine sharedEngine] joinRoom:@"HelloRTC" completion:^(RongRTCRoom * _Nullable room, RongRTCCode code) {
        room.delegate = self;
        self.room = room;
        // 发布资源
        [room.localUser publishDefaultAVStream:^(BOOL isSuccess, NSString *desc) {
    
        }];
    }];
    // 设置本地渲染视图
    RongRTCLocalVideoView * localView = [[RongRTCLocalVideoView alloc]initWithFrame:CGRectMake(100, 100, 100, 100)];
    [[RongRTCAVCapturer sharedInstance] setVideoRender:localView];
    

    该流程走完时本端视频发布和预览功能实现完成,下面介绍对端用户订阅音视频的功能

    订阅资源

    1、调用 RongRTCRemoteUser 对象订阅(或者取消订阅)媒体流,如果是视频流,请设置 RongRTCAVInputStream 对象的渲染界面,否则视频不可见。 (用户可以遍历所有用户进行相关流的订阅,也可以直接将所有流组合在一起,通过一个 remoteUser 实现所有的流订阅),也可以选择切换使用大码率视频流播放还是小码率视频流播放

    /**
     订阅流
    
     @param avStreams 普通流
     @param tinyStreams 需要携带小流的流数组
     @param completion 完成的回调
     */
    - (void)subscribeAVStream:(nullable NSArray<RongRTCAVInputStream *> *)avStreams
                  tinyStreams:(nullable NSArray<RongRTCAVInputStream *> *)tinyStreams
                   completion:(nullable RongRTCOperationCallback)completion;
    
    /**
     将一个视频流切换成小码率视频流
    
     @param streams 要切换的流
     @param completion 切换是否成功
     */
    -(void)exchangeStreamToTinyStream:(nonnull NSArray<RongRTCAVInputStream *> *)streams
                           completion:(nullable RongRTCOperationCallback)completion;
    
    /**
     将一个视频流切换成正常码率视频流
    
     @param streams 要切换的视频流
     @param completion 切换是否成功
     */
    -(void)exchangeStreamToNormalStream:(nonnull NSArray<RongRTCAVInputStream *> *)streams
                           completion:(nullable RongRTCOperationCallback)completion;
    
    
    /**
     设置远端用户视频流的渲染界面
    
     @param render 渲染界面
     */
    - (void)setVideoRender:(nullable RongRTCRemoteVideoView*)render;
    

    订阅代码示例:

    // 监听发布资源消息
    -(void)didPublishStreams:(NSArray<RongRTCAVInputStream *> *)streams{
        // 订阅资源
        [self.room.remoteUsers.firstObject subscribeAVStream:streams tinyStreams:nil completion:^(BOOL isSuccess, NSString *desc) {
    
        }];
        // 设置远端渲染视图
        for (RongRTCAVInputStream * stream in streams) {
            if (stream.streamType == RTCMediaTypeVideo) {
                RongRTCRemoteVideoView * videoView = [[RongRTCRemoteVideoView alloc]initWithFrame:CGRectMake(100, 250, 100, 100)];
                [stream setVideoRender:videoView];
            }
        }
    }
    

    音视频采集参数

    SDK 将手持设备的摄像头、麦克风等流媒体设备进行统一管理,方便上层用户的使用,调用该管理类的方法会直接影响默认媒体流,也即是 publishDefaultAVStream 该方法发布的媒体流。

    设置启动参数

    该参数只有在摄像头启动之前设置才有效

    /**
     设置音视频采集参数,启动时有效,启动之后再设置不会生效
    
     @param params 参数
     */
    - (void)setCaptureParam:(RongRTCVideoCaptureParam*)params;
    

    开关摄像头

    /**
     开启摄像头
     */
    - (void)startCapture;
    
    /**
     关闭摄像头,仅仅是关闭摄像头,远端用户不会收到通知
     */
    - (void)stopCapture;
    
    /**
     采集运行中关闭或打开摄像头(远端用户会收到摄像头关闭的通知)
    
     @param disable YES 关闭,否则打开
     */
    - (void)setCameraDisable:(BOOL)disable;
    

    切换摄像头

    /**
     切换前后摄像头
     */
    - (void)switchCamera;
    

    开关麦克风

    /**
     关闭/打开麦克风
    
     @param disable YES 关闭,NO 打开
     */
    - (void)setMicrophoneDisable:(BOOL)disable;
    

    切换扬声器

    /**
     切换使用外放/听筒
     */
    - (void)useSpeaker:(BOOL)useSpeaker;
    

    设置分辨率

    /**
     设置通话过程中的视频分辨率
     */
    @property(nonatomic,assign) RongRTCVideoSizePreset videoSizePreset;
    

    设置帧率

    /**
     设置过程中视频帧率
     */
    @property(nonatomic,assign) RongRTCVideoFPS videoFrameRate;
    

    离开房间

    /**
     离开房间
     */
    -(void)leaveRoom:(NSString*)roomId
          completion:(void (^) (BOOL isSuccess , RongRTCCode code))completion;
    

    进阶功能

    房间事件和发布订阅

    房间相关事件以及发布订阅流程

    image

    房间事件和发布订阅图解:

    • App 可以为 Room 设置事件代理回调,Room 的所有事件均通过代理方法回调给上层 APP

    • App 可以获取 Room 中的 localUser 进行资源发布

    • App 可以获取 Room 中的 remoteUsers 进行资源订阅

    房间事件

    SDK 事件回调的实现集中在 RongRTCRoom 中,上层实现 RongRTCRoomDelegate 代理即可接收房间相关事件,包括事件如下:

    // 有人加入房间
    -(void)didJoinUser:(RongRTCRemoteUser*)user;
    
    // 有人离开房间
    -(void)didLeaveUser:(RongRTCRemoteUser*)user;
    
    // 订阅的流连接成功,用户可以通过􏱠􏰛􏵴􏱋􏰊􏱚􏱣􏲀􏲧􏱾􏱺􏱉􏳾􏳈􏱃􏱄􏵇􏴴􏱉􏱊该回调判断通话使用联通
    - (void)didConnectToStream:(RongRTCAVInputStream *)stream;
    
    // 流的第一个关键帧到达(画面可以正常显示图像了)
    - (void)didReportFirstKeyframe:(RongRTCAVInputStream *)stream;
    
    // 有用户发布音视频流
    - (void)didPublishStreams:(NSArray <RongRTCAVInputStream *>*)streams;
    
    // 有用户取消发布音视频流
    - (void)didUnpublishStreams:(NSArray<RongRTCAVInputStream *>*)streams;
    
    // 收到房间中其他人发的消息
    - (void)didReceiveMessage:(RCMessage *)message;
    
    // 当前用户被踢出房间
    - (void)didKickedOutOfTheRoom:(RongRTCRoom *)room;
    
    // 有用户将音频打开或者关闭
    - (void)stream:(RongRTCAVInputStream*)stream didAudioMute:(BOOL)mute
    
    // 有用户将视频打开或者关闭
    - (void)stream:(RongRTCAVInputStream*)stream didVideoEnable:(BOOL)enable
    

    音视频流数据回调事件

    image

    音视频流数据回调事件图解

    • App 通过设置采集器实例(RongRTCAVCapturer)设置音视频数据回调函数, SDK 内部的音频和视频的相关回调均通过该采集器回调函数返回给 App,App 处理完音视频数据后回传给 SDK,由 SDK 进行音视频的发送

    • 本端音频采集回调:将本端采集的音频回调给 App 处理

    • 远端音频采集回调:将远端采集的音频回调给 App 处理

    • 本端视频采集发送前回调:视频帧发送前会回调给 App 先进行预处理

    • 本端视频本地预览前回调:视频帧本地显示前回调给 App 先进行预处理

    1、发送端音频

    发送端音频数据回调可以通过设置 audioBufferCallback 回调的 block 来进行监听,SDK 在发送音频前会回调该数据,用户可以修改音频数据实现个性化音效。

    /**
     接收到音频或者发送音频时的音频数据,用户可以直接处理该音频数据,读取 audioBufferCallback 中的 isOutput 即可判断是输入还是输出
     */
    @property (nonatomic,copy,nullable) RongRTCAudioPCMBufferCallback audioBufferCallback;
    

    2、发送端视频

    发送端视频分为两个回调:

    1. 即将发送视频帧时的回调,用户处理完成后将视频帧返回给 SDK,由 SDK 直接进行发送从而达到发送视频帧修改的目的。

    2. 本地视频即将显示的帧回调,APP 可以操作该视频帧达到本地视频预览的修改目的

    /**
     引擎底部开始视频编码并发送之前会往上层抛一个回调,用户可以修改和调整 CMSampleBufferRef 数据,然后返回一个 CMSampleBufferRef 数据,如果返回空或者没有实现该回调,则会使用默认视频数据传输
    
     注:如果用户传正常数据,则内部会自行 CFRelease CMSampleBufferRef 对象,上层不需要再考虑释放问题
     */
    @property (nonatomic,copy,nullable) RongRTCVideoCMSampleBufferCallback videoSendBufferCallback;
    
    /**
     本地摄像头采集的视频在即将预览前会往上层抛一个视频帧回调,用户可以处理视频帧数据之后然后回传给 RTC,RTC 使用用户处理的视频帧进行预览
    
      注:如果用户传正常数据,则内部会自行 CFRelease CMSampleBufferRef 对象,上层不需要再考虑释放问题
     */
    @property (nonatomic,copy,nullable) RongRTCVideoCMSampleBufferCallback videoDisplayBufferCallback;
    

    3、接收端音频

    接收端音频和发送端音频共用一个回调,通过其中属性 isOutput 来判断是本端数据还是远端输入

    /**
     接收到音频或者发送音频时的音频数据,用户可以直接处理该音频数据,读取 audioBufferCallback 中的 isOutput 即可判断是输入还是输出
     */
    @property (nonatomic,copy,nullable) RongRTCAudioPCMBufferCallback audioBufferCallback;
    

    4、接收端视频

    接收端视频用户需要设置 RongRTCAVInputStream (用户订阅的流对象)的代理,实现代理方法即可实现远端视频帧的回调处理,用户可以基于该视频帧做相应的个性化定制。

    /**
     音视频流的delegate
     */
    @protocol RongRTCAVInputStreamDelegate <NSObject>
    /**
      视图即将渲染某个视频帧,如果如果需要自定义视频显示的话需要修改该视频帧
    
     @param ref 即将渲染的视频帧数据
     @param stream 用户需要渲染的视频帧数据
     */
    -(void)willRenderCVPixelBufferRef:(CVPixelBufferRef)ref stream:(RongRTCAVInputStream *)stream;
    
    @end
    

    自定义视频流

    1、用户手动创建 RongRTCAVOutputStream 该对象,然后调用 RongRTCRoom 中的发布方法可以发布自定义视频流(参考方法 a),发布成功之后用户需要自行调用 RongRTCAVOutputStream 的写入媒体流方法来进行流传输(参考方法 b)

    方法 a:

    /**
    *  发布音视频流
    *
    *  @param stream 发布的音视频流
    *  @param completion 发布的音视频流结果
    */
    - (void)publishAVStream:(RongRTCAVOutputStream *)stream extra:(NSString *)extra completion:(RongRTCOperationCallback)completion;
    

    方法 b:

    /**
     写入媒体流,该方法会直接将视频数据进行音视频编码并发送只远端
    
     @param sample 媒体数据
     @param error 失败时返回的相关描述
     */
    - (void)write:(CMSampleBufferRef)sample error:(NSError**)error;
    

    自定义音频流

    1、外置 Mic 和网络音频流输入源混音

    /**
     混合 PCM 数据,单声道,16 bit signed, 48000 采样率,外置 mic 和网络音频流场景可以
     通过该方法实现外置 mic 的混合以及替换的逻辑,目前只支持下面两种使用方式。
      action: RTCAudioActionOnlyMix, RTCAudioActionReplace
    
     内部会保证时间同步,上层请注意往里面写的频率(写入速度太快容易导致内部缓冲区满而导致丢失数据)
     另外如果仅仅是文件声音混合,请直接使用 RongRTCAudioMixerEngine,使用更加简单方便
    
     @param pcmBuffer 声音 buffer
     @return 是否混合成功
     */
    -(BOOL)writePCMBuffer:(NSData *)pcmBuffer action:(RTCAudioAction)action;
    

    2、本地文件输入源混音

    /**
     混音功能(目前只支持混合本地音频数据),开始新混音之前需要先调用 stop,结束混音
    
     @param audioSource 要混合的音频数据
     @param action 混音音频的类型
     @param loop 视频循环混合音频数据,YES 时 音频数据播放结束时会循环播放,大文件不建议使用 loop 的模式进行播放
     @return 成功与否
     */
    -(BOOL)mix:(NSString *)audioSource action:(RTCAudioAction)action loop:(BOOL)loop;
    

    设置房间属性

    设置房间属性,如创建房间时可通过此功能标识房间创建者,其他房间内用户可获取到此属性信息

    // 设置房间属性,并选择是否往房间中发送消息
    -(void)setRoomAttributeValue:(NSString *)attributeValue forKey:(NSString *)key message:(RCMessageContent *)message completion:(RongRTCOperationCallback)completion;
    

    删除房间属性:

    // 删除房间属性,并选择是否往房间中发送消息
    -(void)deleteRoomAttributes:(NSArray <NSString *> *)attributeKeys message:(RCMessageContent *)message completion:(RongRTCOperationCallback)completion;
    

    获取房间当前设置的属性信息:

    // 获取房间属性
    -(void)getRoomAttributes:(NSArray <NSString *> *)attributeKeys completion:(RongRTCAttributeOperationCallback)completion;
    

    通道消息发送

    发送消息,通过此接口向房间内发送消息

    - (RCMessage *)sendRTCMessage:(RCMessageContent *)content
                          success:(void (^)(long messageId))successBlock
                            error:(void (^)(RCErrorCode nErrorCode, long messageId))errorBlock
    

    基于 SDK 常用功能实现

    SDK 提供丰富的音视频 API 来对美颜、水印、音效处理、会控等上层逻辑提供支持

    美颜和水印功能

    此功能是通过 RongRTCVideoCMSampleBufferCallback 的两上 block 上报的摄像头采集到的 CMSampleBufferRef 数据, 在 UI 层进行同步处理后实现的, 具体实现可参照源码中 ChatGPUImageHandler.m 中的实现, 具体步骤如下:

    1、在工程中引用我们提供的 GPUImage.framework (也可以自行编译和导入其他美颜类库) 和 Demo 中 GPUImageBeautyFilter、GPUImageOutputCamera 两个类

    2、videoSendBufferCallback 的实现

    [RongRTCAVCapturer sharedInstance].videoSendBufferCallback = ^CMSampleBufferRef _Nullable(BOOL valid, CMSampleBufferRef  _Nullable sampleBuffer) {
                CMSampleBufferRef processedSampleBuffer = [self.chatGPUImageHandler onGPUFilterSource:sampleBuffer];
                return processedSampleBuffer;
            };
    

    3、ChatGPUImageHandler 中美颜关键实现

    - (CMSampleBufferRef)onGPUFilterSource:(CMSampleBufferRef)sampleBuffer
    {
        if (!self.filter || !sampleBuffer)
            return nil;
        // 检查视频帧是否有效
        if (!CMSampleBufferIsValid(sampleBuffer))
            return nil;
    
        // 调用美颜滤镜方法,使用下一帧作为图片采集的来源
        [self.filter useNextFrameForImageCapture];
        CFRetain(sampleBuffer);
    
        // 美颜滤镜处理
        [self.outputCamera processVideoSampleBuffer:sampleBuffer];
    
        CMTime currentTime = CMSampleBufferGetPresentationTimeStamp(sampleBuffer);
        CFRelease(sampleBuffer);
        // 获取美颜之后的视频帧,并构建 CMSampleBufferRef 对象传给 RTCLib,(注意,RTCLib 内部会自动对引用计数做减一操作)
        GPUImageFramebuffer *framebuff = [self.filter framebufferForOutput];
        CVPixelBufferRef pixelBuff = [framebuff pixelBuffer];
        CVPixelBufferLockBaseAddress(pixelBuff, 0);
    
        CMVideoFormatDescriptionRef videoInfo = NULL;
        CMVideoFormatDescriptionCreateForImageBuffer(NULL, pixelBuff, &videoInfo);
    
        CMSampleTimingInfo timing = {currentTime, currentTime, kCMTimeInvalid};
    
        CMSampleBufferRef processedSampleBuffer = NULL;
        CMSampleBufferCreateForImageBuffer(kCFAllocatorDefault, pixelBuff, YES, NULL, NULL, videoInfo, &timing, &processedSampleBuffer);
    
        if (videoInfo == NULL)
            return nil;
    
        CFRelease(videoInfo);
        CVPixelBufferUnlockBaseAddress(pixelBuff, 0);
        // 视频帧返回给 RTCLib 进行传输
        return processedSampleBuffer;
    }
    

    查看美颜 Demo

    会议控制

    会控主要通过设置房间属性,标识当前用户权限级别,再配合通道消息发送接口的 API 来完成,以下为会控功能的实现逻辑,具体的代码需要 App 来实现:

    一、确定会议主持人:

    1. 假定第一个加入房间的用户作为主持人,负责控制音视频房间的所有人员角色,需要调用设置房间属性,给当前房间设置主持人属性,权限等信息,同时选择发送一条消息到房间中让房间成员知道。

    二、房间成员申请升级音视频权限:

    1. 第二个加入房间的人员为普通用户,先获取此房间属性,判断房间主持人。

    2. 使用通道消息发送接口,向房间中发送一条请求发言或请求视频通话的指令消息(该消息由开发者自定义)。

    3. 主持人收到房间内的指令消息后,判断消息类型,执行同意或拒绝操作,同时将操作结果通过通道消息发送接口,发送到房间中。

    4. 用户收到主持人操作后的消息,判断消息类型,如消息指令为通过则调用发布流接口发布音视频流,远端用户收到流之后订阅即可

    三、主持人调整房间用户音视频权限:

    1. 主持人如果不想房间中某一个人发言或者发布视频,可以通过[通道消息发送]接口,向房间中发送一条消息,消息中需要指定被调整用户 ID 及此条消息的指令类型(如:禁止发言)。

    2. 房间中用户收到此条消息后,判断是否为对自已的权限操作,如是对自已权限的调整的指令消息,则根据指令对本端设备进行相关权限设置(如:关闭本地摄像头或者麦克风),否则抛弃此消息,达到资源控制的逻辑。

    3. 远端用户收到禁用资源的命令之后自动关闭本地摄像头或者麦克风,达到资源控制的逻辑

    说明:

    会控功能主要是利用发布控制类消息,设置房间属性和成员属性的 API 来完成,合理利用这几个 API 即可实现会控功能。详细查参考 SealClass 开源项目

    白板功能实现

    融云的 SealClass 开源项目中,实现了白板功能,可供开发者进行参考。

    常用 API

    1、RongRTCEngine: 音视频引擎,SDK 初始化管理类

    方法 描述 支持版本
    sharedEngine 音视频引擎初始化 3.0.0
    joinRoom:completion 加入房间,获取音视频房间对象 3.0.0
    leaveRoom:completion 离开房间,SDK 清理音视频资源 3.0.0

    2、RongRTCRoom: 音视频房间对象,负责管理房间内所有人员,包含当前登录用户 localUser 和远端用户 remoteUsers

    方法和属性 描述 支持版本
    delegate 房间事件代理,实现代理方法获取房间内事件 3.0.0
    localUser 房间内当前登录用户对象,通过该属性可以发布资源 3.0.0
    remoteUsers 房间对所有远端用户对象,通过该属性可以订阅资源 3.0.0
    sendRTCMessage:success:error 发布房间内消息 3.0.0
    setRoomAttributeValue:attributeValue:forKey:message:completion 设置房间属性,message 参数可以选择是否往房间内同事发送一条消息 3.0.0
    deleteRoomAttributes:attributeKeys:message:completion 删除房间属性,message 参数可以选择是否往房间内同事发送一条消息 3.0.0
    getRoomAttributes:completion 获取房间属性 3.0.0

    3、 RongRTCLocalUser: 当前登录用户,负责发布和取消发布本端资源

    方法和属性 描述 支持版本
    localAVStreams 当前登录发布的所有音视频数据 3.0.0
    publishDefaultAVStream: 发布默认音视频资源 3.0.0
    unpublishDefaultAVStream: 取消发布默认音视频资源 3.0.0
    publishAVStream:extra:completion 发布自定义资源 3.0.0
    unpublishAVStream:extra:completion 取消发布自定义资源 3.0.0

    4、RongRTCRemoteUser : 远端房间内用户

    方法和属性 描述 支持版本
    remoteAVStreams 该用户发布的所有音视频资源 3.0.0
    subscribeAVStream:tinyStreams:completion 订阅该用户的音视频资源,注:如果视频资源放大 tinyStreams 参数中则 SDK 内部会订阅小码率的视频流数据 3.0.0
    exchangeStreamToTinyStream:completion 将一个视频流切换成小码率视频流
    exchangeStreamToNormalStream 将 一个视频流切换成正常码率视频流 3.0.0
    unsubscribeAVStream 取消订阅音视频流 3.0.0

    5、RongRTCAVCapturer : 音视频采集类,负责音视频的采集,音视频参数设置,音视频数据回调监听和管理,音视频数据发送等

    方法和属性 描述 支持版本
    setCaptureParam 音视频采集参数设置 3.0.0
    setMicrophoneDisable 关闭/打开麦克风 3.0.0
    switchCamera 切换前后摄像头 3.0.0
    useSpeaker: 切换使用外放/听筒 3.0.0
    startCapture 开启音视频采集 3.0.0
    stopCapture 关闭音视频采集 3.0.0
    setCameraDisable: 采集运行中关闭或打开摄像头 3.0.0
    videoSizePreset 设置通话过程中的视频分辨率 3.0.0
    videoFrameRate 设置通话过程中视频帧率 3.0.0
    maxBitrate 运行通话过程中最大码率设置,单位 bps 3.0.0
    videoOrientation 设置摄像头采集方向,默认以 AVCaptureVideoOrientationPortrait 角度进行采集 3.0.0
    audioBufferCallback 接收到音频或者发送音频时的音频数据,用户可以直接处理该音频数据 3.0.0
    videoSendBufferCallback 引擎底部开始视频编码并发送之前会往上层抛一个回调,用户可以修改和调整 CMSampleBufferRef 数据,然后返回一个 CMSampleBufferRef 数据,如果返回空或者没有实现该回调,则会使用默认视频数据传输 3.0.0
    videoDisplayBufferCallback 本地摄像头采集的视频在即将预览前会往上层抛一个视频帧回调,用户可以处理视频帧数据之后然后回传给 RTC,RTC 使用用户处理的视频帧进行预览 3.0.0
    setVideoRender: 设置视频媒体数据的渲染界面 3.0.0
    writePCMBuffer:action 混合 PCM 数据,只支持单声道,16 bit signed, 48000 采样率的音频 buffer,外置 mic 和网络音频流场景可以通过该方法实现外置 mic 的混合以及替换的逻辑 3.0.6

    6、RongRTCAVInputStream: 要订阅的音视频流对象,App 通过 remoteUser 的订阅方法,传入该对象即可完成音视频的订阅功能,目前支持音频和视频功能

    方法和属性 描述 支持版本
    delegate 音视频数据回调代理方法 3.0.0
    setVideoRender 设置远端用户视频流的渲染界面 3.0.0
    state 当前音视频的状态(正常还是禁用状态) 3.0.0

    7、RongRTCAudioMixerEngine 混音 API 主实现类,通过该类可以实现发送 app 内音频文件的功能,支持多种模式的混合功能,支持循环音频播放,支持配置自定义视频流实现完整视频的发布

    方法和属性 描述 支持版本
    mix:action:loop 主混音接口,传入音频文件即可实现混音功能,默认 SDK 不会自动播放,需要开发者调用 start 接口,另外该接口支持设置混音模式和是否循环播放 3.0.6
    start 开始混音和播放 3.0.6
    pause 暂停混音和播放 3.0.6
    stop 结束混音 3.0.6

    常见问题

    错误码

    集成融云 SDK 过程中,如遇到问题可查看常见状态码及处理表