NSData dataWithContentsOfURL用于来自相机胶卷的URL

时间:2017-06-09 21:10:35

标签: ios objective-c nsdata nsurl photolibrary

我有一些存储在相机胶卷中的视频网址。例如:

文件:///var/mobile/Media/DCIM/100APPLE/IMG_0249.MP4

我想将这些视频进一步处理为NSData,但如果我使用

NSURL* videoURL = [NSURL fileURLWithPath:@"file:///var/mobile/Media/DCIM/100APPLE/IMG_0249.MP4"];
NSData *imageData = [NSData dataWithContentsOfURL:videoURL options:NSDataReadingMappedIfSafe error:&error];

数据始终为零。我收到以下错误:

  

错误域= NSCocoaErrorDomain代码= 257"文件“IMG_0249.MP4”   由于您无权查看,因此无法打开。"   的UserInfo = {NSFilePath =的/ var /移动/媒体/ DCIM / 100APPLE / IMG_0249.MP4,   NSUnderlyingError = 0x165351d0 {错误域= NSPOSIXErrorDomain代码= 1   "不允许操作"}}

我注意到如果URL来自我的本地应用程序文档文件夹,我可以毫无问题地生成NSData。我想知道是否不允许从相机胶卷中存储的视频中创建NSData。我想知道是否需要使用Photos框架或其他方法才能获得许可。

1 个答案:

答案 0 :(得分:4)

事实证明,我无法直接将Camera Rolls视频的URL转换为NSData,我需要使用PHImageManager来执行此操作(并使用我过去获取的视频的PHAsset的localIdentifier):

PHFetchResult* assets = [PHAsset fetchAssetsWithLocalIdentifiers:@[videoID] options:nil];

PHAsset *asset = assets.firstObject;
if (asset.mediaType == PHAssetMediaTypeVideo) {
    [[PHImageManager defaultManager] requestAVAssetForVideo:asset options:nil resultHandler:^(AVAsset *asset, AVAudioMix *audioMix, NSDictionary *info) {
        if ([asset isKindOfClass:[AVURLAsset class]]) {
            AVURLAsset* urlAsset = (AVURLAsset*)asset;
            NSData *data = [NSData dataWithContentsOfURL:urlAsset.URL];
            [self sendToTwitter:data withMessage:message account: account];
        }
    }];
}

我的猜测是 AVURLAsset * urlAsset 有一些额外的权限信息,我之前通过 [NSURL fileURLWithPath] 的方法没有。