开启和关闭屏幕共享
本文介绍在加入连麦之后如何开启和关闭屏幕共享。
说明
iOS端集成屏幕共享流程示例
iOS端集成屏幕共享功能需要进行前期准备工作,分为两个步骤,分别是依赖库集成和Extension端API调用。
前期准备步骤一:依赖库集成
创建新的Extension Target,选择“File->New->Target->Broadcast Upload Extension”,创建Extension Target。
输入Product Name可以不勾选Include UI Extension。项目中会自动创建下图目录和文件。
将下载到的 SDK 中的 AliScreenShare.framework 拖动到刚才创建的插件工程中,勾选刚创建的 Target。
进行以下操作添加App Groups,注意完成后需要重新下载对应的 Provisioning Profile(Xcode会自动下载)。
给插件和宿主app添加App Groups:选择“TARGET->Signing&Capabilities->Capability->选中App Groups->勾选选中框”。
App Groups添加完成效果如下所示:
宿主app添加效果
插件添加效果
注意插件的deployment Info中的target需要设置适当的版本(可与宿主app的相同)。
插件的Bundle Identifier和主app的Bundle Identifier匹配,并且需要宿主app的前缀。比如宿主app叫com.xxx,那么插件可以叫com.xxx.screenshare
前期准备步骤二:Extension端API调用
配置屏幕共享代码,在Extensions 的SampleHandler.m文件中添加如下代码,并修改其中的kAppGroup参数:
#import "SampleHandler.h"
#import <AliScreenShare/AliScreenShareExt.h>
static NSString * _Nonnull kAppGroup = @"YOUR APPGROUP"; // 屏幕共享主app和插件的AppGroup
@interface SampleHandler() <AliScreenShareExtDelegate>
@end
@implementation SampleHandler
- (void)broadcastStartedWithSetupInfo:(NSDictionary<NSString *,NSObject *> *)setupInfo {
// User has requested to start the broadcast. Setup info from the UI extension can be supplied but optional.
NSLog(@"SampleHandler SEND broadcastStartedWithSetupInfo");
[[AliScreenShareExt sharedInstance] setupWithAppGroup:kAppGroup delegate:self];
}
- (void)broadcastPaused {
// User has requested to pause the broadcast. Samples will stop being delivered.
NSLog(@"SampleHandler SEND broadcastPaused");
}
- (void)broadcastResumed {
// User has requested to resume the broadcast. Samples delivery will resume.
NSLog(@"SampleHandler SEND broadcastResumed");
}
- (void)broadcastFinished {
// User has requested to finish the broadcast.
NSLog(@"SampleHandler SEND broadcastFinished");
[[AliScreenShareExt sharedInstance] finishBroadcast:^{
}];
}
#pragma mark - AliScreenShareExtDelegate
- (void)broadcastFinished:(AliScreenShareExt *)broadcast error:(NSError *)error
{
[self finishBroadcastWithError:error];
}
- (void)processSampleBuffer:(CMSampleBufferRef)sampleBuffer withType:(RPSampleBufferType)sampleBufferType {
switch (sampleBufferType) {
case RPSampleBufferTypeVideo:
// Handle video sample buffer
@autoreleasepool {
[[AliScreenShareExt sharedInstance] sendSampleBuffer:sampleBuffer type:sampleBufferType];
}
break;
case RPSampleBufferTypeAudioApp:
// Handle audio sample buffer for app audio
break;
case RPSampleBufferTypeAudioMic:
// Handle audio sample buffer for mic audio
break;
default:
break;
}
}
@end
iOS端开启屏幕共享
前面的准备工作完成之后,可以开启屏幕共享。对接主 App 端的接收逻辑,也就是在用户触发屏幕分享之前,要让主 App 处于“等待”状态,以便随时接收来自 Broadcast Upload Extension 进程的录屏数据。开启屏幕共享分为两步,如下所示。
通过调用startScreenShare接口开启屏幕流通道。
// 开启屏幕共享 // 插件和宿主app约定使用相同的appGroup id<AIRBRoomChannelProtocol> room = [[AIRBRoomEngine sharedInstance] getRoomChannelWithRoomID:@"xxx"] [room.rtc startScreenShare:(NSString*)appGroup];
用户在 iOS 系统的控制中心,通过长按录屏按钮来触发,这一操作步骤如下图所示:
注意苹果在 iOS 12.0 中增加了 RPSystemBroadcastPickerView 可以从应用中弹出启动器供用户确认启动屏幕分享,到目前为止, RPSystemBroadcastPickerView 尚不支持自定义界面,也没有官方的唤起方法。因此用户可以遍历 RPSystemBroadcastPickerView 的子 View 寻找 UIButton 并触发了其点击事件。但该方案不被苹果官方推荐,并可能在新一轮的系统更新中失效,因此只是一个可选方案,您需要自行承担风险来选用此方案。
iOS端关闭屏幕共享
通过调用stopScreenShare接口可以随时关闭屏幕分享。
// 关闭屏幕共享 // 插件和宿主app约定使用相同的appGroup id<AIRBRoomChannelProtocol> room = [[AIRBRoomEngine sharedInstance] getRoomChannelWithRoomID:@"xxx"] [room.rtc stopScreenShare];
Android端集成屏幕共享流程示例
过程步骤:owner端需要同意授权屏幕共享。
接受屏幕共享限制:观众端有正常接入RTC连麦。
开启屏幕共享
rtcService.startScreenShare();
关闭屏幕共享
rtcService.stopScreenShare();
Web端集成屏幕共享流程示例
浏览器需要支持并同意授权屏幕共享权限。
需要屏幕共享的端正在连麦中。
开启屏幕共享
// 可以在调用之前设置屏幕共享的分辨率信息
window.rtcService.setScreenShareVideoProfile(10, 2560, 1600)
// 开始屏幕共享
await rtcService.startPublishScreen()
// 如果需要将屏幕流共享到旁路直播
await rtcService.setLayout([userId], 4) // userId是屏幕共享者的
关闭屏幕共享
rtcService.stopPublishScreen();
Windows端集成屏幕共享流程示例
windows端SDK提供了屏幕分享以及窗口分享的能力。以屏幕分享为例:
auto room_ptr = alibaba::meta_space::MetaSpace::GetInstance()->GetRoomInstance(room_id);
auto rtc_plugin = std::dynamic_pointer_cast<IRtc>(room_ptr->GetPlugin(PluginRtc));
std::vector<alibaba::meta::RtcScreenSource> sources = rtc_plugin->GetScreenShareSourceInfo(alibaba::meta::AliRtcScreenShareType::ALI_RTC_SCREEN_SHARE_DESKTOP);
std::string source_id = sources[0].source_id;
alibaba::meta::AliRtcScreenShareConfig config;
rtc_plugin->StartDesktopShareScreen(std::atoi(source_id),config,[](){},[](const ::alibaba::dps::DPSError & error_msg){});