3_5-云课堂场景-连麦
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 對其進行輕度修改或模仿重寫以實作業務場景。
PLVLCLinkMicControlBar 在 PLVLCLinkMicAreaView 中初始化,由連麥懸浮控制條的點擊事件以及重新整理連麥控制條的 UI 狀態。主要邏輯集中在動畫、點擊事件響應,以及橫豎屏兩套 UI 保持同步。
3.2.1 初始化方法
PLVLCLinkMicLandscapeControlBar 和 PLVLCLinkMicPortraitControlBar 分別是連麥懸浮控制條 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 的演示。
