声网支持在视频通话或互动直播场景中进行屏幕共享,你可以将主播或其他发言人的屏幕内容以视频的方式分享给其他用户观看,以提高沟通效率。
屏幕共享在音视频互动领域应用广泛,包括但不限于以下场景:
由于 Apple 不支持在 app 主进程采集屏幕,因此你需要为屏幕共享流单独创建一个 Extension,并在 Extension 中使用 iOS 原生的 ReplayKit 框架实现录制屏幕,然后将屏幕共享流发送给主进程、实现屏幕共享。
根据实际业务场景的不同,你可以选择以下任一方式调用 API 实现屏幕共享:
startScreenCapture
,然后调用 joinChannelByToken
[2/4] 加入频道并设置 publishScreenCaptureVideo
为 true
,即可开始屏幕共享。startScreenCapture
,然后调用 updateChannelWithMediaOptions
更新频道媒体选项并设置 publishScreenCaptureVideo
为 true
,即可开始屏幕共享。setAudioScenario
方法设置音频场景为 AUDIO_SCENARIO_GAME_STREAMING
。在实现屏幕共享前,请确保已在你的项目中实现基本的实时音视频功能。详见实现视频通话或实现视频直播。
本节介绍如何使用 iOS SDK 实现屏幕共享。
通过 Cocoapods 集成 SDK 时,你需要在 Podfile
文件中添加如下内容,指定集成屏幕共享动态库 AgoraReplayKitExtension.xcframework
,示例代码如下:
platform :ios, '9.0'
target 'Your App' do
// 只集成基础库和屏幕共享动态库
// 请使用具体的 SDK 版本号替换下面代码中的 x.y.z,可通过发版说明获取最新版本号
pod 'AgoraRtcEngine_iOS', 'x.y.z', :subspecs => ['RtcBasic', 'ReplayKit']
end
前往你的项目文件夹,用 Xcode 打开 ios/.xcodeproj
。
点击 File > New > Target..., 在弹出的窗口中选择 Broadcast Upload Extension, 点击 Next。
在弹出的窗口中填写 Product Name 等信息,取消勾选 Include UI Extension,点击 Finish。Xcode 会自动创建该 Extension 的文件夹,其中包含 SampleHandler.h
文件。
在 Target 下选中刚创建的 Extension,点击 General,在 Deployment Info 下将 iOS 的版本设置为 12.0 或之后。
修改 SampleHandler.h
文件,以实现屏幕共享的代码逻辑:
如果你只需使用声网提供的 AgoraReplayKitExtension.xcframework
中的功能,修改方式为:选中 Target 为刚刚创建的 Extension,在 Info 中将 NSExtension > NSExtensionPrincipalClass 所对应的 Value 从 SampleHandler 改为 AgoraReplayKitHandler。
如果你还需要自定义一些业务逻辑,可将如下代码替换到 SampleHandler.h
文件中。
// Objective-C
#import "SampleHandler.h"
#import "AgoraReplayKitExt.h"
#import <sys/time.h
@interface SampleHandler ()<AgoraReplayKitExtDelegate
@en
@implementation SampleHandle
- (void)broadcastStartedWithSetupInfo:(NSDictionary<NSString *,NSObject *> *)setupInfo {
// User has requested to start the broadcast. Setup info from the UI extension can be supplied but optional.
[[AgoraReplayKitExt shareInstance] start:self]
- (void)broadcastPaused {
// User has requested to pause the broadcast. Samples will stop being delivered.
NSLog(@"broadcastPaused");
[[AgoraReplayKitExt shareInstance] pause];
- (void)broadcastResumed {
// User has requested to resume the broadcast. Samples delivery will resume.
NSLog(@"broadcastResumed");
[[AgoraReplayKitExt shareInstance] resume]
- (void)broadcastFinished {
// User has requested to finish the broadcast.
NSLog(@"broadcastFinished");
[[AgoraReplayKitExt shareInstance] stop]
- (void)processSampleBuffer:(CMSampleBufferRef)sampleBuffer withType:(RPSampleBufferType)sampleBufferType {
[[AgoraReplayKitExt shareInstance] pushSampleBuffer:sampleBuffer withType:sampleBufferType];
#pragma mark - AgoraReplayKitExtDelegat
- (void)broadcastFinished:(AgoraReplayKitExt *_Nonnull)broadcast reason:(AgoraReplayKitExtReason)reason {
switch (reason) {
case AgoraReplayKitExtReasonInitiativeStop:
{
// NSDictionary *userInfo = @{NSLocalizedDescriptionKey : @"Host app stop srceen capture"};
// NSError *error = [NSError errorWithDomain:NSCocoaErrorDomain code:0 userInfo:userInfo];
// [self finishBroadcastWithError:error];
NSLog(@"AgoraReplayKitExtReasonInitiativeStop");
}
break;
case AgoraReplayKitExtReasonConnectFail:
{
// NSDictionary *userInfo = @{NSLocalizedDescriptionKey : @"Connect host app fail need startScreenCapture in host app"};
// NSError *error = [NSError errorWithDomain:NSCocoaErrorDomain code:0 userInfo:userInfo];
// [self finishBroadcastWithError:error];
NSLog(@"AgoraReplayKitExReasonConnectFail");
}
break
case AgoraReplayKitExtReasonDisconnect:
{
// NSDictionary *userInfo = @{NSLocalizedDescriptionKey : @"disconnect with host app"};
// NSError *error = [NSError errorWithDomain:NSCocoaErrorDomain code:0 userInfo:userInfo];
// [self finishBroadcastWithError:error];
NSLog(@"AgoraReplayKitExReasonDisconnect");
}
break;
default:
break;
}
@end
调用 startScreenCapture
,并结合用户的手动操作,使 app 开启屏幕共享。有两种方式供你参考:
方式一:提示用户在 iOS 系统的控制中心长按屏幕录制按钮,并选择用你创建的 Extension 开启录制。
方式二:使用 Apple 在 iOS 12.0 中新增的 RPSystemBroadcastPickerView,使 app 界面弹出 “开启屏幕共享” 的按钮,提示用户通过点击该按钮开启录制。
RPSystemBroadcastPickerView
存在一些使用限制并可能在后续版本的 iOS 系统中失效。因此,请酌情使用方式二。声网在 GitHub 提供了开源的示例项目供你参考。