是否可以将位于 iOS 照片库中的视频文件复制到我们应用程序的文档目录中?我使用 uiimagepickercontroller 进行了尝试,我们从中获取了视频文件的 NSUrl,然后将其转换为 NSData,然后将其写入文件。但不幸的是,它不起作用。我有任何替代方法吗?
我的意图是将视频加载到 OpenCV CvCapture。
是否可以将位于 iOS 照片库中的视频文件复制到我们应用程序的文档目录中?我使用 uiimagepickercontroller 进行了尝试,我们从中获取了视频文件的 NSUrl,然后将其转换为 NSData,然后将其写入文件。但不幸的是,它不起作用。我有任何替代方法吗?
我的意图是将视频加载到 OpenCV CvCapture。
嘿 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
}
希望能帮助到你。