之前用requestAVAssetForVideo来获取url,处理如下
PHImageManager *manager = [PHImageManager defaultManager];
[manager requestAVAssetForVideo:phAsset options:options resultHandler:^(AVAsset * _Nullable asset, AVAudioMix * _Nullable audioMix, NSDictionary * _Nullable info) {
AVURLAsset *urlAsset = (AVURLAsset *)asset;
NSURL *url = urlAsset.URL;
NSData *data = [NSData dataWithContentsOfURL:url];
}]
在处理120帧无声音视频的时候,直接崩溃,原因是AVURLAsset *urlAsset = (AVURLAsset *)asset;因为asset是个基类,它有时会是AVComposition而不是AVURLAsset,这样就得不到视频的url,从而导致程序崩溃。
查看了一些资料发现可以用以下方法来处理
NSArray *assetResources = [PHAssetResource assetResourcesForAsset:phasset];
PHAssetResource *resource;
for (PHAssetResource *assetRes in assetResources) {
if (assetRes.type == PHAssetResourceTypePairedVideo ||
assetRes.type == PHAssetResourceTypeVideo) {
resource = assetRes;
}
}
NSString * fileName = @"";
if (resource.originalFilename) {
fileName = resource.originalFilename;
}
if (phasset.mediaType == PHAssetMediaTypeVideo || phasset.mediaSubtypes == PHAssetMediaSubtypePhotoLive)
{
PHVideoRequestOptions *options = [[PHVideoRequestOptions alloc] init];
options.version = PHImageRequestOptionsVersionCurrent;
options.deliveryMode = PHImageRequestOptionsDeliveryModeHighQualityFormat;
NSString * savePath = [z_Sandbox documentPath:@"22.mp4"];
[[PHAssetResourceManager defaultManager]writeDataForAssetResource:resource toFile:[NSURL fileURLWithPath:savePath] options:nil completionHandler:^(NSError * _Nullable error) {
}];
}