¿Cómo podemos copyr un file de video de la biblioteca al directory de documentos?

¿Es posible copyr un file de video ubicado en la biblioteca fotográfica de iOS en el directory de documentos de nuestra aplicación? Lo intenté usando uiimagepickercontroller desde donde obtenemos el NSUrl del file de video, luego lo convertimos en NSData y luego lo escribimos en el file. Pero desafortunadamente no funciona. ¿Hay algún método alternativo?

Mi intención es cargar el video en OpenCV CvCapture.

Hey Isarathg, este es un caso de uso clásico de dispositivos IOS. Lo cual no le permite acceder a ningún elemento del Álbum de fotos directamente utilizando el valor de ruta. Para contrastar mi respuesta, simplemente revise FileExistsAtPath para su file como a continuación:

println(NSFileManager.defaultManager().fileExistsAtPath( urlvalue.path!)) O/P you will get => False 

También termino con este problema hace un par de días después de leer toda la documentation de IOS. Lo que he descubierto "Solo podemos acceder a los Activos PhotoAlbum si y solo si tenemos la session PHImageManager abierta". Para verificar esta statement, intente con el siguiente código:

 var currentVideofetch: PHFetchResult! requinetworking init(coder aDecoder: NSCoder) { let options = PHFetchOptions() options.sortDescriptors = [ NSSortDescriptor(key: "creationDate", ascending: true) ] currentVideofetch = PHAsset.fetchAssetsWithMediaType(.Video, options: options) super.init(coder: aDecoder) } func checkImageExists(){ let asset = self.currentVideofetch.objectAtIndex(1) as? PHAsset } if let checkedAsset = asset { PHImageManager.defaultManager().requestAVAssetForVideo(checkedAsset, options: nil, resultHandler: {[weak self](result: AVAsset!, audioMix: AVAudioMix!, info: [NSObject : AnyObject]!) in println(NSFileManager.defaultManager().fileExistsAtPath(self.urlvalue.path!)) }) } O/P you will get => True 

Después de abrir la session PHImageManager y luego cuando traté de acceder al video con la ruta. Funcionó bien También puede copyr correctamente todos los files de videos en nuestro directory de aplicaciones locales utilizando la ruta relativa de los videos en Photo Album.

Si lo necesita, puedo enviarle mi implementación para esto. Pero no estoy seguro si es correcto o no. Pero funcionando bien para mí.

La segunda y más efectiva solución que encontré es usar

AVAssetExportSession

Funciona a las mil maravillas. Mi implementación es la siguiente:

 func importVideoToAppDir(videoURL: NSURL, videoFinalPath: NSURL, handler: ((NSURL?) -> Void)?) { var assetDuration: CMTime! var asset: AVAsset! asset = AVAsset.assetWithURL(videoURL) as! AVAsset assetDuration = asset!.duration if (DirOperations.DeleteIfExists(videoTempPath) && DirOperations.DeleteIfExists(videoFinalPath)) { let startTime = kCMTimeZero let assetDurationSeconds = CMTimeGetSeconds(self.asset!.duration) var range: CMTimeRange! if assetDurationSeconds > Float64(maxDuration) { let stopTime = CMTimeMakeWithSeconds(Float64(maxDuration), 1) range = CMTimeRangeFromTimeToTime(startTime, stopTime) } else { let stopTime = CMTimeMakeWithSeconds(assetDurationSeconds, 1) range = CMTimeRangeFromTimeToTime(startTime, stopTime) } var exporter :AVAssetExportSession = AVAssetExportSession(asset: self.asset, presetName: AVAssetExportPresetHighestQuality) exporter.outputURL = videoFinalPath exporter.outputFileType = AVFileTypeQuickTimeMovie exporter.timeRange = range exporter.exportAsynchronouslyWithCompletionHandler { () -> Void in switch exporter.status { case AVAssetExportSessionStatus.Failed: println("failed import video: \(exporter.error)") handler?(nil) case AVAssetExportSessionStatus.Cancelled: println("cancelled import video: \(exporter.error)") handler?(nil) default: println("completed import video") println(videoFinalPath) handler?(videoFinalPath) } } } } func DeleteIfExists(path: NSURL) -> Bool { var deleted = true var error: NSError? if (NSFileManager.defaultManager().fileExistsAtPath(path.path!)) { deleted = NSFileManager.defaultManager().removeItemAtPath(path.path!, error: &error) } return deleted } 

Espero eso ayude.