ReplayKit:RPScreenRecorder.shared()。startCapture()不起作用

时间:2018-08-11 03:01:02

标签: swift avfoundation video-recording avkit replaykit

ReplayKit最近真的让我感到沮丧。由于某些原因

RPScreenRecorder.shared().startCapture(handler: { (sample, bufferType, error) in

在我调用它时实际上并不起作用,因为其中有一个print()语句,并且从未调用过。

我在ViewController中的代码是:

import UIKit
import AVFoundation
import SpriteKit
import ReplayKit
import AVKit

class ViewController: UIViewController, AVCaptureVideoDataOutputSampleBufferDelegate, UIImagePickerControllerDelegate, UINavigationControllerDelegate, RPPreviewViewControllerDelegate {

    var assetWriter:AVAssetWriter!
    var videoInput:AVAssetWriterInput!

func startRecording(withFileName fileName: String) {
        if #available(iOS 11.0, *)
        {

            assetWriter = try! AVAssetWriter(outputURL: fileURL, fileType:
                AVFileType.mp4)
            let videoOutputSettings: Dictionary<String, Any> = [
                AVVideoCodecKey : AVVideoCodecType.h264,
                AVVideoWidthKey : UIScreen.main.bounds.size.width,
                AVVideoHeightKey : UIScreen.main.bounds.size.height
            ];

            videoInput  = AVAssetWriterInput (mediaType: AVMediaType.video, outputSettings: videoOutputSettings)
            videoInput.expectsMediaDataInRealTime = true
            assetWriter.add(videoInput)
            print("HERE")
            RPScreenRecorder.shared().startCapture(handler: { (sample, bufferType, error) in
                print("RECORDING")
            }
      }
}

func stopRecording(handler: @escaping (Error?) -> Void)
    {
        if #available(iOS 11.0, *)
        {
            RPScreenRecorder.shared().stopCapture
                {    (error) in
                    handler(error)
                    self.assetWriter.finishWriting
                        {
                            print("STOPPED")
                    }
            }
        }
    }

打印“ HERE”,但不打印“ RECORDING”

[p.s。对不起,代码格式错误,我确定您会明白的:)]


我也尝试了另一种方法:

let recorder = RPScreenRecorder.shared()
recorder.startRecording{ [unowned self] (error) in
    guard error == nil else {
        print("There was an error starting the recording.")
        return
    }
    print("Started Recording Successfully")
 }

并停止录制...

    recorder.stopRecording { [unowned self] (preview, error) in
        print("Stopped recording")
        guard preview != nil else {
            print("Preview controller is not available.")
            return
        }
        onGoingScene = true
        preview?.previewControllerDelegate = self
        self.present(preview!, animated: true, completion: nil)
    }

当我调用记录器时,此方法不会停止。stopRecording()函数永远不会调用“停止记录”。


有人可以帮助我,因为这确实让我感到沮丧,您如何才能正确使用ReplayKit在iOS 11中录制屏幕?我已经在互联网上进行了搜索,但没有一种方法对我有用,我不知道为什么。附言我的Info.plist中有必要的权限密钥。

谢谢

2 个答案:

答案 0 :(得分:2)

强烈提醒您ReplayKit在模拟器中不起作用。我在完全相同的问题上浪费了数小时,直到意识到ReplayKit永远不会触发startCapture处理程序,因为它从未在模拟器中记录。

答案 1 :(得分:1)

此问题的可能原因很少。 其中一些在这里:

  1. 您的重放工具包Shared Recorder可能已崩溃,为此,您可以重新启动设备并再次检查。
  2. 您的重放工具包中可能有可打印的问题。为此,请遵守int i=0; for (i = 0; i < 1; i++) { i = --i-i--; System.out.println("for loop i= "+i); } System.out.println("i value outside for loop= "+i); 协议并将RPScreenRecorderDelegate方法添加到您的类中,并检查此方法中是否出现任何错误。