保利威文档中心

幫助中心

3_5-云课堂场景-连麦

更新時間:2023-04-17 15:27:57

1 功能概述

保利威雲課堂 SDK 支援連麥功能,可自由選擇舉手連麥、音訊連麥、視訊連麥,並支援多人連麥,豐富課堂內容。

連麥流程:講師端發起連麥 -> 學員舉手申請連麥 -> 講師端允許學員連麥 -> 學員正式加入連麥。

2 使用演示

在 Demo 專案中 PLVLCCloudClassViewController 演示了如何建立連麥佈局,以及如何呼叫初始化方法。

self.linkMicAreaView = [[PLVLCLinkMicAreaView alloc] init];
self.linkMicAreaView.delegate = self;

其中 PLVLCLinkMicAreaView 負責管理 PLVLinkMicPresenter 連麥管理器、PLVLCLinkMicControlBar 連麥懸浮控制列以及 PLVLCLinkMicWindowsView 連麥視窗列表檢視。因此可將 PLVLCLinkMicAreaView 作為連麥模組整合使用。

同時 PLVLCCloudClassViewController 需遵循協定 PLVLCLinkMicAreaViewDelegate。該協定提供第一畫面切換回呼、連麥狀態變更回呼等相關回呼,用於檢視的更新與切換。該協定提供以下代理方法:

@protocol PLVLCLinkMicAreaViewDelegate <NSObject>

/// RTC画面窗口 需外部展示 ‘第一画面连麦窗口’
///
/// @param linkMicAreaView 连麦区域视图
/// @param canvasView 第一画面连麦窗口视图 (需外部进行添加展示)
- (void)plvLCLinkMicAreaView:(PLVLCLinkMicAreaView *)linkMicAreaView showFirstSiteCanvasViewOnExternal:(UIView *)canvasView;

/// RTC画面窗口被点击 (表示用户希望视图位置交换)
///
/// @note 当接收到此回调时,表示用户希望 某个Rtc画布视图(即canvasView) 在外部位置中显示,可对 canvasView 作相应布局处理
///
/// @param linkMicAreaView 连麦区域视图
/// @param canvasView Rtc画布视图
- (UIView *)plvLCLinkMicAreaView:(PLVLCLinkMicAreaView *)linkMicAreaView rtcWindowDidClickedCanvasView:(UIView *)canvasView;

/// 恢复外部视图位置
///
/// @note 当外部视图需要回归原位时,此回调将被触发;接收到此回调后,可将 externalView 重新布局在原位上
///
/// @param linkMicAreaView 连麦区域视图
/// @param externalView 被添加在连麦区域视图上的外部视图
- (void)plvLCLinkMicAreaView:(PLVLCLinkMicAreaView *)linkMicAreaView rollbackExternalView:(UIView *)externalView;

/// ‘是否在RTC房间中’ 状态值发生改变
///
/// @param linkMicAreaView 连麦区域视图
/// @param inRTCRoom 当前 是否在RTC房间中
- (void)plvLCLinkMicAreaView:(PLVLCLinkMicAreaView *)linkMicAreaView inRTCRoomChanged:(BOOL)inRTCRoom;

/// ‘RTC房间在线用户数’ 发生改变
///
/// @param linkMicAreaView 连麦区域视图
/// @param currentRTCRoomUserCount 当前 RTC房间在线用户数
- (void)plvLCLinkMicAreaView:(PLVLCLinkMicAreaView *)linkMicAreaView currentRTCRoomUserCountChanged:(NSInteger)currentRTCRoomUserCount;

/// ‘是否正在连麦’ 状态值改变
///
/// @param linkMicAreaView 连麦区域视图
/// @param inLinkMic 当前是否正在连麦 (YES:正在连麦中 NO:不在连麦中)
- (void)plvLCLinkMicAreaView:(PLVLCLinkMicAreaView *)linkMicAreaView inLinkMicChanged:(BOOL)inLinkMic;

/// 需获知 ‘当前频道是否直播中’
///
/// @note 此回调不保证在主线程触发
///
/// @param linkMicAreaView 连麦区域视图
- (BOOL)plvLCLinkMicAreaViewGetChannelInLive:(PLVLCLinkMicAreaView *)linkMicAreaView;

/// 需获知 ‘主讲的PPT 当前是否在主屏’
///
/// @note 此回调不保证在主线程触发
///
/// @param linkMicAreaView 连麦区域视图
- (BOOL)plvLCLinkMicAreaViewGetMainSpeakerPPTOnMain:(PLVLCLinkMicAreaView *)linkMicAreaView;

@end

並在 -viewWillLayoutSubviews 方法中,對 PLVLCLinkMicAreaView 進行佈局,具體可參考 Demo 專案中 PLVLCCloudClassViewController 的實作。

3 實作介紹

3.1 PLVLinkMicPresenter

PLVLinkMicPresenter 連麥管理器在 Demo 專案中已由 PLVLCLinkMicAreaView 進行管理,可查看以下說明,了解如何自行使用 PLVLinkMicPresenter

連麥功能模組採用 MVP 模式,因此在實作時需先初始化 Presenter。

self.presenter = [[PLVLinkMicPresenter alloc] init];

self.presenter.delegate = self;

self.presenter.preRenderContainer = self;

同時需要設定預設值,以連麥懸浮控制列中宣告的為準,詳見 Demo 專案中 PLVLCLinkMicControlBarProtocol.h。若業務改變時,可直接修改 PLVLCLinkMicControlBarProtocol.h 的預設值,則連麥管理器會同時生效。

self.presenter.micDefaultOpen = PLVLCLinkMicControlBarMicDefaultOpen;

self.presenter.cameraDefaultOpen = PLVLCLinkMicControlBarCameraDefaultOpen;

self.presenter.cameraDefaultFront = PLVLCLinkMicControlBarSwitchCameraDefaultFront;

同時使用 PLVLinkMicPresenter 可遵循協定 PLVLinkMicPresenterDelegate,並依需求實作其中的代理方法。更多內容可參考 Demo 專案中 PLVLCLinkMicAreaView 的演示。

3.2 PLVLCLinkMicControlBar

PLVLCLinkMicControlBar 連麥懸浮控制列在 Demo 專案中已由 PLVLCLinkMicAreaView 進行管理,可查看以下說明,了解如何自行使用 PLVLCLinkMicControlBar 對其進行輕度修改或模仿重寫以實作業務場景。

PLVLCLinkMicControlBarPLVLCLinkMicAreaView 中初始化,由連麥懸浮控制條的點擊事件以及重新整理連麥控制條的 UI 狀態。主要邏輯集中在動畫、點擊事件響應,以及橫豎屏兩套 UI 保持同步。

3.2.1 初始化方法

PLVLCLinkMicLandscapeControlBarPLVLCLinkMicPortraitControlBar 分別是連麥懸浮控制條 PLVLCLinkMicControlBar 的豎屏和橫屏實作。

_portraitControlBar = [[PLVLCLinkMicPortraitControlBar alloc] init];
_portraitControlBar.delegate = self;
_landscapeControlBar = [[PLVLCLinkMicLandscapeControlBar alloc] init];
_landscapeControlBar.delegate = self;

PLVLCLinkMicControlBarProtocol 是連麥控制列物件抽象協定,在 PLVLCLinkMicAreaView 中用於控制當前連麥懸浮控制列 currentControlBar。實作 [setCurrentControlBar] 可參考 Demo 專案中 PLVLCLinkMicAreaView 的演示。

 self.currentControlBar = self.landscapeControlBar; //设置当前悬浮控制条为竖屏样式

PLVLCCloudClassViewController 的適當時機中需要插入 currentControlBar,具體實作可參考 Demo 專案中 PLVLCCloudClassViewController 的演示。

3.2.2 PLVLCLinkMicControlBarDelegate

PLVLCLinkMicAreaView 需遵循協定 PLVLCLinkMicControlBarDelegate,並實作其中的代理方法。以連麥開關按鈕被點擊為例,透過不同狀態呼叫 PLVLinkMicPresenter 的申請連麥、取消申請連麥、退出連麥:

- (void)plvLCLinkMicControlBar:(id<PLVLCLinkMicControlBarProtocol>)bar onOffButtonClickedCurrentStatus:(PLVLCLinkMicControlBarStatus)status{
    __weak typeof(self) weakSelf = self;
    if (status == PLVLCLinkMicControlBarStatus_Open) {
        // Bar 处于显示 ‘申请连麦’,点击表示希望申请连麦
        [self.presenter requestJoinLinkMic];
    }else if (status == PLVLCLinkMicControlBarStatus_Waiting){
        // Bar 处于显示 ‘请求中...’,点击表示希望取消申请连麦
        [PLVFdUtil showAlertWithTitle:@"确认取消申请连麦吗?" message:nil viewController:[PLVFdUtil getCurrentViewController] cancelActionTitle:@"按错了" cancelActionStyle:UIAlertActionStyleDefault cancelActionBlock:nil confirmActionTitle:@"取消申请连麦" confirmActionStyle:UIAlertActionStyleDestructive confirmActionBlock:^(UIAlertAction * _Nonnull action) {
            [weakSelf.presenter cancelRequestJoinLinkMic];
        }];
    }else if (status == PLVLCLinkMicControlBarStatus_Joined){
        // Bar 处于已连麦,点击表示希望取消申请连麦
        [PLVFdUtil showAlertWithTitle:@"确认挂断连麦吗?" message:nil viewController:[PLVFdUtil getCurrentViewController] cancelActionTitle:@"按错了" cancelActionStyle:UIAlertActionStyleDefault cancelActionBlock:nil confirmActionTitle:@"挂断" confirmActionStyle:UIAlertActionStyleDestructive confirmActionBlock:^(UIAlertAction * _Nonnull action) {
            [weakSelf.presenter leaveLinkMic];
        }];
    }
}

更多內容可參考 Demo 專案中 PLVLCLinkMicAreaView 的演示。

3.3 PLVLCLinkMicWindowsView

PLVLCLinkMicWindowsView 是連麥功能模組的主體,負責展示多個連麥成員的 RTC 畫面視窗,該視圖支援左右滑動瀏覽。初始化方法參考如下:

_windowsView = [[PLVLCLinkMicWindowsView alloc] init];
_windowsView.delegate = self;

同時 PLVLCLinkMicAreaView 需遵循協定 PLVLCLinkMicWindowsViewDelegate,並實作其中的代理方法,與 PLVLinkMicPresenter 連麥管理器進行資料交換。示例如下:

#pragma mark PLVLCLinkMicWindowsViewDelegate
/// 连麦窗口列表视图 需获知 ‘当前频道连麦场景类型’
- (PLVChannelLinkMicSceneType)plvLCLinkMicWindowsViewGetCurrentLinkMicSceneType:(PLVLCLinkMicWindowsView *)windowsView{
    return self.presenter.linkMicSceneType;//获取连麦管理当前频道连麦场景类型
}
/// 连麦窗口被点击事件 (表示用户希望某个窗口成为‘第一画面’)
- (void)plvLCLinkMicWindowsView:(PLVLCLinkMicWindowsView *)windowsView linkMicUserWantToBecomeFirstSite:(NSInteger)index{
    [self.presenter changeMainSpeakerInLocalWithLinkMicUserIndex:index];//连麦管理器请求变更‘第一画面’
}

/// 连麦窗口列表视图 需要获取当前用户数组
- (NSArray *)plvLCLinkMicWindowsViewGetCurrentUserModelArray:(PLVLCLinkMicWindowsView *)windowsView{
    return self.presenter.onlineUserArray;//获取连麦管理器当前RTC房间在线用户数组
}

更多內容可參考 Demo 專案中 PLVLCLinkMicAreaView 的演示。

联系客服,在线咨询