- (void)viewDidLoad
{ ? ? ? [superviewDidLoad];
? ? ? self.array 里面放的是兩個視頻的地址 ?,類型為NSurl
? path 是你合并后的存放的地址路徑
? ? ? ? [self mergeAndExportVideos:self.array withOutPath:path];
?}
- (void)mergeAndExportVideos:(NSMutableArray*)videosPathArraywithOutPath:(NSString*)outpath
{
? ? ? AVMutableComposition*mixComposition ?=[[AVMutableComposition alloc]init];
//音頻軌道
AVMutableCompositionTrack*audioTrack = [mixCompositionaddMutableTrackWithMediaType:AVMediaTypeAudio preferredTrackID:kCMPersistentTrackID_Invalid];
//視頻軌道
AVMutableCompositionTrack*videoTrack = [mixCompositionaddMutableTrackWithMediaType:AVMediaTypeVideo
preferredTrackID:kCMPersistentTrackID_Invalid];
CMTime totalDuration =kCMTimeZero;
for(inti =0; i < videosPathArray.count; i++) {
//AVURLAsset:AVAsset的子類,此類主要用于獲取多媒體的信息,包括視頻、音頻的類型、時長、每秒幀數(shù),其實還可以用來獲取視頻的指定位置的縮略圖。
AVURLAsset*asset = [AVURLAssetassetWithURL:videosPathArray[i]];
NSError*erroraudio =nil;
//獲取AVAsset中的音頻
AVAssetTrack*assetAudioTrack = [[assettracksWithMediaType:AVMediaTypeAudio]firstObject];
//向通道內(nèi)加入音頻
BOOLba = [audioTrackinsertTimeRange:CMTimeRangeMake(kCMTimeZero, asset.duration)
ofTrack:assetAudioTrack
atTime:totalDuration
error:&erroraudio];
NSLog(@"erroraudio:%@%d",erroraudio,ba);
NSError*errorVideo =nil;
//獲取AVAsset中的視頻
AVAssetTrack*assetVideoTrack = [[assettracksWithMediaType:AVMediaTypeVideo]firstObject];
//向通道內(nèi)加入視頻
BOOLbl = [videoTrackinsertTimeRange:CMTimeRangeMake(kCMTimeZero, asset.duration)
ofTrack:assetVideoTrack
atTime:totalDuration
error:&errorVideo];
NSLog(@"errorVideo:%@%d",errorVideo,bl);
totalDuration =CMTimeAdd(totalDuration, asset.duration);
}
//創(chuàng)建合成后寫入的路勁
NSURL*mergeFileURL = [NSURLfileURLWithPath:outpath];
if([[NSFileManagerdefaultManager]fileExistsAtPath:outpath])
{
NSLog(@"有文件");
return;
}
//這里開始導(dǎo)出合成后的視頻
AVAssetExportSession*exporter = [[AVAssetExportSessionalloc]initWithAsset:mixComposition
presetName:AVAssetExportPreset640x480];
exporter.outputURL= mergeFileURL;
NSLog(@"%@",exporter.supportedFileTypes);
if([self.typeisEqualToString:@"mp4"]) {
exporter.outputFileType=AVFileTypeMPEG4;
}else
{
exporter.outputFileType=AVFileTypeQuickTimeMovie;
}
exporter.shouldOptimizeForNetworkUse=YES;
[exporter exportAsynchronouslyWithCompletionHandler:^{
//導(dǎo)出的狀態(tài)
switch(exporter.status) {
caseAVAssetExportSessionStatusUnknown:
NSLog(@"exporter Unknow");
break;
caseAVAssetExportSessionStatusCancelled:
NSLog(@"exporter Canceled");
break;
caseAVAssetExportSessionStatusFailed:
//導(dǎo)出失敗
NSLog(@"exporter Failed");
break;
caseAVAssetExportSessionStatusWaiting:
NSLog(@"exporter Waiting");
break;
caseAVAssetExportSessionStatusExporting:
NSLog(@"exporter Exporting");
break;
caseAVAssetExportSessionStatusCompleted:
//導(dǎo)出成功
NSLog(@"exporter Completed");
dispatch_async(dispatch_get_main_queue(), ^{
//這里是回到你的主線程做一些事情
});
break;
}
}];
}
}
}
- (void)clearCache
{
if([[NSFileManagerdefaultManager]fileExistsAtPath:self.outPath])
{
//這里是你可以刪除你合成后的視頻文件
//self.outPath 是你保存視頻的路勁,當(dāng)然你也可以通過該路勁刪除它
NSLog(@"刪除成功");
[[NSFileManager defaultManager] removeItemAtPath:self.outPath error:nil];
}
}