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

一 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];
        };
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 151,688评论 1 330
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 64,559评论 1 273
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 101,749评论 0 226
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 42,581评论 0 191
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 50,741评论 3 271
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 39,684评论 1 192
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,122评论 2 292
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 29,847评论 0 182
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 33,441评论 0 228
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 29,939评论 2 232
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 31,333评论 1 242
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 27,783评论 2 236
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 32,275评论 3 220
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 25,830评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,444评论 0 180
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 34,553评论 2 249
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 34,618评论 2 249

推荐阅读更多精彩内容

  • 点击查看原文 Web SDK 开发手册 SDK 概述 网易云信 SDK 为 Web 应用提供一个完善的 IM 系统...
    layjoy阅读 13,232评论 0 15
  • Swift1> Swift和OC的区别1.1> Swift没有地址/指针的概念1.2> 泛型1.3> 类型严谨 对...
    cosWriter阅读 11,028评论 1 32
  • 2017.02.22 可以练习,每当这个时候,脑袋就犯困,我这脑袋真是神奇呀,一说让你做事情,你就犯困,你可不要太...
    Carden阅读 1,244评论 0 1
  • 2017年10月23日 星期一 晴 秋天是个瓜果飘香的季节。 又大又红的苹果挂在树上,像盏盏红灯笼,美...
    黄浚铠阅读 414评论 0 3
  • 1.启动Instruments中的Leaks选项 2.选择好真机或者模拟器,找到需要检测的app后,点击 小红点 ...
    YannChee阅读 7,225评论 4 18