2024-06-05 IOS OC—如何利用声网SDK实现屏幕共享

屏幕共享

屏幕共享功能主要运用于远程指导,远程协助,远程教育等场景,我利用声网的SDK进行了实现,详细过程做如下分享,希望能给有需要的人带来一定的帮助和启发,也欢迎同仁进行优化和讨论!

1.接入实时通话进行过程控制

屏幕共享的过程是需要一定的流程,所以我也利用声网的pod 'AgoraRtm_iOS','1.5.0',这个SDK就行过程串联和通信。之所以用到此版本,是因为没有接入推送功能,在交互的过程中需要被请求共享屏幕的一方同意即使响应。挂断过程也需要告知另一方!因为不是重点所以不做详细说明。

注意点有以下几个方面:

a:pod 'AgoraRtm_iOS','1.5.0',这个版本才包含对方是否在线的判断方法。

b:因为要同事接入 pod 'AgoraRtcEngine_iOS', :subspecs => ['RtcBasic', 'ReplayKit'] 屏幕共享用到的SDK,所以有冲突,解决办法如下如何处理同时集成 RTM SDK 和 RTC SDK 遇到的问题?

2.屏幕共享的实现

由于 Apple 不支持在 App 主进程采集屏幕,因此你需要为屏幕共享流单独创建一个 Extension,并在 Extension 中使用 iOS 原生的 ReplayKit 框架实现录制屏幕,然后将屏幕共享流发送给主进程、实现屏幕共享。

注意:受系统限制,屏幕共享只支持 iOS 12.0 及以上版本。该功能对设备性能要求较高,声网推荐你使用 iPhone X 及以上设备。

前提条件

在实现屏幕共享前,请确保已在你的项目中实现基本的实时音视频功能。详见实现音视频互动

项目设置

按照以下步骤修改你的项目文件。

前往你的项目文件夹,用 Xcode 打开 .xcodeproj 文件。

点击 File > New > Target..., 在弹出的窗口中选择 Broadcast Upload Extension, 点击 Next


在弹出的窗口中填写 Product Name 等信息,取消勾选 Include UI Extension,点击 Finish。Xcode 会自动创建该 Extension 的文件夹,其中包含 SampleHandler文件。


修改项目设置以实现屏幕共享的代码逻辑,根据实际业务需求选择以下三种方式其中之一即可:

如果你只需使用声网提供的 YBRExtension.xcframework 动态库中的功能,则:选中 Target 为刚刚创建的 Extension,在 Info 中将 NSExtension > NSExtensionPrincipalClass 所对应的 Value 从 SampleHandler 改为 AgoraReplayKitHandler


你的pod 需要这么写

target 'YBR*****istant' do

  # Comment the next line if you don't want to use dynamic frameworks

#  use_frameworks!

  # Pods for YBR*****istan

    #屏幕共享

  pod'AgoraRtcEngine_iOS', :subspecs => ['RtcBasic', 'ReplayKit']

  #即时通讯

  pod'AgoraRtm_iOS','1.5.0'

end

target 'YBRExtension' do

  pod'AgoraRtcEngine_iOS', :subspecs => ['RtcBasic', 'ReplayKit']

end

实现屏幕共享

- (void)startRemote {

//    // 视频默认禁用,你需要调用 enableVideo 启用视频流。

    [self.mRtcEngine enableVideo];

    [self.mRtcEngine enableLocalAudio:NO];

    AgoraRtcChannelMediaOptions *options = [AgoraRtcChannelMediaOptions new];

    //// 视频通话场景下,设置频道场景为 BROADCASTING。

    options.channelProfile = AgoraChannelProfileLiveBroadcasting;

    // 将用户角色设置为 BROADCASTER。

    options.clientRoleType = AgoraClientRoleBroadcaster;

//加入频道

    [self.mRtcEngine joinChannelByToken:[RtmMessageManager shared].currentSession.rtcToken.token channelId:[RtmMessageManager shared].currentSession.rtcToken.channelName uid:YBRuserModel.ybrid.integerValue mediaOptions:options joinSuccess:^(NSString * _Nonnull channel, NSUInteger uid, NSInteger elapsed) {

        if ([[RtmMessageManager shared].currentSession.mineRoler isEqualToString:RemoteRolerPARTICIPANT]) {

            self.screenParams = [AgoraScreenCaptureParameters2 new];

            AgoraScreenVideoParameters *videoParams = [AgoraScreenVideoParameters new];

            //设置屏幕录制的分辨率

            videoParams.dimensions=CGSizeMake(SCREEN_WIDTH*[UIScreen mainScreen].scale,SCREEN_HEIGHT*[UIScreen mainScreen].scale);

            videoParams.frameRate = AgoraVideoFrameRateFps15;

            videoParams.bitrate = AgoraVideoBitrateStandard;

            self.screenParams.videoParams= videoParams;

            //// 开启屏幕采集

            [self.mRtcEngine startScreenCapture:self.screenParams];


            AgoraRtcChannelMediaOptions *options = [AgoraRtcChannelMediaOptions new];

            //// 视频通话场景下,设置频道场景为 BROADCASTING。

            options.channelProfile = AgoraChannelProfileLiveBroadcasting;

            // 将用户角色设置为 BROADCASTER。

            options.clientRoleType = AgoraClientRoleBroadcaster;

            //发布屏幕录制

            options.publishScreenCaptureVideo = YES;

            options.publishCameraTrack=NO;

            [self.mRtcEngine updateChannelWithMediaOptions:options];

        }

    }];

}

使用 Apple 在 iOS 12.0 中新增的 RPSystemBroadcastPickerView,使 App 界面弹出 “开启屏幕共享” 的按钮,提示用户通过点击该按钮开启录制,示例代码如下:

RPSystemBroadcastPickerView *systemBroadcastPicker = [[RPSystemBroadcastPickerView alloc] initWithFrame:CGRectMake(0, 0, 60, 60)];

    systemBroadcastPicker.showsMicrophoneButton=false;

    systemBroadcastPicker.autoresizingMask  =UIViewAutoresizingFlexibleTopMargin | UIViewAutoresizingFlexibleRightMargin;

        NSString*bundleId = [NSBundlemainBundle].bundleIdentifier;

        systemBroadcastPicker.preferredExtension= [NSStringstringWithFormat:@"%@.Agora-ScreenShare-Extension",bundleId];

    self.systemBroadcastPicker= systemBroadcastPicker;

    for (UIView *view in self.systemBroadcastPicker.subviews) {

        if([viewisKindOfClass:[UIButtonclass]]) {

            [((UIButton *)view) sendActionsForControlEvents:(UIControlEventAllEvents)];

            break;

        }

    }


©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 217,509评论 6 504
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,806评论 3 394
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 163,875评论 0 354
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,441评论 1 293
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,488评论 6 392
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,365评论 1 302
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,190评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,062评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,500评论 1 314
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,706评论 3 335
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,834评论 1 347
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,559评论 5 345
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,167评论 3 328
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,779评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,912评论 1 269
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,958评论 2 370
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,779评论 2 354

推荐阅读更多精彩内容