CCSDK问题合集

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

2019-05-22  本文已影响0人  Clark_new

一 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];
        };
上一篇下一篇

猜你喜欢

热点阅读