2016-02-26 5 views
3

У меня есть файл на путиКак получить NSData из файла с помощью PHAsset

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

Но когда я пытаюсь это code-

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) { 
       } 
    }]; 

Swift 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") 
        } 
       })