iOS:(ReplayKit,BoardCast)屏幕录制,直播

//应该分为两篇文章。

ReplayKit:

iOS 9 开始提供了 ReplayKit Extension 进行应用内的录制,只能进行app内的录制(通知,键盘等都无法录制进去),且录制内容不能实时返回,无法进行直播。录制结束后只能通过RPPreviewViewController来进行预览和分享
iOS10:新增了Live Broadcast。Live Broadcast具体是通过Broadcast Upload Extension和Broadcast Setup UI Extension两个扩展,来实现APP内屏幕录制和实时音视频数据获取。获取的数据可直接通过手机传输到第三方流媒体服务,实现直播的效果。
BoardcastUpload是录制开始,结束等生命周期的回调和录制内容的回调,
BoardcastUploadSetupUI,是录制唤起时,自定义的一个配置页面,一般用来关联账户等操作,在录制过程中,可通过RPBroadcastController做开始,暂停,恢复,完成等操作。当录制被其他进程打断(比如打电话)进入后台,默认是暂停录制,当进入前台后,系统会弹窗提示用户是否恢复录制,如果选择恢复,则执行恢复录制操作,反之,则执行完成录制操作。

iOS11实现了系统级的采集,可以实现跨app的录制了(即iOS System Boardcast,BoardCast可以扩展录屏功能,,用户长按录屏后,可以选择app进行录制,或进行屏幕直播。)
iOS 15之后,ReplayKit 提供了 Loop Buffer 功能,开启后应用可以随时调用 API 将最长15秒最新的录制内容导出(大概功能是一直持续缓存最新的15秒内容)
为app添加扩展target:


截屏2024-07-31 14.15.11.png

添加后在工程目录内会增加以下内容:


截屏2024-07-31 14.34.36.png

BoardcastUpload是录制开始,结束等生命周期的回调和录制内容的回调,
BoardcastUploadSetupUI,是录制唤起时,可以自定义的一个页面,一般用来让用户配置一些参数(比如账户,美颜等)

APP内有两种唤起录屏的方式:
第一种:用于唤起其他直播app,来录制并直播自己的内容。(多用于将自身的app录屏数据传给其他直播app平台)
比如:APP-1是带直播功能的app,APP-2是需要被直播的app,比如游戏,如果APP-1包含RPScreenRecorder模块。那么我们就可以让我们的APP-2 在APP-1的直播平台直播
APP-1需要添加BoardCast-Extension。并实现BoardcastUpload(数据处理模块)和BoardcastUploadSetupUI(自定义直播配置模块)
APP-2中添加以下代码:

  //添加以下代码,执行时,会从底部弹出系统菜单,菜单中展示了手机上支持RPScreenRecorder的app供选择
    RPBroadcastActivityViewController.load { vc, error in
            guard let boardSelect = vc else {return}
            vc?.delegate = self
            self.present(boardSelect, animated: true)
    }
      //添加 代理,当系统菜单操作finish时,回调。在此方法中,一般需要将弹出的broadcastActivityViewController隐藏:
    func broadcastActivityViewController(_ broadcastActivityViewController: RPBroadcastActivityViewController, didFinishWith broadcastController: RPBroadcastController?, error: Error?) {
        broadcastActivityViewController.dismiss(animated: true)
        broadcastController?.startBroadcast(handler: { _ in
            if error == nil {
                
            }else{
                print(error)
            }
        })
    }

第二种:一般用于自身实现了录屏直播相关功能的app,调用后开启自己的录屏服务并进行后续处理:

        //定义属性:用来获取显示的
         var broadPickerView :RPSystemBroadcastPickerView!
  ...
  ...
        //在你的页面中添加按钮:
        let broadPickerView = RPSystemBroadcastPickerView.init(frame: CGRect(x: 5, y: 5, width: 50, height: 50))
        //设置唤起的页面中,仅展示指定的扩展项,参数为扩展的Bundle Identifier。可以不设置,那么在
        broadPickerView.preferredExtension = "com.konka.yimutiscreen.YiMutiScreen.BoardcastUpload"
        self.broadPickerView = broadPickerView   //
        self.view..addSubview(broadPickerView)

用于进程之间通讯,比如app_extension与主app之间通讯。
有个坑,CFNotificationCenterPostNotification的userinfo无论怎么设置,在通知接收的时候都为空。

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容