/*
concat videos and save to saveURL
must save the AVURLAsset in a array
*/
- (void)concatVideos:(NSArray *)videos saveTo:(NSURL *)saveURL completion:(void(^)(NSError *))completion {
// overwrite file
NSError *error;
[self removeFileAt:saveURL error:&error];
// arrays
NSMutableArray *assets = [[NSMutableArray alloc] init];
NSMutableArray *timeRanges = [[NSMutableArray alloc] init];
NSMutableArray *tracks = [[NSMutableArray alloc] init];
for (NSURL *url in videos) {
AVURLAsset *tmpAsset = [AVURLAsset assetWithURL:filePath1];
CMTimeRange range = CMTimeRangeMake(kCMTimeZero, tmpAsset.duration);
[assetsaddObject:tmpAsset];//坑 必须要保存下AVURLAsset
[timeRangesaddObject:[NSValue valueWithCMTimeRange:range]];
[tracksaddObject:[[tmpAsset tracksWithMediaType:AVMediaTypeAudio] firstObject]];
}
// output
AVMutableComposition *composition = [AVMutableComposition composition];
AVMutableCompositionTrack *compositionTrack = [composition addMutableTrackWithMediaType:AVMediaTypeVideo preferredTrackID:kCMPersistentTrackID_Invalid];
[compositionTrack insertTimeRanges:timeRanges ofTracks:tracks atTime:kCMTimeZero error:&error];
// export
AVAssetExportSession *exporter = [[AVAssetExportSession alloc] initWithAsset:composition presetName:AVAssetExportPresetHighestQuality];
if (self.saveFileType) {
exporter.outputFileType =self.saveFileType;
}else {
exporter.outputFileType = AVFileTypeMPEG4;
}
exporter.outputURL = saveURL;
[exporter exportAsynchronouslyWithCompletionHandler:^{
completion(exporter.error);
}];
}