Автоматический захват видео с помощью 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)
}