簡體   English   中英

我們如何將視頻文件從庫復制到文檔目錄?

[英]How can we copy a video file from library to documents directory?

是否可以將位於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
    }

希望能幫助到你。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM