PHVideoRequestOptions *options = [[PHVideoRequestOptions alloc] init];
options.version = PHImageRequestOptionsVersionCurrent;
//如果是選擇icloud里面的視頻,則要在options里打開允許下載的屬性
[manager requestAVAssetForVideo:PHAsset options:videoRequestOptions resultHandler:^(AVAsset * avasset, AVAudioMix * audioMix, NSDictionary * info) {
AVURLAsset *urlAsset = (AVURLAsset *)asset;
NSURL *url = urlAsset.URL;
NSData *data = [NSData dataWithContentsOfURL:url];
//當在這個方法里獲得的avasset為視頻文件,但是有可能會發(fā)生這個錯誤
//-[AVComposition URL]: unrecognized selector sent to instance 0x138d17f40
//這是因為有些視頻可能不存在這個url(比如慢視頻)
//錯誤在AVURLAsset *urlAsset = (AVURLAsset *)asset;這一行代碼。
//因為asset可能是個基類,他可能是AVComposition而不是AVURLAsset,這樣就得不到視頻的url了這樣程序就會崩啦。
//<這里是解決辦法1>
//options.version = PHVideoRequestOptionsVersionOriginal;
//但是這個方法有個缺點是如果是慢視頻,則提交后播放就和正常視頻一樣了
//這是因為,默認的?version?屬性是?PHVideoRequestOptionsVersionCurrent?這項將納入慢動作、 用戶編輯、 修剪等,更改這個屬相就改變了視頻的格式了。
//<所以完美解決的方法出來了>
//給定一個地址URL
NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
NSString *documentsDirectory = paths.firstObject;NSString *myPathDocs = ?[documentsDirectory stringByAppendingPathComponent:[NSString stringWithFormat:@"mergeSlowMoVideo-%d.mov",arc4random() % 1000]];
NSURL *url = [NSURL fileURLWithPath:myPathDocs];
//將這個地址設為視頻的輸出地址
AVAssetExportSession *exporter = [[AVAssetExportSession alloc] initWithAsset:asset presetName:AVAssetExportPresetHighestQuality];
exporter.outputURL = url;
exporter.outputFileType = AVFileTypeQuickTimeMovie;
exporter.shouldOptimizeForNetworkUse = YES;
[exporter exportAsynchronouslyWithCompletionHandler:^{dispatch_async(dispatch_get_main_queue(), ^{if (exporter.status == AVAssetExportSessionStatusCompleted) {
NSURL*URL = exporter.outputURL;
NSData *videoData = [NSData dataWithContentsOfURL:URL];
// Upload
[self uploadSelectedVideo:video data:videoData];
}});
}];
//注意排版可能根據(jù)你的代碼來進行了,我這里將這幾種寫法都放在一起了,如果你要選擇視頻的話,請直接使用這個完美的解決方法。
}];
//順帶附上參考文章地址:
//https://www.itstrike.cn/Question/4329f8fa-fabb-4108-9f60-8846aa64e123.html