文档

开启和关闭屏幕共享

更新时间:

本文介绍在加入连麦之后如何开启和关闭屏幕共享。

说明

  • 不同端的开启屏幕共享流程有较大差异,请参考下面各端的开启屏幕共享流程示例。

  • 本文包括了屏幕共享的集成流程和基础操作,更详细的设置请看屏幕共享流

  • 发起屏幕共享之前,需要先加入连麦

iOS端集成屏幕共享流程示例

iOS端集成屏幕共享功能需要进行前期准备工作,分为两个步骤,分别是依赖库集成和Extension端API调用。

前期准备步骤一:依赖库集成

  1. 创建新的Extension Target,选择“File->New->Target->Broadcast Upload Extension”,创建Extension Target。

    输入Product Name可以不勾选Include UI Extension。项目中会自动创建下图目录和文件。

  2. 将下载到的 SDK 中的 AliScreenShare.framework 拖动到刚才创建的插件工程中,勾选刚创建的 Target。

  3. 进行以下操作添加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 进程的录屏数据。开启屏幕共享分为两步,如下所示。

  1. 通过调用startScreenShare接口开启屏幕流通道。

    // 开启屏幕共享
    // 插件和宿主app约定使用相同的appGroup
    id<AIRBRoomChannelProtocol> room = [[AIRBRoomEngine sharedInstance] getRoomChannelWithRoomID:@"xxx"]
    [room.rtc startScreenShare:(NSString*)appGroup];
  2. 用户在 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端集成屏幕共享流程示例

  1. 浏览器需要支持并同意授权屏幕共享权限。

  2. 需要屏幕共享的端正在连麦中。

开启屏幕共享

// 可以在调用之前设置屏幕共享的分辨率信息
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){});
  • 本页导读 (1)
文档反馈