2013-01-22 47 views
4

是否可以将位于iOS照片库的视频文件复制到我们应用程序的文档目录中?我使用uiimagepickercontroller从我们获取视频文件的NSUrl的地方尝试,然后将其转换为NSData,然后将其写入文件。但不幸的是,它不工作。我有没有其他方法?我们如何才能将视频文件从库复制到文档目录?

我的意图是将视频加载到OpenCV CvCapture。

+1

你看过这个:http://developer.apple.com/library/ios/#documentation/AudioVideo/Conceptual/CameraAndPhotoLib_TopicsForIOS/Articles/PickinganItemfromthePhotoLibrary.html#//apple_ref/doc/uid/TP40010408-​​SW1? 为什么不尝试使用NSFileManager直接复制文件? –

+0

也许给我们展示一些代码.. –

回答

0

嗨Isarathg这是IOS设备的经典用例。哪些不允许您直接使用路径值访问任何相册资产。交叉检查我的回答,请只是检查FileExistsAtPath您的文件中像下面 - :

println(NSFileManager.defaultManager().fileExistsAtPath(urlvalue.path!)) 

O/P you will get => False 

我也有这个问题几天内最终回到阅读整个文档IOS之后。我已经知道了“只有当我们打开PHImageManager会话时,我们才能访问PhotoAlbum资产”。要检查这种说法,请尝试下面的代码 - :

var currentVideofetch: PHFetchResult! 
required 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 

打开PHImageManager会话,然后当我试图访问视频与路径。它运行良好。还可以使用相册中视频的相对路径将所有视频文件成功复制到我们的本地应用程序目录。

如果你需要我可以给你我的这个实施。但不知道这是否是正确的方式。但为我工作得很好。

其次,也是最有效的解决方案,我发现是使用

AVAssetExportSession

它的工作原理就像一个魅力。我的实施如下 - :

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 
    } 

希望它有帮助。

+0

苹果是否允许这种类型的实现,同时在AppStore中提交应用程序? –

相关问题