当我的 iOS 应用程序在后台使用 ReplayKit 时进行屏幕录制

Posted

技术标签:

【中文标题】当我的 iOS 应用程序在后台使用 ReplayKit 时进行屏幕录制【英文标题】:Screen recording when my iOS app is in background with ReplayKit 【发布时间】:2019-02-01 18:38:43 【问题描述】:

我已经尝试过广播扩展。我已经通过目标添加了该扩展。但是,我不知道如何记录我的应用程序何时处于后台。

我尝试记录的两种方式:

通过控制中心:我可以看到我的应用程序的目标名称,选择该名称后,我点击Start Broadcast开始录制,然后点击Stop Record,但我的视频没有得到存储在相机胶卷或我的应用程序中。 Ref Link:ReplayKit's RPSystemBroadcastPickerView not showing preferredExtension

通过我的应用程序:一旦按下开始按钮,开始录制,我试图通过单击主页按钮从我的应用程序录制背景,显然录制已停止。 Ref Link:https://medium.com/@giridharvc7/replaykit-screen-recording-8ee9a61dd762.

【问题讨论】:

“通过我的应用程序” - 据我所知,这种方法行不通。您无法从您的应用程序开始录制,按下主页按钮,并期望继续录制。 “通过控制中心” - 您必须实际显示一些代码才能查看问题所在。 RPSystemBroadcastPickerView,这给出了“按下主页按钮,并期待录制继续”。 @TheNextman 。但是,我无法通过我的应用检测到我的录制何时完成。 BroadcastExtension 将保存的文件保存到自己的文件夹中,您需要手动将文件复制到应用程序的文件夹,然后将文件保存到图库。 是的。我理解 BroadcastExtension 背后的概念。广播完成后,不会调用 asset.finishWriting。你知道如何让这个完成处理程序自动调用吗?但是,在我们录制时,如果我们在 processSampleBuffer 中遇到任何错误,asset.finishWriting 会自动调用它。但是,记录完成没有任何错误,这个函数没有被调用。 我的代码也有同样的问题,所以我将 sleep 函数放置了 2 秒,这让我的完成处理程序最终创建了文件。 【参考方案1】:

当视频处于后台时,没有“直接”的方式将视频存储在您的应用中。 ReplayKit 版本 2 允许您在调用“广播上传扩展”的应用扩展中获取视频样本缓冲区片段。当您说“通过控制中心”时,意味着您开始广播(而不是录制),同时 ios 找到您的应用程序扩展(而不是您的应用程序)并启动它,然后开始向扩展发送视频样本缓冲区。在此步骤中,您需要决定如何处理这些缓冲区。

我可以为您提出两种解决方案:

您可以尝试将缓冲区传输到服务器(并在下载视频时 主应用程序将启动) 您可以尝试使用应用组将缓冲区保存到文件中(共享 此数据与主应用程序),您可以找到示例 here。

但是您需要知道广播扩展是为缓冲区传输而设计的,而不是存储或重新渲染或压缩或重新编码缓冲区。扩展基于 CPU 时间和内存使用 (±50 MB) 有很多限制,你可以尝试在那里做任何事情,但如果它是“重”操作 iOS 将关闭扩展。

【讨论】:

非常感谢。现在我有了明确的想法。我已将广播上传扩展添加到我的应用程序中。现在,广播“通过控制中心”开始,但在“class SampleHandler: RPBroadcastSampleHandler”和“class BroadcastSetupViewController: UIViewController”中没有发生任何动作。如何做到这一点? 为了您的目的,您只需要 SampleHandler 类。将 print("debug-message") 行添加到 broadcastStarted 和 processSampleBuffer 函数以查看扩展是否有效,然后通过控制中心手动启动广播。要调试它,您需要更改构建目标以上传扩展目标并运行项目。 @McDonal_11 是的,你说得对。我只需要 SampleHandler 类。我已经尝试使用 UserDefault 逻辑来检查我的扩展是如何工作的。它工作正常。我的下一步是,如何将此视频保存在相机胶卷中。谢谢@Bws Sluk。 ***.com/questions/46903118/… ,从这里开始,我正在尝试将录制的视频保存在相机胶卷中。但是,这是行不通的。我在该记录的 URL 中有内容。我已经通过转换为 Data 进行了检查。现在,我正在调用 phphotoLibrary.shared().performChanges( ,然后是 Completion 处理程序,既不会触发成功也不会触发失败。你能帮我解决这个问题吗?? 您不会得到任何日志。您必须在 UserDefaults 中将您的日志保存为字符串。 @KrutikaSonawala

以上是关于当我的 iOS 应用程序在后台使用 ReplayKit 时进行屏幕录制的主要内容,如果未能解决你的问题,请参考以下文章

当我在小于 10 的 ios 版本中隐藏/显示导航栏时,应用程序在进入后台后卡住

从后台唤醒应用程序 iOS

如何在应用程序处于后台(ios)时使 FCM 通知正常工作?

当我的应用程序在后台运行时,可以从摄像头获取通知吗?

当我的应用程序处于后台或关闭时,当远程推送通知到达时从有效负载中获取数据

位置更新在后台停止 - iOS