iOS 把兩個視屏合并成一個視頻詳細(xì)

- (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];

}

}

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容