iOS音视频接入 - TRTC多人视频会议

时间:2022-07-26
本文章向大家介绍iOS音视频接入 - TRTC多人视频会议,主要内容包括其使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。

简介

多人在线视频会议指的是多人同时在网络上进行近距离的面对面的会议。

TRTC多人视频会议可提供的功能

  1. 单房间支持300人同时在线,50人同时开麦或开摄像头
  2. 屏幕分享
  3. 美颜
  4. 音频录制
  5. 视频多分辨率/帧率/码率选择
  6. 支持全体静音/静画及解除

可复用的官方Demo

官方SDK中提供了可复用的UI和封装了TRTCCloud的model,具体位置见下图。

多人视频会议官方Demo

Demo内UI文件夹内文件功能一览表,可根据自己实际的情况修改。

文件或文件夹

功能描述

SegmentVC

设置界面相关 UI 实现代码。

TRTCBroadcastExtensionLauncher.swift

录屏弹窗相关 UI 实现代码。

TRTCMeetingNewViewController

视频会议创建界面 UI 实现代码。

TRTCMeetingMainViewController

视频房间界面 UI 实现代码。

TRTCMeetingMemberViewController

成员列表界面 UI 实现代码。

TRTCMeetingMoreViewController

设置界面相关 UI 实现代码。

集成步骤

第一步:导入所需SDK

我们在实际开发中可使用官方的Demo复用TRTCMeeting组件(也就是model文件夹内的文件)。

pod 'TXIMSDK_iOS'
pod 'TXLiteAVSDK_TRTC'

第二步:配置隐私权限

向系统申请使用权限,在info.plist文件中添加一下两个key和对应的描述:

key

描述

Privacy - Camera Usage Description

App需要使用摄像头权限,开启后才会有视频画面

Privacy - Microphone Usage Description

App需要使用麦克风权限,开启后才会有语音信息

第三步:复用组件

将官方Demo中的model文件夹拖入自己的工程内部即可。如有头文件导入报错,请在工程内部的PCH文件导入所需SDK的头文件即可。

第四步:创建并登录组件

  1. 调用sharedInstance接口可以创建一个 TRTCMeeting 组件的实例对象。
  2. 调用setDelegate函数注册组件的事件通知。
  3. 调用login函数完成组件的登录,请参考下表填写关键参数:参数名作用sdkAppId您可以在 实时音视频控制台 中查看 SDKAppID。userId当前用户的 ID,字符串类型,只允许包含英文字母(a-z、A-Z)、数字(0-9)、连词符(-)和下划线(_)。userSig腾讯云设计的一种安全保护签名,获取方式请参考 如何计算 UserSig。callback登录回调,成功时 code 为0。

参数名

作用

sdkAppId

您可以在 实时音视频控制台 中查看 SDKAppID。

userId

当前用户的 ID,字符串类型,只允许包含英文字母(a-z、A-Z)、数字(0-9)、连词符(-)和下划线(_)。

userSig

腾讯云设计的一种安全保护签名,获取方式请参考 如何计算 UserSig。

callback

登录回调,成功时 code 为0。

    [[TRTCMeeting sharedInstance] login:SDKAPPID userId:userID userSig:userSig callback:^(NSInteger code, NSString *message) {
       
    }];

组件登录成功后,我们就可以开始创建多人会议了。

通过Demo查看多人会议实现过程

一、登录组件

1. TRTCMeeting组件的登录是在PortalViewController内实现,在跳转多人视频会议控制器前调用登录组件方法

- (void)gotoMeetingView {
    NSString *userID = [[ProfileManager shared] curUserID];
    NSString *userSig = [[ProfileManager shared] curUserSig];
    //初始话TRTC会议  传入APPID  用户ID 用户签名
    [[TRTCMeeting sharedInstance] login:SDKAPPID userId:userID userSig:userSig callback:^(NSInteger code, NSString *message) {
       
    }];
    TRTCMeetingNewViewController *vc = [[TRTCMeetingNewViewController alloc] init];
    [self.navigationController pushViewController:vc animated:YES];
}

2. 组件登录成功后,可以在相应的控制器内使用组件进行创建会议室

二、创建会议室

1. 房主在创建会议室前需要设置用户的头像、名称、设置音质、音量计算、开启麦克风和摄像头、开始音频采集、设置本地是否静音、设置美颜参数(需要美颜功能时)、设置本地画面镜像预览模式、本地音、视频推流。注意:只有企业版SDK支持变脸和贴图挂件功能。

// 设置音质(需要在startMicrophone前设置)
TRTCMeeting.sharedInstance().setAudioQuality(TRTCAudioQuality(rawValue: startConfig.audioQuality)!)
        
// 开启音量计算
TRTCMeeting.sharedInstance().enableAudioEvaluation(true)
        
// 开启摄像头和麦克风
if startConfig.isVideoOn {
    AppUtils.shared.alertUserTips(self)
    let localPreviewView = getRenderView(userId: selfUserId)!
    TRTCMeeting.sharedInstance().startCameraPreview(true, view: localPreviewView)
}
TRTCMeeting.sharedInstance().startMicrophone();
TRTCMeeting.sharedInstance().muteLocalAudio(!startConfig.isAudioOn)
        
// 使用默认的美颜参数
beautyPannel.resetAndApplyValues()
        
// 开启镜像
TRTCMeeting.sharedInstance().setLocalViewMirror(TRTCLocalVideoMirrorType.enable)

2. 在创建会议前要先设置好TRTCMeeting代理,以接收回调信息,TRTCMeeting详细API点这里,以后就可以开始创建房间

/**
 * 创建会议(房主调用)
 *
 * @param roomId 房间标识,需要由您分配并进行统一管理。
 * @param callback 创建房间的结果回调,成功时 code 为0.
 */
- (void)createMeeting:(UInt32)roomId callback:(TRTCMeetingCallback)callback;

3. 调用创建房间时,IM首先创建一个AVChatRoom的群组,在群组创建成功后,此时房主会以主播的角色进入房间,在进入房间前还需要设置视频编码信息

创建一个AVChatRoom的群组

    TIMCreateGroupInfo *groupInfomation = [[TIMCreateGroupInfo alloc] init];
    groupInfomation.groupType = @"ChatRoom";
    groupInfomation.groupName = roomInfo;
    groupInfomation.faceURL = coverUrl;
    groupInfomation.group = roomId;
    
    [V2TIMManager.sharedInstance createGroup:@"AVChatRoom" groupID:roomId groupName:roomInfo succ:^(NSString *groupID) {
        self.mIsEnterRoom = true;
        self.mRoomId = roomId;
        self.mOwnerUserId = self.mSelfUserId;
        
        if (callback) {
            callback(0, @"create room success.");
        }
        
    } fail:^(int code, NSString *desc) {
        
    }];

设置视频编码信息

    TRTCVideoEncParam *param = [[TRTCVideoEncParam alloc] init];
    param.videoResolution = _videoResolution;
    param.videoBitrate = _videoBitrate;
    param.videoFps = _videoFPS;
    param.resMode = TRTCVideoResolutionModePortrait;
    
    [[TRTCCloud sharedInstance] setVideoEncoderParam:param];

房主进房

    TRTCParams *params = [[TRTCParams alloc] init];
    params.sdkAppId = self.sdkAppId;
    params.userId = self.userId;
    params.roomId = self.roomId;
    params.userSig = self.userSig;
    params.role = TRTCRoleAnchor; // 主播角色
    params.streamId = self.streamId;
    
    [[TRTCCloud sharedInstance] enterRoom:params appScene:TRTCAppSceneLIVE];

具体过程可以归结为下图所示

主持端

此时房间已经创建好,等待参会人员进入。

三、加入会议室

1. 加入会议前也需要做一些与房主相同的设置工作,并且需要知道所加入会议的ID,在Demo中将创建和加入会议室的逻辑写在了一起,先去创建会议室,如果会议室创建失败就直接进入会议室。

    func createOrEnterMeeting() {
        TRTCMeeting.sharedInstance().delegate = self;
        
        let roomId = UInt32(startConfig.roomId)
        TRTCMeeting.sharedInstance().createMeeting(roomId) { (code, msg) in
            if code == 0 {
                // 创建房间成功
                self.view.makeToast("会议创建成功")
                return;
            }
            
            // 会议创建不成功,表示会议已经存在,那就直接进入会议
            TRTCMeeting.sharedInstance().enter(roomId) { (code, msg) in
                if code == 0{
                    self.view.makeToast("会议进入成功")
                } else {
                    self.view.makeToast("会议进入失败:" + msg!)
                }
            }
        }
    }

2. 在调用进入会议室方法后做了哪些操作呢? 首先,IM加入房主创建的AVChatRoom的群组,再加入成功后获取群组资料,其次,TRTC进房,参会人员同样以主播的角色进入房间。

加入AVChatRoom的群组并获取群资料

- (void)enterRoom:(NSString *)roomId callback:(TXCallback)callback {
    [V2TIMManager.sharedInstance joinGroup:roomId msg:@"" succ:^{
        NSArray *groupArray = [[NSArray alloc] initWithObjects:roomId, nil];
        [V2TIMManager.sharedInstance getGroupsInfo:groupArray succ:^(NSArray<V2TIMGroupInfoResult *> *groupResultList) {
            V2TIMGroupInfoResult *result = [groupResultList objectAtIndex:0];
            if (result) {
                self.mRoomId = roomId;
                self.mIsEnterRoom = true;
                self.mOwnerUserId = result.info.owner;
                
                if (callback) {
                    callback(0, @"enter room success.");
                }
            } else {
                if (callback) {
                    callback(-1, @"groupResultList is null");
                }
            }
            
        } fail:^(int code, NSString *desc) {
            if (callback) {
                callback(-1, [NSString stringWithFormat:@"getGroupsInfo error, enter room fail. code: %d msg:%@", code, desc]);
            }
        }];
        
    } fail:^(int code, NSString *desc) {
 
    }];
}

TRTC进房

    TRTCParams *params = [[TRTCParams alloc] init];
    params.sdkAppId = self.sdkAppId;
    params.userId = self.userId;
    params.roomId = self.roomId;
    params.userSig = self.userSig;
    params.role = TRTCRoleAnchor; // 主播角色
    params.streamId = self.streamId;
    
    [[TRTCCloud sharedInstance] enterRoom:params appScene:TRTCAppSceneLIVE];

参会人员流程实现

参会人员

在有参会人员进入会议室后,主持端TRTCMeeting会回调

- (void)onUserEnterRoom:(NSString *)userId;

在回调内部需要为该用户设置主持为全部人员设置的是否全体静音,并获取参会人员信息,

参会人员开启/关闭摄像头,会回调

- (void)onUserVideoAvailable:(NSString *)userId available:(BOOL)available;

可在此回调方法内部通过

/**
 * 播放远端视频画面
 *
 * @param userId 需要观看的用户id
 * @param view 承载视频画面的 view 控件
 * @param callback 操作回调
 * @note 在 onUserVideoAvailable 为 true 回调时,调用这个接口
 */
- (void)startRemoteView:(NSString *)userId view:(UIView *)view callback:(TRTCMeetingCallback)callback;

播放/停止远端视频画面。

参会人员开启/关闭麦克风,会回调

- (void)onUserAudioAvailable:(NSString *)userId available:(BOOL)available;

可在此回调方法内更新麦克风状态。

当有参会人员离开会议室时主持端会回调

- (void)onUserLeaveRoom:(NSString *)userId;

可在此方法内部处理用户离开的逻辑。

会议内部操作

切换摄像头

- (void)switchCamera:(BOOL)isFront;

开启本地静音

- (void)muteLocalAudio:(BOOL)mute;

扬声器切换

- (void)setSpeaker:(BOOL)useSpeaker;

打开/关闭摄像头

/**
 * 开启本地视频的预览画面
 *
 * @param isFront true:前置摄像头;false:后置摄像头。
 * @param view 承载视频画面的控件
 */
- (void)startCameraPreview:(BOOL)isFront view:(UIView *)view;

/**
 * 停止本地视频采集及预览
 */
- (void)stopCameraPreview;

静音会议室内某一个用户

/**
 * 静音某一个用户的声音
 *
 * @param userId 用户id
 * @param mute true:静音  false:解除静音
 */
- (void)muteRemoteAudio:(NSString *)userId mute:(BOOL)mute;

静音全部用户

获取会议室内所有用户,遍历调用静音某一个用户。

  for item in attendeeList {
      item.isMuteAudio = mute
      TRTCMeeting.sharedInstance().muteRemoteAudio(item.userId, mute: mute)
  }

禁画某个用户

调用之后该用户画面会定格在

/**
 * 屏蔽某个远程用户的视频
 *
 * @param userId 用户id
 * @param mute true:屏蔽  false:解除屏蔽
 */
- (void)muteRemoteVideoStream:(NSString *)userId mute:(BOOL)mute;

全体禁画

for item in attendeeList {
    item.isMuteVideo = mute
    TRTCMeeting.sharedInstance().muteRemoteVideoStream(item.userId, mute: mute)
}

屏幕分享

在屏幕分享前需要先关闭摄像头采集,并且要判断系统的版本是否在iOS11及以上。

// 屏幕分享时需要实现屏幕分享的代理方法等
let params = TRTCVideoEncParam()
//设置视频分辨率
params.videoResolution = TRTCVideoResolution._1280_720
//设置帧率
params.videoFps = 10
//设置码率
params.videoBitrate = 1800
//开始录屏
TRTCMeeting.sharedInstance().startScreenCapture(params)
//唤起屏幕分享
TRTCBroadcastExtensionLauncher.launch()

修改码率、分辨率、帧率

/**
 * 设置分辨率
 *
 * @param resolution 视频分辨率
 */
- (void)setVideoResolution:(TRTCVideoResolution)resolution;

/**
 * 设置帧率
 *
 * @param fps 帧率数
 */
- (void)setVideoFps:(int)fps;

/**
 * 设置码率
 *
 * @param bitrate 码率,单位:kbps
 */
- (void)setVideoBitrate:(int)bitrate;

建议的码率表

//此处仅定义横屏分辨率,如需使用竖屏分辨率(例如360 × 640),需要同时指定 TRTCVideoResolutionMode 为 Portrait。
    
// 宽高比1:1
    TRTCVideoResolution_120_120     = 1,    ///< [C] 建议码率 VideoCall:80kbps   LIVE:120kbps
    TRTCVideoResolution_160_160     = 3,    ///< [C] 建议码率 VideoCall:100kbps  LIVE:150kbps
    TRTCVideoResolution_270_270     = 5,    ///< [C] 建议码率 VideoCall:200kbps  LIVE:120kbps
    TRTCVideoResolution_480_480     = 7,    ///< [C] 建议码率 VideoCall:350kbps  LIVE:120kbps
    
    // 宽高比4:3
    TRTCVideoResolution_160_120     = 50,   ///< [C] 建议码率 VideoCall:100kbps  LIVE:150kbps
    TRTCVideoResolution_240_180     = 52,   ///< [C] 建议码率 VideoCall:150kbps  LIVE:225kbps
    TRTCVideoResolution_280_210     = 54,   ///< [C] 建议码率 VideoCall:200kbps  LIVE:300kbps
    TRTCVideoResolution_320_240     = 56,   ///< [C] 建议码率 VideoCall:250kbps  LIVE:375kbps
    TRTCVideoResolution_400_300     = 58,   ///< [C] 建议码率 VideoCall:300kbps  LIVE:450kbps
    TRTCVideoResolution_480_360     = 60,   ///< [C] 建议码率 VideoCall:400kbps  LIVE:600kbps
    TRTCVideoResolution_640_480     = 62,   ///< [C] 建议码率 VideoCall:600kbps  LIVE:900kbps
    TRTCVideoResolution_960_720     = 64,   ///< [C] 建议码率 VideoCall:1000kbps LIVE:1500kbps
    
    // 宽高比16:9
    TRTCVideoResolution_160_90      = 100,  ///< [C] 建议码率 VideoCall:150kbps  LIVE:250kbps
    TRTCVideoResolution_256_144     = 102,  ///< [C] 建议码率 VideoCall:200kbps  LIVE:300kbps
    TRTCVideoResolution_320_180     = 104,  ///< [C] 建议码率 VideoCall:250kbps  LIVE:400kbps
    TRTCVideoResolution_480_270     = 106,  ///< [C] 建议码率 VideoCall:350kbps  LIVE:550kbps
    TRTCVideoResolution_640_360     = 108,  ///< [C] 建议码率 VideoCall:550kbps  LIVE:900kbps
    TRTCVideoResolution_960_540     = 110,  ///< [C] 建议码率 VideoCall:850kbps  LIVE:1300kbps
    TRTCVideoResolution_1280_720    = 112,  ///< [C] 建议码率 VideoCall:1200kbps LIVE:1800kbps
    TRTCVideoResolution_1920_1080   = 114,  ///< [S] 建议码率 VideoCall:2000kbps LIVE:3000kbps

音频录制

/**
 * 开始录音
 *
 * 该方法调用后, SDK 会将通话过程中的所有音频(包括本地音频,远端音频,BGM 等)录制到一个文件里。
 * 无论是否进房,调用该接口都生效。
 * 如果调用 exitMeeting 时还在录音,录音会自动停止。
 * @param params 录音参数
 */
- (void)startFileDumping:(TRTCAudioRecordingParams *)params;

/**
 * 停止录音
 *
 * 如果调用 exitMeeting 时还在录音,录音会自动停止。
 */
- (void)stopFileDumping;

美颜

美颜功能可在TRTCCloud内获取单例使用,可根据自己的需求进行自定义UI界面或复用Demo内部的控件。

[[TRTCCloud sharedInstance] getBeautyManager];

具体的美颜API解释点这里

房主销毁会议

/**
 * 销毁会议(房主调用)
 *
 * 房主在创建会议房间后,可以调用这个函数来销毁房间。
 * @param roomId 房间标识,需要由您分配并进行统一管理。
 * @param callback 创建房间的结果回调,成功时 code 为0.
 */
- (void)destroyMeeting:(UInt32)roomId callback:(TRTCMeetingCallback)callback;

参会人员离开会议

/**
 * 离开会议(其他参会者调用)
 *
 * @param callback 结果回调,成功时 code 为0.
 */
- (void)leaveMeeting:(TRTCMeetingCallback)callback;

以上为多人会议流程及常用API,如有错误,欢迎指正!