如何以编程方式录制IOS屏幕

2024-02-26

有没有办法以编程方式录制 IOS 屏幕?意味着您正在执行的任何活动,例如单击按钮、滚动表格视图。

即使正在播放的视频会与其他活动一起再次捕获?

尝试过这些

  1. https://www.raywenderlich.com/30200/avfoundation-tutorial-adding-overlays-and-animations-to-videos https://www.raywenderlich.com/30200/avfoundation-tutorial-adding-overlays-and-animations-to-videos
  2. https://github.com/alskipp/ASScreenRecorder https://github.com/alskipp/ASScreenRecorder

但这些库不会提供高质量的视频。我需要高质量的视频。

问题是,当我捕获屏幕时在后台播放视频时,它不会显示流畅的视频。它显示一帧视频,然后 3-4 秒后显示第二帧,依此类推。而且视频质量不好,很模糊


从 iOS 9 开始,ReplayKit 似乎可以大大简化这一过程。

https://developer.apple.com/reference/replaykit https://developer.apple.com/reference/replaykit

https://code.tutsplus.com/tutorials/ios-9-an-introduction-to-replaykit--cms-25458 https://code.tutsplus.com/tutorials/ios-9-an-introduction-to-replaykit--cms-25458

Update:既然 iOS 11 有内置的屏幕录像机,这可能不太相关,但以下内容Swift 3代码对我有用:

import ReplayKit

@IBAction func toggleRecording(_ sender: UIBarButtonItem) {
    let r = RPScreenRecorder.shared()

    guard r.isAvailable else {
        print("ReplayKit unavailable")
        return
    }
    
    if r.isRecording {
        self.stopRecording(sender, r)
        
    }
    else {
        self.startRecording(sender, r)
    }
}

func startRecording(_ sender: UIBarButtonItem, _ r: RPScreenRecorder) {
    
    r.startRecording(handler: { (error: Error?) -> Void in
        if error == nil { // Recording has started
            sender.title = "Stop"
        } else {
            // Handle error
            print(error?.localizedDescription ?? "Unknown error")
        }
    })
}

func stopRecording(_ sender: UIBarButtonItem, _ r: RPScreenRecorder) {
    r.stopRecording( handler: { previewViewController, error in

        sender.title = "Record"
        
        if let pvc = previewViewController {

            if UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiom.pad {
                pvc.modalPresentationStyle = UIModalPresentationStyle.popover
                pvc.popoverPresentationController?.sourceRect = CGRect.zero
                pvc.popoverPresentationController?.sourceView = self.view
            }

            pvc.previewControllerDelegate = self
            self.present(pvc, animated: true, completion: nil)
        }
        else if let error = error {
            print(error.localizedDescription)
        }
        
    })
}

// MARK: RPPreviewViewControllerDelegate
func previewControllerDidFinish(_ previewController: RPPreviewViewController) {
    previewController.dismiss(animated: true, completion: nil)
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何以编程方式录制IOS屏幕 的相关文章

随机推荐

  • 如何访问 Tumblr API 照片数据源(即所有照片、整个档案)?

    我目前正在用 PHP 开发一个项目 该项目通过 Tumblr API 使用我的 api key 连接到 Tumblr 照片博客 以访问指定 Tumblr 照片博客中发布的照片 我使用 Tumblr API 文档开始 并交叉引用了许多网站 包
  • 您可以使用 JavaScript 将多个图像合并为一个图像吗?

    我想知道是否有一种方法可以仅使用 JavaScript 将多个图像组合成单个图像 这是 Canvas 能够做到的吗 效果可以通过定位来完成 但是可以将它们组合成单个图像进行下载吗 2008 年 10 月 1 日更新 感谢您的建议 我正在帮助
  • 使用 UIViewAnimationOptionTransitionCurlDown 自定义 Segue

    我想创建一个自定义 Segue 来用卷曲动画交换 ViewController 但我找不到方法 void 执行此操作会是什么 我有这个 void perform UIViewController dst self destinationVi
  • 为什么 AudioRecord.getMinBufferSize 返回 ERROR_BAD_VALUE (-2)?

    我正在 Samsung Galaxy S i9000 上对此进行测试 int sampleRate 44100 int bufferSize AudioRecord getMinBufferSize sampleRate AudioForm
  • JSON-lib 转义/保留字符串

    我正在使用 Java 的 JSON lib 库http json lib sourceforge net http json lib sourceforge net 我只想添加看起来像 JSON 的简单字符串 但我不希望库自动找出它可能是
  • 使用“全选”时排除禁用的复选框

    我在表中有带有标签的复选框 我在表 全选 之外添加了一个复选框 ID 为 chkbox 现在下面的代码工作正常 这是 选择和取消选择表中的所有复选框 现在有一些页面由于业务逻辑而禁用了一些复选框 我希望这些复选框不应该受到影响
  • Java 创建一个新文件,或者覆盖现有文件

    我想要实现的是创建一个文件 无论该文件是否存在 我尝试使用File createNewFile 但这只会创建该文件 如果该文件尚不存在 我应该使用File delete 进而File createNewFile 或者有更清晰的方法吗 Fil
  • 如何让工具提示在 IE 中显示时间更长

    我得到以下内容 span title 在 Firefox 中 工具提示会一直停留在那里 直到鼠标移动 但在 IS 中 它只停留大约 5 秒 然后消失 有没有办法让它持续更久 没有内置的浏览器工具提示 不 有大量类似工具提示的 UI 组件使用
  • 关于jsp源代码

    我开发了一个非常大的 Web 应用程序 如果我需要在 JSP 页面中进行任何更改 则需要花费太多时间来查找 JSP 页面 链接 操作等 那么 是否有任何工具或技术可以让我直接获取该特定 JSP 页面的代码 我认为 查看来源 是不同的 它只显
  • Hibernate:无法反序列化 - 无效的流标头

    关于如何解决此错误有什么想法吗 我将 Spring JPA 与 Hibernate 一起使用 下面是必要的详细信息 实体类别1 Entity Table name ways TypeDef name hstore typeClass Hst
  • 如何在 Android 的 TabLayout 中使选项卡标题向左对齐

    我似乎无法在 TabLayout 内将选项卡标题向左对齐 目前 标题居中 这是什么I want https i stack imgur com Vy6FP jpg实现 这就是I have https i stack imgur com FY
  • 从 c# 中的 app.config 获取 ConnectionString [重复]

    这个问题在这里已经有答案了 我已经在 app config 文件中定义了我的连接字符串
  • WPF 以编程方式实例化用户控件以将其呈现为 PNG

    我想在 DLL 中以编程方式实例化用户控件 然后将其保存为 PNG 文件 这对于PngBitmapEncoder和RenderTargetBitmap来说一般是没有问题的 这是我的问题 如何实例化该控件 简单地使用 new operator
  • Pandas 将零替换为最接近的平均非零值

    我有一个数据框 df pd DataFrame A 0 0 15 0 0 12 0 0 0 5 我想用最接近的非零值替换 0 值 比如第一个值是0 那么我发现最接近的非零值是15 所以我把它替换为15 那么数据就变成了 15 0 15 0
  • 即使存在未设置为 true,Rails 验证也需要数字

    我正在尝试保存一条没有设置字段的记录 该记录在模型中具有验证数值 即使验证中不需要存在 它仍然会抛出该字段不是数字的错误 验证 validates network id numericality gt true 保存模型的代码 networ
  • 在实现 ArrayAccess 和 Iterator 的对象上使用 foreach

    有没有办法迭代实现 ArrayAccess 和 Iterator 接口的对象的键 数组访问很有魅力 但我不能在那些对象上使用 foreach 这对我有很大帮助 是否可以 到目前为止我有这样的代码
  • 如何使用 xdist 和 django_coverage_plugin 并行 pytest 运行覆盖率报告

    使用以下设置 计算出的覆盖率小于使用没有并行化的单线程的覆盖率 Coverage 仅在项目根目录中创建 1 个覆盖文件 我预计这就是问题所在 我无法确定我做错了什么 报告的覆盖范围比我简单地运行要少coverage m pytest 在单线
  • 如何使用 Gmail API 访问我拥有的 Gmail 帐户?

    我想将节点脚本作为 cronjob 运行 它使用 Gmail 的 API 来轮询我拥有的 Gmail 帐户 我正在关注这些快速入门说明 https developers google com gmail api quickstart nod
  • JTabbedPane:选项卡左侧的图标

    你好 我正在使用 nimbus 外观和感觉 并有一个带有图标和文本的选项卡窗格 现在图标出现在文本的右侧 而我想将其放在左侧 我还想在图标和文本之间添加一些间距 thanks tab组件需要自己设置 它控制选项卡标题的呈现方式 Create
  • 如何以编程方式录制IOS屏幕

    有没有办法以编程方式录制 IOS 屏幕 意味着您正在执行的任何活动 例如单击按钮 滚动表格视图 即使正在播放的视频会与其他活动一起再次捕获 尝试过这些 https www raywenderlich com 30200 avfoundati