我们如何将视频文件从库复制到文档目录?

时间:2013-01-22 19:58:00

标签: iphone ios xcode opencv video-processing

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

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

1 个答案:

答案 0 :(得分:0)

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

希望它有所帮助。