PHAsset获得视频URL时,用requestAVAssetForVideo有时会得到AVComposition这个对象

之前用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) {

                                    

                                }];

                            }

你可能感兴趣的:(PHAsset获得视频URL时,用requestAVAssetForVideo有时会得到AVComposition这个对象)