5_2-手机开播场景-连麦推流
1 功能概述
推流與連麥模組是手機開播場景中的基礎功能,支援攝影機開關、攝影機前後置切換、麥克風開關功能,推流同時支援清晰度設定與攝影機鏡像的功能。推流可用於講師上課,連麥支援音訊連麥、視訊連麥可自由選擇,並支援多人連麥,豐富課堂內容。
推流流程:初始化推流引擎 -> 設定推流配置參數 -> 開始推流。
連麥流程:講師端發起連麥 -> 學員舉手申請連麥 -> 講師端允許學員連麥 -> 學員正式加入連麥。
2 實作介紹
2.1 PLVStreamerPresenter
此類別是手機開播場景中,針對推流與連麥進行封裝的推流管理器,支援旁路CDN推流、支援課程管理、支援RTC連麥、連麥用戶管理。
2.1.1 初始化方法
在 demo 專案 PLVLSStreamerViewController 中需對管理器進行初始化處理:
self.streamerPresenter = [[PLVStreamerPresenter alloc] init];
self.streamerPresenter.delegate = self;
self.streamerPresenter.previewType = PLVStreamerPresenterPreviewType_UserArray;
同時 PLVLSStreamerViewController 需遵循協定 PLVStreamerPresenterDelegate,並實作其中的代理方法。更多內容可參考 demo 專案中 PLVLSStreamerViewController 的示範。
2.1.2 設定預設配置
根據具體的業務場景可進行麥克風、攝影機、流屬性、混流佈局模式以及其他屬性的預設配置:
// 设置 麦克风、摄像头默认配置
// 仅在[prepareLocalPreviewCompletion:]方法调用前设置有效
self.streamerPresenter.micDefaultOpen = YES;// YES:麦克风默认开启 NO:麦克风默认关闭;默认值 NO
self.streamerPresenter.cameraDefaultOpen = YES;// YES:摄像头默认开启 NO:摄像头默认关闭;默认值 NO
self.streamerPresenter.cameraDefaultFront = YES;// YES:摄像头默认前置 NO:摄像头默认后置;默认值 后置
// 设置 流属性配置
[self.streamerPresenter setupStreamScale:PLVBLinkMicStreamScale16_9];
[self.streamerPresenter setupStreamQuality:PLVBLinkMicStreamQuality720P];
// 设置 混流配置
[self.streamerPresenter setupMixLayoutType:PLVRTCStreamerMixLayoutType_MainSpeaker];
2.1.3 推流畫面的預覽
以 demo 專案中 PLVLSStreamerViewController 示範為例,socket 登入成功回呼後加入 RTC 頻道:
#pragma mark - PLVSocketManager Protocol
- (void)socketMananger_didLoginSuccess:(NSString *)ackString { // 登录成功
// 登录成功
[self.streamerPresenter joinRTCChannel];
}
此時房間狀態發生改變,在下方範例的代理方法中設定本地畫面預覽的載體視圖:
#pragma mark - PLVStreamerPresenterDelegate
/// ‘房间加入状态’ 发生改变
- (void)plvStreamerPresenter:(PLVStreamerPresenter *)presenter currentRtcRoomJoinStatus:(PLVStreamerPresenterRoomJoinStatus)currentRtcRoomJoinStatus inRTCRoomChanged:(BOOL)inRTCRoomChanged inRTCRoom:(BOOL)inRTCRoom{
if (inRTCRoomChanged) {
if (inRTCRoom) {
[self preapareStartClass];
}
}
}
- (void)preapareStartClass {
__weak typeof(self) weakSelf = self;
[self.streamerPresenter prepareLocalPreviewCompletion:^(BOOL granted, BOOL prepareSuccess) {
if (prepareSuccess) {
[weakSelf.streamerPresenter setupLocalPreviewWithCanvaView:nil];
}
if (!granted) {
NSString *msg = [NSString stringWithFormat:@"需要获取您的音视频权限,请前往设置"];
[PLVAuthorizationManager showAlertWithTitle:@"提示" message:msg viewController:weakSelf];
}
}];
}
2.1.4 開始上課方法
PLVStreamerPresenter 的 startClass 方法是用於開始上課的方法,內部呼叫 startPushStream 方法。startPushStream 方法僅負責推流,而 startClass 方法將開始推流,且發送請求修改頻道狀態為「開始上課」。建議業務場景使用 startClass 方法。
在 demo 專案中 PLVLSStreamerViewController 示範了倒數計時結束時開始上課:
__weak typeof(self) weakSelf = self;
_coutBackView.countDownCompletedBlock = ^{
[weakSelf.streamerPresenter startClass];
};
2.1.5 結束上課方法
PLVStreamerPresenter 的 finishClass 方法是用於結束上課的方法,內部呼叫 stopPushStream 方法。startPushStream 方法僅停止推流,而 finishClass 方法停止推流,且發送請求修改頻道狀態為「結束上課」。建議業務場景使用 finishClass 方法:
[self.streamerPresenter finishClass];
2.1.6 允許用戶上麥
PLVStreamerPresenter 的 allowRemoteUserJoinLinkMic 方法是用於允許用戶上麥的方法:
/// 允许 某位远端用户 上麦
///
/// @param waitUser 远端用户等待连麦模型
/// @param emitCompleteBlock ‘允许 某位远端用户 上麦’的请求发送结果Block
- (void)allowRemoteUserJoinLinkMic:(PLVLinkMicWaitUser *)waitUser emitCompleteBlock:(nullable void (^)(BOOL emitSuccess))emitCompleteBlock;
在 PLVStreamerPresenter 的 addLinkMicWaitUserWithDict 內部方法中實現對用戶上麥。
當 RTC 房間在線用戶陣列發生改變時,會呼叫 PLVLSLinkMicAreaView 的 reloadLinkMicUserWindows 方法刷新連麥用戶的畫面:
/// ’RTC房间在线用户数组‘ 发生改变
- (void)plvStreamerPresenter:(PLVStreamerPresenter *)presenter linkMicOnlineUserListRefresh:(NSArray <PLVLinkMicOnlineUser *>*)onlineUserArray{
[self.linkMicAreaView reloadLinkMicUserWindows];
}
2.1.7 掛斷用戶連麥
PLVStreamerPresenter 的 closeAllLinkMicUser 方法是用於掛斷全部連麥用戶的方法:
[self.streamerPresenter closeAllLinkMicUser];
PLVStreamerPresenter 的 closeRemoteUserLinkMic 方法是用於掛斷某位遠端用戶的連麥的方法,在 PLVStreamerPresenter 內部使用,closeAllLinkMicUser 方法應用 closeRemoteUserLinkMic 方法實現掛斷全部連麥用戶的方法。
更多實作可參考 demo 專案中 PLVLSStreamerViewController。
2.2 PLVLSLinkMicAreaView
PLVLSLinkMicAreaView 用於承載 PLVStreamerPresenter 推流管理器提供的資料。
在 demo 專案中 PLVLSStreamerViewController 示範了如何新增 PLVLSLinkMicAreaView 控制項:
self.linkMicAreaView = [[PLVLSLinkMicAreaView alloc] init];
self.linkMicAreaView.delegate = self;
[self.view addSubview:self.linkMicAreaView];
同時 PLVLSStreamerViewController 需遵循協定 PLVLSLinkMicAreaViewDelegate,並實作以下代理方法:
@protocol PLVLSLinkMicAreaViewDelegate <NSObject>
/// 连麦窗口列表视图 需要获取当前用户数组
///
/// @param linkMicAreaView 连麦窗口列表视图
- (NSArray *)plvLSLinkMicWindowsViewGetCurrentUserModelArray:(PLVLSLinkMicAreaView *)linkMicAreaView;
/// 连麦窗口列表视图 需要查询某个条件用户的下标值
///
/// @param linkMicAreaView 连麦窗口列表视图
/// @param filtrateBlockBlock 筛选条件Block
- (NSInteger)plvLSLinkMicWindowsView:(PLVLSLinkMicAreaView *)linkMicAreaView findUserModelIndexWithFiltrateBlock:(BOOL(^)(PLVLinkMicOnlineUser * enumerateUser))filtrateBlockBlock;
/// 连麦窗口列表视图 需要根据下标值获取对应用户
///
/// @param linkMicAreaView 连麦窗口列表视图
/// @param targetIndex 目标下标值
- (PLVLinkMicOnlineUser *)plvLSLinkMicWindowsView:(PLVLSLinkMicAreaView *)linkMicAreaView getUserModelFromOnlineUserArrayWithIndex:(NSInteger)targetIndex;
@end
並在 -viewWillLayoutSubviews 方法中,對 PLVLSLinkMicAreaView 進行佈局:
self.linkMicAreaView.frame = CGRectMake(CGRectGetMaxX(self.documentAreaView.frame) + linkMicAreaViewLeftPadding, CGRectGetMaxY(self.statusAreaView.frame), linkMicAreaViewWidth, ducomentViewHeight);
上述內容的具體實作可在 demo 專案中 PLVLSStreamerViewController 找到。
