Автоматический захват видео с помощью Swift

Я работаю над этим фрагментом кода, отвечающим за запись видео по нажатию кнопки. Когда я нажимаю кнопку, открывается вид камеры, но функция.startVideoCapture() не начинает запись.

Я получаю этот странный вывод при каждом нажатии кнопки:

2015-08-19 16: 48: 09.588 Запись видео с помощью Swift[922:227442] Снимок изображения, которое не было обработано, приводит к созданию пустого снимка. Убедитесь, что ваш вид был обработан хотя бы один раз перед снимком или снимком экрана после обновления экрана.

Кроме того, есть ли способ скрыть вид с камеры и вместо него поместить индикатор выполнения или что-то еще?

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)
     }
    }

2 ответа

У меня недавно была эта проблема, и в моем случае я использовал Swift 3 с iOS 10. Есть несколько способов решить эту проблему:

Вы можете вызвать startVideoCapture() в блоке завершения текущего viewcontroller следующим образом:

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)
    }
})

Другой способ сделать это - вызвать startVideoCapture() только после срабатывания уведомления AVCaptureSessionDidStartRunning.

Ниже приведен код для соблюдения уведомления:

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)
        }
    }
}

В основном убедитесь, что ваше устройство готово для захвата видео. Надеюсь, что это полезно!

Попробуйте изменить следующее:

1.

imagePicker.mediaTypes = NSArray(object: kUTTypeMovie)  as! [String]

2.

func imagePickerController(picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [String : AnyObject]) {

    let tempImage = info[UIImagePickerControllerMediaURL] as! NSURL!
    let pathString = tempImage.relativePath

    self.dismissViewControllerAnimated(true, completion: {})

    UISaveVideoAtPathToSavedPhotosAlbum(pathString!, self, nil, nil)

}
Другие вопросы по тегам