一 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];
};
网友评论