【问题标题】:How to record IOS screen programmatically如何以编程方式记录IOS屏幕
【发布时间】:2016-11-14 08:09:18
【问题描述】:

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

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

这些都试过了

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

但使用这些库将无法提供高质量的视频。我需要高质量的视频。

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

【问题讨论】:

  • 从第二个库制作的示例视频对我来说似乎很好。请详细说明问题是什么
  • 问题是当我捕获屏幕时在后台播放视频时,它不会显示流畅的视频。它显示为一帧视频,然后在 3-4 秒后显示第二帧,依此类推。视频质量也不好,模糊。你能告诉你使用哪个库吗?
  • 我在使用 ASScreenRecorder 时遇到的另一个问题是它只能记录 2 秒,我不知道为什么!!
  • 另外,我在 ASScreenRecorder.m 文件中的此代码处崩溃 --> BOOL 成功 = [_avAdaptor appendPixelBuffer:pixelBuffer withPresentationTime:time];
  • 这不是你使用stackoverflow的方式。您在一个问题中要求许多不同的东西。编辑此问题或将其删除并添加一个新问题,添加所有这些详细信息: 1. 清晰描述您要达到的目标。 2. 演示尝试执行此操作的示例代码。 3. 这种方法的问题/错误列表。 4. 任何相关的控制台日志或错误。 “我要崩溃了”不是任何人都可以帮助您的,我们需要知道错误,它在哪里,并查看它周围的代码。由于这些问题,这个问题目前有几票可以关闭

标签: ios swift screen recording


【解决方案1】:

从 iOS 9 开始,看起来 ReplayKit 可以大大简化这一点。

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

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

更新:由于 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)
}

【讨论】:

  • 你能告诉我如何将显示在其上的特定视图内容录制为视频..使用重播套件我的意思不是整个视图(屏幕),而是这些链接显示的特定视图如何记录全屏而不是特定视图。对此的任何帮助将不胜感激,在此先感谢!
  • 这很有用,谢谢。我在 iPad Pro 上试过,非常完美。值得注意的是,ReplayKit 无法在 iPhone5 等旧设备上运行 (isAvailable=false)。我也在模拟器中尝试过,其中 isAvailable 为真,但 stopRecording 从不调用模拟器中的完成回调(iOS 11.4,Xcode 9.4.1)。这里有一个关于类似问题的帖子:forums.developer.apple.com/thread/87007
  • 已经有一段时间了,但以防万一,这个解决方案在 iOS 14 /Swift 5 中完美运行。只需确保导入 ReplayKit。谢谢!
【解决方案2】:

ReplayKit 是可用的,虽然你不能访问结果视频,但到目前为止我发现的唯一方法是制作一些屏幕截图(将它们存储在图像数组中),然后将这些图像转换为视频,虽然从性能的角度来看不是很有效,但是当您真的不需要 30/60 fps 屏幕录制并且可能会使用 6-20 pfs 时可能会起作用。这里是the full example

【讨论】:

  • 缺少 ImageUtils 类?它是我们将视频录制为图像的主要部分。在您提供的页面中找不到它。
【解决方案3】:

查看 ScreenCaptureView,它内置了视频录制支持(见链接)。

它的作用是将 UIView 的内容保存到 UIImage 中。作者建议您可以通过 AVCaptureSession 传递帧来保存正在使用的应用的视频。

我相信它尚未使用 OpenGL 子视图进行测试,但假设它可以工作,您可以稍微修改它以包含音频,然后就可以设置了。

AVCaptureSession 示例

AVCaptureSession Reference

import UIKit
import AVFoundation
class ViewController: UIViewController {
    let captureSession = AVCaptureSession()
    let stillImageOutput = AVCaptureStillImageOutput()
    var error: NSError?
    override func viewDidLoad() {
        super.viewDidLoad()
        let devices = AVCaptureDevice.devices().filter{ $0.hasMediaType(AVMediaTypeVideo) && $0.position == AVCaptureDevicePosition.Back }
        if let captureDevice = devices.first as? AVCaptureDevice  {

            captureSession.addInput(AVCaptureDeviceInput(device: captureDevice, error: &error))
            captureSession.sessionPreset = AVCaptureSessionPresetPhoto
            captureSession.startRunning()
            stillImageOutput.outputSettings = [AVVideoCodecKey:AVVideoCodecJPEG]
            if captureSession.canAddOutput(stillImageOutput) {
                captureSession.addOutput(stillImageOutput)
            }
            if let previewLayer = AVCaptureVideoPreviewLayer(session: captureSession) {
                previewLayer.bounds = view.bounds
                previewLayer.position = CGPointMake(view.bounds.midX, view.bounds.midY)
                previewLayer.videoGravity = AVLayerVideoGravityResizeAspectFill
                let cameraPreview = UIView(frame: CGRectMake(0.0, 0.0, view.bounds.size.width, view.bounds.size.height))
                cameraPreview.layer.addSublayer(previewLayer)
                cameraPreview.addGestureRecognizer(UITapGestureRecognizer(target: self, action:"saveToCamera:"))
                view.addSubview(cameraPreview)
            }
        }
    }
    func saveToCamera(sender: UITapGestureRecognizer) {
        if let videoConnection = stillImageOutput.connectionWithMediaType(AVMediaTypeVideo) {
            stillImageOutput.captureStillImageAsynchronouslyFromConnection(videoConnection) {
                (imageDataSampleBuffer, error) -> Void in
                let imageData = AVCaptureStillImageOutput.jpegStillImageNSDataRepresentation(imageDataSampleBuffer)
                 UIImageWriteToSavedPhotosAlbum(UIImage(data: imageData), nil, nil, nil)
            }
        }
    }
    override func didReceiveMemoryWarning() {
        super.didReceiveMemoryWarning()
    }
}

【讨论】:

【解决方案4】:

您可以使用这个库来记录视图:screen-cap-view 在 GitHub 上可用,用 Objective C 编写。

**And to use it in swift:**

--> Drag and drop the .m and .h files in your xcode project.

--> Make a header file and import the this file in that : *#import "IAScreenCaptureView.h"*

--> Then give a View this class from the PropertyInspector and then make a IBOutlet for that view . Something like this:
*@IBOutlet weak var contentView: IAScreenCaptureView!*

--> Then Finally just simply start and stop the recording of the view where ever and when ever you want and for that the code will be like this :

For Starting the Recording : *contentView.startRecording()*
For Stoping the Recording : *contentView.stopRecording()*


//Hope this helps.Happy coding.  \o/ , ¯\_(ツ)_/¯ ,(╯°□°)╯︵ ┻━┻

【讨论】:

  • 这是用于记录特定视图的代码,即您可以记录主视图或主视图上的任何 UIView。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-04-05
  • 2011-07-12
  • 2016-03-18
  • 2011-01-13
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多