美文网首页CCSDK问题合集
集成CC视频sdk时关于连麦集成

集成CC视频sdk时关于连麦集成

作者: Clark_new | 来源:发表于2019-05-22 13:55 被阅读0次

    一 SDK连麦相关方法介绍

    SDK连麦代理五个,调用连麦的SDK公有方法五个。详细介绍如下:

    SDK连麦代理

    1.1 该房间是否允许连麦回调(代理方法)

    /*
     *  @brief 本房间为允许连麦的房间,会回调此方法,在此方法中主要设置UI的逻辑,
     *  在断开推流,登录进入直播间和改变房间是否允许连麦状态的时候,都会回调此方法
     */
    - (void)allowSpeakInteraction:(BOOL)isAllow;
    

    1.2 webRTC连接成功回调(代理方法)

    /*
     *  @brief WebRTC连接成功,在此代理方法中主要做一些界面的更改
     */
    - (void)connectWebRTCSuccess;
    

    1.3 当前是否可以连麦回调(代理方法)

    /*
     *  @brief 当前是否可以连麦
     */
    - (void)whetherOrNotConnectWebRTCNow:(BOOL)connect;
    

    1.4 主播端接收连麦回调(代理方法)

    /**
     *  @brief 主播端接受连麦请求,在此代理方法中,要调用DequestData对象的
     *  - (void)saveUserInfo:(NSDictionary *)dict remoteView:(UIView *)remoteView;方法
     *  把收到的字典参数和远程连麦页面的view传进来,这个view需要自己设置并发给SDK,SDK将要在这个view上进行渲染
     */
    - (void)acceptSpeak:(NSDictionary *)dict;
    

    1.5 主播端断开连麦(代理方法)

    /*
     *  @brief 主播端发送断开连麦的消息,收到此消息后做断开连麦操作
     */
    -(void)speak_disconnect:(BOOL)isAllow;
    

    SDK连麦公有调用方法

    1.6 设置连麦窗口视图的大小

    /**
     *  @brief 设置远程连麦窗口的大小,连麦成功后调用才生效,连麦不成功调用不生效
     */
    -(void)setRemoteVideoFrameA:(CGRect)remoteVideoFrame;
    

    1.7 请求音视频连麦

    /**
     *  @brief 当观看端主动申请连麦时,需要调用这个接口,并把本地连麦预览窗口传给SDK,SDK会在这个view上
     * 进行远程画面渲染
     * param localView:本地预览窗口,传入本地view,连麦准备时间将会自动绘制预览画面在此view上
     * param isAudioVideo:是否是音视频连麦,不是音视频即是纯音频连麦(YES表示音视频连麦,NO表示音频连麦)
     */
    -(void)requestAVMessageWithLocalView:(UIView *)localView isAudioVideo:(BOOL)isAudioVideo;
    

    1.8 传递连麦视图

    /**
     *  @brief 当收到- (void)acceptSpeak:(NSDictionary *)dict;回调方法后,调用此方法
     * dict 正是- (void)acceptSpeak:(NSDictionary *)dict;接收到的的参数
     * remoteView 是远程连麦页面的view,需要自己设置并发给SDK,SDK将要在这个view上进行远程画面渲染
     */
    - (void)saveUserInfo:(NSDictionary *)dict remoteView:(UIView *)remoteView;
    

    1.9 将要连接WebRTC

    /**
     *  @brief 将要连接WebRTC
     */
    -(void)gotoConnectWebRTC;
    

    1.10 观看端断开连麦

    /**
     *  @brief 观看端主动断开连麦时候需要调用的接口
     */
    - (void)disConnectSpeak;
    

    二 实现连麦交互流程

    2.1 初始化SDK,实现代理方法

    进入直播间,初始化SDK后,当断开推流,登录进入直播间和改变房间是否允许连麦状态的时候,都会响应回调代理方法1.1- (void)allowSpeakInteraction:(BOOL)isAllow;

    /*
     *  @brief 本房间为允许连麦的房间,会回调此方法,在此方法中主要设置UI的逻辑,
     *  在断开推流,登录进入直播间和改变房间是否允许连麦状态的时候,都会回调此方法
     */
    - (void)allowSpeakInteraction:(BOOL)isAllow {
        NSLog(@"__lianmai %s", __func__);
        //在这里需要保存参数isAllow
    }
    

    2.2 观看端点击连麦按钮

    2.2.1 判断是否有本地音视频权限

    进行音视频连麦需要判断本地是否有音视频权限,如果没有开启音视频权限,需要提示用户手动开启权限

    官方AVAuthorizationStatus状态枚举

    typedef NS_ENUM(NSInteger, AVAuthorizationStatus) {
        AVAuthorizationStatusNotDetermined = 0,//授权状态不确定
        AVAuthorizationStatusRestricted    = 1,//授权状态限制
        AVAuthorizationStatusDenied        = 2,//授权否认状态
        AVAuthorizationStatusAuthorized    = 3,//已经被授权
    } API_AVAILABLE(macos(10.14), ios(7.0)) __WATCHOS_PROHIBITED __TVOS_PROHIBITED;
    

    设置连麦视图时先分别判断是否有音频权限和视频权限。然后做一些界面上的修改

    判断当前音视频权限是否开启的API方法

    //AVCaptureDevice.h
    + (void)requestAccessForMediaType:(AVMediaType)mediaType completionHandler:(void (^)(BOOL granted))handler API_AVAILABLE(macos(10.14), ios(7.0));
    

    官方mediaType枚举

    // Media types
    typedef NSString * AVMediaType NS_EXTENSIBLE_STRING_ENUM;
    
    AVF_EXPORT AVMediaType const AVMediaTypeVideo                 NS_AVAILABLE(10_7, 4_0);
    AVF_EXPORT AVMediaType const AVMediaTypeAudio                 NS_AVAILABLE(10_7, 4_0);
    AVF_EXPORT AVMediaType const AVMediaTypeText                  NS_AVAILABLE(10_7, 4_0);
    AVF_EXPORT AVMediaType const AVMediaTypeClosedCaption         NS_AVAILABLE(10_7, 4_0);
    AVF_EXPORT AVMediaType const AVMediaTypeSubtitle              NS_AVAILABLE(10_7, 4_0);
    AVF_EXPORT AVMediaType const AVMediaTypeTimecode              NS_AVAILABLE(10_7, 4_0);
    AVF_EXPORT AVMediaType const AVMediaTypeMetadata              NS_AVAILABLE(10_8, 6_0);
    AVF_EXPORT AVMediaType const AVMediaTypeMuxed                 NS_AVAILABLE(10_7, 4_0);
    

    下列是demo中的部分代码示例

    //判断当前视频权限
    [AVCaptureDevice requestAccessForMediaType:AVMediaTypeVideo completionHandler:^(BOOL granted) {
       if (granted) {
            _videoType = 3;//视频权限已开启
        } else {
            _videoType = 2;//视频权限未开启
        }
    }];
    
    //判断当前音频权限
    [AVCaptureDevice requestAccessForMediaType:AVMediaTypeAudio completionHandler:^(BOOL granted) {
       if (granted) {
            _videoType = 3;//音频权限已开启
        } else {
            _videoType = 2;//音频权限未开启
        }
    }];
    

    当观看端想要进行连麦时,如果没有开启权限,可以设置界面提醒用户开启对应的权限。

    下列是点击跳转开启权限页面的方法

    // iOS10 之后, 比较特殊, 只能跳转到设置界面 , UIApplicationOpenSettingsURLString这个只支持iOS8之后.
        NSURL *url = [NSURL URLWithString:UIApplicationOpenSettingsURLString];
        if (@available(iOS 10.0, *)) {
            [[UIApplication sharedApplication] openURL:url options:@{} completionHandler:^(BOOL success) {
                // 还可以跳过success这个bool值进行更加精确的判断.
                //NSLog(@"跳转成功回调");
            }];
        } else {
            // Fallback on earlier versions
        }
    

    2.2.2 选择音频/视频连麦

    点击音频/视频连麦时,需要先调用1.9方法

    /**
     *  @brief 将要连接WebRTC
     */
    -(void)gotoConnectWebRTC;
    

    demo调用示例

    //是否是请求连麦
            _playerView.connectSpeak = ^(BOOL connect) {
                if (connect) {
                    NSLog(@"__lianmai 界面请求连麦");
                    [weakSelf.requestData gotoConnectWebRTC];
                }else{
                    NSLog(@"__lianmai 界面断开连麦");
                    [weakSelf.requestData disConnectSpeak];
                }
            };
    

    调用成功后,会接收到1.3回调方法。

    /*
     *  @brief 当前是否可以连麦
     */
    - (void)whetherOrNotConnectWebRTCNow:(BOOL)connect {
        NSLog(@"__lianmai %s", __func__);
        if (connect) {//如果可以连麦
            [_requestData requestAVMessageWithLocalView:nil isAudioVideo:YES];
        }
    }
    

    根据回调参数是否允许连麦,如果允许,调用1.7方法,传递想要进行音频/视频连麦的请求。YES为视频,NO为音频。

    2.3 主播端接收连麦请求

    观看端请求连麦后,主播端接收请求之后,会响应回调方法1.4。在接收到的参数中包含远程视图的videoSize,观看端需要处理这个videoSize,并设置连麦视图,设置完成之后调用方法1.8。

    /**
     *  @brief 主播端接受连麦请求,在此代理方法中,要调用DequestData对象的
     *  - (void)saveUserInfo:(NSDictionary *)dict remoteView:(UIView *)remoteView;方法
     *  把收到的字典参数和远程连麦页面的view传进来,这个view需要自己设置并发给SDK,SDK将要在这个view上进行渲染
     */
    - (void)acceptSpeak:(NSDictionary *)dict {
    
       //第一步: 根据dict的参数,设置远程连麦视图remoteView
       
       [self.playerView acceptSpeak:dict];
       
       //第二步: 如果是视频连麦:将远程连麦视图remoteView;
       //       如果是音频连麦:removtView传nil;
        NSLog(@"__lianmai %s", __func__);
        if(self.playerView.isAudioVideo) {
            NSLog(@"__lianmai 传递视频连麦");
            [_requestData saveUserInfo:dict remoteView:self.playerView.remoteView];
        } else {
            NSLog(@"__lianmai 传递音频连麦");
            [_requestData saveUserInfo:dict remoteView:nil];
        }
    }
    

    2.4 连麦连接成功

    当2.3完成之后,会响应回调方法1.2,此时需要进行一些界面上的修改。

    /*
     *  @brief WebRTC连接成功,在此代理方法中主要做一些界面的更改
     */
    - (void)connectWebRTCSuccess {
        NSLog(@"__lianmai %s", __func__);
        //此时连麦已经成功。
    }
    

    2.5 主讲挂断连麦

    连麦过程中,如果主讲挂断连麦,会响应方法1.5,此时需要做一些界面上的修改

    /*
     *  @brief 主播端发送断开连麦的消息,收到此消息后做断开连麦操作
     */
    -(void)speak_disconnect:(BOOL)isAllow {
        NSLog(@"__lianmai %s", __func__);
        //界面上需要进行一些处理
    }
    

    2.6 观看端取消申请连麦/挂断连麦

    正在申请过程中或者连麦中,观看端取消连麦申请和挂断连麦需要调用方法1.10。

    /**
     *  @brief 观看端主动断开连麦时候需要调用的接口
     */
    - (void)disConnectSpeak;
    

    demo调用示例

    //是否是请求连麦
            _playerView.connectSpeak = ^(BOOL connect) {
                if (connect) {
                    NSLog(@"__lianmai 界面请求连麦");
                    [weakSelf.requestData gotoConnectWebRTC];
                }else{
                    NSLog(@"__lianmai 界面断开连麦");
                    [weakSelf.requestData disConnectSpeak];
                }
            };
    

    此时会响应代理方法1.5。挂断连麦后需要进行一些界面上的修改。

    2.7 视频连麦过程中切换横竖屏和切换文档

    视频连麦过程中,有关视频位置变化时,需要即使的更新远程连麦视图的位置。此时需要调用方法1.6重新设置连麦视图的位置。

    /**
     *  @brief 设置远程连麦窗口的大小,连麦成功后调用才生效,连麦不成功调用不生效
     */
    -(void)setRemoteVideoFrameA:(CGRect)remoteVideoFrame;
    

    demo中部分调用示例

    
     //需要改变连麦视图时,回调视图的frame,调用-(void)setRemoteVideoFrameA:(CGRect)remoteVideoFrame;方法;
     
     
     //设置连麦视图
            _playerView.setRemoteView = ^(CGRect frame) {
                NSLog(@"__lianmai 界面设置连麦视图");
                [weakSelf.requestData setRemoteVideoFrameA:frame];
            };
    

    相关文章

      网友评论

        本文标题:集成CC视频sdk时关于连麦集成

        本文链接:https://www.haomeiwen.com/subject/dfayzqtx.html