方法只有视频合成,多个视频合成等,至于视频后面加音频那些,各位还是去谷歌吧,话不多说,上代码:
- (void)combineVideos{ NSString *firstVideo = _currentMovieURL.path; NSString *secondVideo = [[NSBundle mainBundle] pathForResource:@"trailVideo" ofType:@"mp4"]; NSDictionary *optDict = [NSDictionary dictionaryWithObject:[NSNumber numberWithBool:NO] forKey:AVURLAssetPreferPreciseDurationAndTimingKey]; AVAsset *firstAsset = [[AVURLAsset alloc] initWithURL:[NSURL fileURLWithPath:firstVideo] options:optDict]; AVAsset *secondAsset = [[AVURLAsset alloc] initWithURL:[NSURL fileURLWithPath:secondVideo] options:optDict]; AVMutableComposition *composition = [AVMutableComposition composition]; //为视频类型的的Track AVMutableCompositionTrack *compositionTrack = [composition addMutableTrackWithMediaType:AVMediaTypeVideo preferredTrackID:kCMPersistentTrackID_Invalid]; //CMTimeRangeMake 指定起去始位置 CMTimeRange firstTimeRange = CMTimeRangeMake(kCMTimeZero, firstAsset.duration); CMTimeRange secondTimeRange = CMTimeRangeMake(kCMTimeZero, secondAsset.duration); AVAssetTrack *track1 = [secondAsset tracksWithMediaType:AVMediaTypeVideo][0]; AVAssetTrack *track2 = [firstAsset tracksWithMediaType:AVMediaTypeVideo][0]; CMTime duration1 = track1.timeRange.duration; CMTime duration2 = track2.timeRange.duration; [compositionTrack insertTimeRange:CMTimeRangeMake(kCMTimeZero, duration1) ofTrack:track1 atTime:kCMTimeZero error:nil]; [compositionTrack insertTimeRange:CMTimeRangeMake(kCMTimeZero, duration2) ofTrack:track2 atTime:kCMTimeZero error:nil]; [compositionTrack insertTimeRange:CMTimeRangeMake(kCMTimeZero, duration1) ofTrack:track1 atTime:kCMTimeZero error:nil]; [compositionTrack insertTimeRange:firstTimeRange ofTrack:track2 atTime:kCMTimeZero error:nil]; //只合并视频,导出后声音会消失,所以需要把声音插入到混淆器中 //添加音频,添加本地其他音乐也可以,与视频一致 AVMutableCompositionTrack *audioTrack = [composition addMutableTrackWithMediaType:AVMediaTypeAudio preferredTrackID:kCMPersistentTrackID_Invalid]; [audioTrack insertTimeRange:secondTimeRange ofTrack:[firstAsset tracksWithMediaType:AVMediaTypeAudio][0] atTime:kCMTimeZero error:nil]; [audioTrack insertTimeRange:firstTimeRange ofTrack:[firstAsset tracksWithMediaType:AVMediaTypeAudio][0] atTime:kCMTimeZero error:nil]; NSString *name = [NSString stringWithFormat:@"%ldcomp.mp4",time(NULL)]; NSString *cachePath = [NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES) lastObject]; NSString *filePath = [cachePath stringByAppendingPathComponent:name]; AVAssetExportSession *exporterSession = [[AVAssetExportSession alloc] initWithAsset:composition presetName:AVAssetExportPresetHighestQuality]; exporterSession.outputFileType = AVFileTypeMPEG4; exporterSession.outputURL = [NSURL fileURLWithPath:filePath]; exporterSession.shouldOptimizeForNetworkUse = YES; //用于互联网传输 [exporterSession exportAsynchronouslyWithCompletionHandler:^{ switch (exporterSession.status) { case AVAssetExportSessionStatusUnknown: NSLog(@"exporter Unknow"); break; case AVAssetExportSessionStatusCancelled: NSLog(@"exporter Canceled"); break; case AVAssetExportSessionStatusFailed: NSLog(@"exporter Failed"); break; case AVAssetExportSessionStatusWaiting: NSLog(@"exporter Waiting"); break; case AVAssetExportSessionStatusExporting: NSLog(@"exporter Exporting"); break; case AVAssetExportSessionStatusCompleted: NSLog(@"exporter Completed"); [self saveRecordingVideo:filePath]; break; } }]; }上面的代码,请注意这里:
AVAssetTrack *track1 = [secondAsset tracksWithMediaType:AVMediaTypeVideo][0]; AVAssetTrack *track2 = [firstAsset tracksWithMediaType:AVMediaTypeVideo][0]; CMTime duration1 = track1.timeRange.duration; [compositionTrack insertTimeRange:CMTimeRangeMake(kCMTimeZero, duration1) ofTrack:track1 atTime:kCMTimeZero error:nil];
视频合成的时候用到insertTimeRange:这个方法,百度和简书上搜到的答案都是写入CMTimeRangeMake(kCMTimeZero, asset.duration)这个参数,这样做合并视频完成之后会有1-2s的黑屏,然后才显示后面的视频,我这种写法是由stackoverflow上的老外给的解决方法,拿到后加入的视频的AVAssetTrack,取到它的timerange的duration然后insettimerange进去,这样就好使了,合并之后没有黑屏出现,破费!
解决黑屏1-2s的链接在这里:stackoverflow老外的解决办法
对于这个合并视频的api我的理解是这样的:比如我要合并12345段视频。我先预备一个池子,先把5扔进去,再把4扔进去,每次扔的时候都让他们的时间点插入到kcmtimezero这个时间,这样后入的就在前面了,类似于iOS导航栈那样。逐个扔,到最后的就显示在第一个,倒序进行合并。
只是项目里用到了这个功能,查到的资料也少,不知道这样理解对不对 有懂得麻烦可以给我留言指正,谢谢
其他文章请查看个人博客:http://zhangqq166.cn/
本人创建了一个公众号,里面每天发一些教程进阶知识,有的是本人总结所得,有的是转载大神的文章,大家一起分享看。
