如何使用 PHAsset 从文件中获取 NSData

How to get NSData from file by using 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];

但是我没有得到任何结果。

您无法直接访问 NSURL,因为这些文件位于您应用的沙盒之外。某些框架(如 AVPlayer)具有例外权利并且可以访问 URL。 要访问 PHAsset 对象的数据,请查看 PHImageManager 的以下方法:

图片:requestImageDataForAsset

对于视频:requestExportSessionForVideo

下面的代码对我很有帮助。使用 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")
                    }
                })