2016-02-26 67 views
3

從文件中得到的NSData我有文件在路徑如何使用PHAsset

file:///var/mobile/Media/DCIM/100APPLE/IMG_0197.mov 

但當我嘗試這個代碼 -

NSError *error; 
NSData *data = [NSData dataWithContentsOfFile:assetUrl.relativePath options:NSDataReadingMappedAlways error:&error]; 

我什麼都沒有,但錯誤:

Error Domain=NSCocoaErrorDomain Code=257 "Не удалось завершить операцию. (Cocoa, ошибка 257)" UserInfo=0x175a61380 {NSFilePath=/var/mobile/Media/DCIM/100APPLE/IMG_0197.mov, NSUnderlyingError=0x17424e550 "Не удалось завершить операцию. Operation not permitted"}

文件存在但我無法讀取它。

但是與此同時AVPlayer通常播放視頻文件。

我試圖

PHFetchResult *fetchResult = [PHAsset fetchAssetsWithALAssetURLs:@[assetUrl] options:nil]; 

但我沒有得到任何結果。

回答

6

由於文件位於應用程序的沙箱外,因此無法直接訪問NSURL。某些框架(如AVPlayer)具有例外授權,並且可以訪問這些URL。 要訪問PHAsset對象的數據來看看的PHImageManager以下方法:

對於圖片:requestImageDataForAsset

對於視頻:requestExportSessionForVideo

1

對我幫助下面的代碼。使用relativePath而不是absoluteString非常重要。

[[PHImageManager defaultManager] requestAVAssetForVideo:videoContent options:options resultHandler:^(AVAsset* avasset, AVAudioMix* audioMix, NSDictionary* info){ 
       AVURLAsset* myAsset = (AVURLAsset*)avasset; 
       NSData * data = [NSData dataWithContentsOfFile:myAsset.URL.relativePath];  
       if (data) { 
       } 
    }]; 

斯威夫特版本3: -

PHImageManager.default().requestAVAsset(forVideo: asset, options: nil, resultHandler: { (asset, mix, nil) in 
        let myAsset = asset as? AVURLAsset 
        do { 
         let videoData = try Data(contentsOf: (myAsset?.url)!) 
         self.selectedVideoData = videoData //Set video data to nil in case of video 
         print("video data : \(videoData)") 

        } catch { 
         print("exception catch at block - while uploading video") 
        } 
       }) 
相關問題