如何使用 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")
}
})
我有文件在路径
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")
}
})