ios - 使用 Swift 自动捕获视频

标签 ios swift avcapturesession

我正在编写这段代码,负责在单击按钮时开始视频录制。 当我单击按钮时,相机 View 将打开,但 .startVideoCapture() 函数不会开始录制。

每次按下按钮时我都会得到这个奇怪的输出:

2015-08-19 16:48:09.588 Record Video With Swift[922:227442] Snapshotting a view that has not been rendered results in an empty snapshot. Ensure your view has been rendered at least once before snapshotting or snapshot after screen updates.

另外,有没有办法隐藏相机 View ,而不是放置一些进度条或其他东西?

class ViewController: UIViewController, UIImagePickerControllerDelegate, UINavigationControllerDelegate, UIGestureRecognizerDelegate 
    {

       let captureSession = AVCaptureSession()
       var previewLayer : AVCaptureVideoPreviewLayer?
        var captureDevice : AVCaptureDevice?
       var imagePicker = UIImagePickerController()

  override func viewDidAppear(animated: Bool) 
 {
    if UIImagePickerController.isSourceTypeAvailable(UIImagePickerControllerSourceType.Camera) {
        println("captureVideoPressed and camera available.")
        imagePicker = UIImagePickerController()
        imagePicker.delegate = self
        imagePicker.sourceType = .Camera;
        imagePicker.mediaTypes = [kUTTypeMovie!]
        imagePicker.allowsEditing = false
        imagePicker.showsCameraControls = true
    }

    else 
    {
        println("Camera not available.")
    }
}

@IBAction func rec(sender: AnyObject) 
{
    self.presentViewController(imagePicker, animated: true, completion: nil)
    imagePicker.startVideoCapture()
}

func imagePickerController(picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [NSObject : AnyObject]) 
    {
    let tempImage = info[UIImagePickerControllerMediaURL] as! NSURL!
    let pathString = tempImage.relativePath
    self.dismissViewControllerAnimated(true, completion: {})
    UISaveVideoAtPathToSavedPhotosAlbum(pathString, self, nil, nil)
     }
    }

最佳答案

我最近遇到了这个问题,在我的例子中,我在 iOS 10 中使用 Swift 3。有几种方法可以解决这个问题:

您可以在当前 View Controller 的完成 block 中调用startVideoCapture(),如下所示:

self.present(self.cameraController, animated: true, completion: {
    self.cameraController.startVideoCapture()

    if #available(iOS 10.0, *) {
        Timer.scheduledTimer(withTimeInterval: 5, repeats: false) { _ in
            self.stopMovementsCapture()
        }
    } else {
        // Fallback on earlier versions
        Timer.scheduledTimer(timeInterval: 5,
                             target: self,
                             selector: #selector(self.stopMovementsCapture),
                             userInfo: nil,
                             repeats: false)
    }
})

另一种方法是,仅在触发 AVCaptureSessionDidStartRunning 通知后调用 startVideoCapture()。

以下是观察通知的代码:

NotificationCenter.default.addObserver(self, selector: #selector(self.cameraIsReady), name: .AVCaptureSessionDidStartRunning, object: nil)

以下是上述通知调用的函数:

func cameraIsReady(notification: NSNotification) {
    DispatchQueue.main.async {
        self.cameraController.startVideoCapture()

        if #available(iOS 10.0, *) {
            Timer.scheduledTimer(withTimeInterval: 5, repeats: false) { _ in
                self.stopMovementsCapture()
            }
        } else {
            // Fallback on earlier versions
            Timer.scheduledTimer(timeInterval: 5,
                                 target: self,
                                 selector: #selector(self.stopMovementsCapture),
                                 userInfo: nil,
                                 repeats: false)
        }
    }
}

基本上确保您的设备已准备好捕获视频。希望这对您有帮助!

关于ios - 使用 Swift 自动捕获视频,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32100593/

相关文章:

javascript - PFUser 上的 AfterSave 检查是否在创建或更新

ios - ScrollView 与 UItableview 发生碰撞

swift - 解析project.pbxproj文件

iphone - IOS UIView 动画

ios - UITableView 标题背景颜色没有完全改变

ios - 如何在 AVCaptureSession 中为视频的每一帧应用过滤器?

ios - 使用 AVPlayer 作为 AVCaptureSession 的输入?

ios - AVFoundation 每秒拍照一次 SWIFT

ios - XCode 无法识别 IOS 分发证书

Swift 5 - 传递给不带参数的调用的参数