anyRTC Zoom模式多人音视频开发教程-iOS [附源码]

栏目: IOS · 发布时间: 6年前

内容简介:应广大开发者要求,写一下用anyRTC多人视频sdk来模仿zoom多人视频样式,以下开始正文:anyRTC多人音视频sdk提供了4中模式,其中一种模式为zoom模式,我们只需要在进会之前设置该种模式即可。

应广大开发者要求,写一下用anyRTC多人视频sdk来模仿zoom多人视频样式,以下开始正文:

GitHub地址

github.com/BoYuanZjq/Z…

anyRTC多人音视频sdk提供了4中模式,其中一种模式为zoom模式,我们只需要在进会之前设置该种模式即可。

anyRTC SDK集成

集成sdk,是作为一名合格的开发人员必备的技能,根据官方集成文档集成即可。

1. pod集成

pod 'RTMeetEngine'
复制代码

2. 添加必要权限

在Info.plist中添加如下权限

<key>NSCameraUsageDescription</key>
<string>项目需要访问视频</string>
<key>NSMicrophoneUsageDescription</key>
<string>项目需要访问音频</string>
复制代码

3. 打开音频可后台运行TARGETS->Capabilities->Background Modes->选中Audio,AirPlay,and Picture in Picture

anyRTC Zoom模式多人音视频开发教程-iOS [附源码]

4. 配置开发者信息

在AppDelegate.h文件中把相应的开发者信息替换一下, 配置项在官网创建应用中可查看

static NSString *developerID = @"xxx";
static NSString *token = @"xxx";
static NSString *key = @"xxx";
static NSString *appID = @"xxx";
复制代码

然后在AppDelegate.m中调用配置方法即可

[AnyRTCMeetEngine initEngineWithAnyRTCInfo:developerID andAppId:appID andKey:key andToke:token];
复制代码

至此,anyRTC SDK集成已经完毕,似不似如丝般顺滑?接下来我们就可以愉快地和SDK玩耍了。

主页面

anyRTC Zoom模式多人音视频开发教程-iOS [附源码]

在主界面,我们需要检查先Camera和Audio权限。

//授权相机
- (void)videoAuthAction
{
    [AVCaptureDevice requestAccessForMediaType:AVMediaTypeVideo completionHandler:^(BOOL granted) {
        NSLog(@"%@",granted ? @"相机准许":@"相机不准许");
    }];
}

//授权麦克风
- (void)audioAuthAction
{
    [AVCaptureDevice requestAccessForMediaType:AVMediaTypeAudio completionHandler:^(BOOL granted) {
        NSLog(@"%@",granted ? @"麦克风准许":@"麦克风不准许");
    }];
}
复制代码

zoom多人视频页面

主页面输入会议号,点击加入会议

zoom模式简介

zoom多人视频模式,是解决手机上同时渲染多路性能的问题而生,其中分为三种场景

  1. 驾驶模式:只接收音频,不发送音视频,发送音频,根据客户自己选择。
  2. 说话者模式:该模式,只显示自己和当前正在说话的人,也可以选中一个人员,进行双人锁定通信。
  3. 分屏模式:该模式每屏显示4个图像,包括自己,分屏显示所有人。

该模式适合1~32人的大型音视频会议,有效的解决了在服务器不合流的情况下手机性能问题。

初始化RTMeetKit

- (void)initMeetKit {
    RTMeetOption *option = [RTMeetOption defaultOption];
    option.videoScreenOrientation =  RTC_SCRN_Auto;
    option.videoMode = AnyRTCVideoQuality_Low2;
    option.maxNum = 64;
    // 设置zoom 模式
    option.meetingType = AnyMeetingTypeZoom;
    self.meetKit = [[RTMeetKit alloc] initWithDelegate:self andOption:option];
    // 自己平台用户Id
    NSString *userID = [NSString stringWithFormat:@"%d",arc4random()%10];
    //加入房间
    [self.meetKit joinRTC:self.meetId andIsHoster:NO andUserId:userID andUserData:@"{}"];
    //打开网络检测
    [self.meetKit setNetworkStatus:YES];
    //打开音频检测(有人说话的音量大小)
    [self.meetKit setAudioActiveCheck:YES];
}
复制代码

加入会议成功的回调中设置zoom的说话者模式

- (void)onRTCJoinMeetOK:(NSString*)strAnyRTCId {
    //预览自己的视频窗口
    [self.meetKit setLocalVideoCapturer:self.videoLayoutView.myVideoView];
    //设置zoom的说话者模式
    [self.meetKit setZoomModel:AnyZoomTypeSingle];
}
复制代码

有人进入会议或者离开会议中把相关人员记录或者删除

// 有人进来
-(void)onRTCOpenVideoRender:(NSString*)strRTCPeerId withRTCPubId:(NSString *)strRTCPubId withUserId:(NSString*)strUserId withUserData:(NSString*)strUserData {
    ZMVideoView *view = [[ZMVideoView alloc] init];
    view.peerId = strRTCPeerId;
    view.pubId = strRTCPubId;
    view.userId = strUserId;
    __weak typeof(self)weakSelf = self;
    view.tapEvent = ^() {
        if (weakSelf.zoomType==AnyZoomTypeSingle) {
            weakSelf.videoLayoutView.myVideoView.isBig = NO;
        }
        // 刷新布局
        [weakSelf.videoLayoutView layout];
    };
    //本地自己的strRTCPeerId 都为RTCMainParticipanter
    if (![strRTCPeerId isEqualToString:@"RTCMainParticipanter"]) {
        [self.meetKit setRTCVideoRender:strRTCPubId andRender:view.videoView];
    }
    [self.videoLayoutView.remoteArray addObject:view];
}
// 有人离开
-(void)onRTCCloseVideoRender:(NSString*)strRTCPeerId withRTCPubId:(NSString *)strRTCPubId withUserId:(NSString*)strUserId {
    for (ZMVideoView *view in self.videoLayoutView.remoteArray) {
        if ([view.peerId isEqualToString:strRTCPeerId]) {
            [view removeFromSuperview];
            [self.videoLayoutView.remoteArray removeObject:view];
            break;
        }
    }
}
复制代码

zoom模式有人来或者离开后的统计信息,我们可以在该信息中对页面布局做调整,比如增加一页,或者删除一页,具体可以看代码实现

- (void)onRTCZoomPageInfo:(AnyZoomType)nZoomType allPage:(int)nAllPage currentPage:(int)nCurrentPage allRenderNum:(int)nAllRenderNum beginIndex:(int)nIndex showNum:(int)nShowNum {
  // 对页面做变化布局
}
复制代码

不同模式需要的操作

- (void)changeZoomModel:(int)index {
    switch (index) {
        case 0:
        {
            //驾驶模式
            [self.meetKit setZoomModel:AnyZoomTypeDriver];
            //禁止传输视频,此时可以说话,只拉去音频
            [self.meetKit setLocalVideoEnable:NO];
        }
            break;
        case 1:
        {
            // 单显示模式(本地视频打开)
            [self.meetKit setLocalVideoEnable:YES];
            // 设置单显模式
            [self.meetKit setZoomModel:AnyZoomTypeSingle];
        }
            break;
        default:
        {
            // 设置分屏显示
            if (self.zoomType != AnyZoomTypeNomal) {
                [self.meetKit setZoomModel:AnyZoomTypeNomal];
            }
            [self.meetKit setLocalVideoEnable:YES];
            // 设置页码
            [self.meetKit setZoomPage:index-2];
        }
            break;
    }
}
复制代码

驾驶模式

驾驶模式根据自己需求是否把自己的音频禁用,可以点击说话的时候打开禁用,取消说话的时候,打开关闭禁用

[self.meetKit setLocalAudioEnable:NO];
复制代码
anyRTC Zoom模式多人音视频开发教程-iOS [附源码]

说话者模式

说话者模式是自己和当前说话的人显示,如果当前会议只有自己一个人,全屏显示自己的图像,本地图像以及远程图像大小,自己布局决定。

anyRTC Zoom模式多人音视频开发教程-iOS [附源码]

点击小屏幕可以进行大小屏切换。大小屏布局代码如下:

//说话者模式布局代码
            UIView *singView = [self.viewsArray objectAtIndex:1];
            if (self.remoteArray.count==0) {
                if (self.myVideoView.superview) {
                    [self.myVideoView removeFromSuperview];
                }
                self.myVideoView.frame = self.frame;
                [singView addSubview:self.myVideoView];
            }else{
                CGFloat X = CGRectGetWidth(self.frame) -90 -10;
                CGFloat Y = CGRectGetHeight(self.frame)-120 -10;
                CGFloat width = 90;
                CGFloat height = 120;
                ZMVideoView *otherView = [self.remoteArray firstObject];
                if (otherView.superview) {
                    [otherView removeFromSuperview];
                }
                if (self.myVideoView.superview) {
                    [self.myVideoView removeFromSuperview];
                }
                if (!self.myVideoView.isBig) {
                    otherView.frame = self.frame;
                    [singView addSubview:otherView];
                    [singView sendSubviewToBack:otherView];
                    
                    self.myVideoView.frame = CGRectMake(X, Y, width, height);
                    [singView addSubview:self.myVideoView];
                }else{
                    self.myVideoView.frame = self.frame;
                    [singView addSubview:self.myVideoView];
                    [singView sendSubviewToBack:self.myVideoView];
                    
                    otherView.frame = CGRectMake(X, Y, width, height);
                    [singView addSubview:otherView];
                }          
复制代码

分屏显示分屏显示每屏第一个视频都为自己,切换到当前模式下的时候,布局的视图,全有有人来了的回调里存储进行布局即可。

anyRTC Zoom模式多人音视频开发教程-iOS [附源码]

布局代码如下,三分屏幕或者4分屏

// 平分显示
            CGFloat width = CGRectGetWidth(self.frame)/2;
            CGFloat height = width*4/3;
            CGFloat X = 0;
            CGFloat Y =(CGRectGetHeight(self.frame)-2*height)/2;
            UIView *singView = [self.viewsArray objectAtIndex:self.viewIndex];
            for (int i=0;i<self.remoteArray.count;i++ ) {
                
                ZMVideoView *view = [self.remoteArray objectAtIndex:i];
                if (view.superview) {
                    [view removeFromSuperview];
                }
                // 自己本地的视图
                if ([view.peerId isEqualToString:@"RTCMainParticipanter"]) {
                    if (self.myVideoView.superview) {
                        [self.myVideoView removeFromSuperview];
                    }
                    [singView addSubview:self.myVideoView];
                    self.myVideoView.frame = CGRectMake(X, Y, width, height);
                    if ((i+1)%2==0) {
                        X = 0;
                        Y+=height;
                    }else{
                        X = X+width;
                    }
                }else{
                    [singView addSubview:view];
                    view.frame = CGRectMake(X, Y, width, height);
                    if ((i+1)%2==0) {
                        X = 0;
                        Y+=height;
                    }else{
                        X = X+width;
                    }
                }
            }
复制代码

挂断离开

- (void)closeButtonEvent:(UIButton*)sender {
    //离开频道,释放资源
    [self.meetKit leaveRTC];
    [self dismissViewControllerAnimated:YES completion:nil];
}
复制代码

总结

上述即为zoom多人模式多人布局的写法,大致步骤我做下总结

  1. 初始化引擎之前,在Controller中添加一个UIScrollView,并添加两个视图,第一个为驾驶模式页面,另外一个是说话者模式页面。

  2. join成功之后,需要设置调用如下方法,设置为AnyZoomTypeSingle模式。

- (BOOL)setZoomModel:(AnyZoomType)eType;
复制代码
  1. 等待onRTCZoomPageInfo 信息回调,我们根据该回调进行页面显示和布局。

其中还有一些方法,比如禁用自己的音频和视频,摄像头翻转,镜像开关,扬声器开关等等一些接口,根据自己的需要添加即可。


以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持 码农网

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

Web Security Testing Cookbook

Web Security Testing Cookbook

Paco Hope、Ben Walther / O'Reilly Media / 2008-10-24 / USD 39.99

Among the tests you perform on web applications, security testing is perhaps the most important, yet it's often the most neglected. The recipes in the Web Security Testing Cookbook demonstrate how dev......一起来看看 《Web Security Testing Cookbook》 这本书的介绍吧!

JSON 在线解析
JSON 在线解析

在线 JSON 格式化工具

HTML 编码/解码
HTML 编码/解码

HTML 编码/解码

SHA 加密
SHA 加密

SHA 加密工具