//抽取原视频的音频与需要的音乐混合
-(void)addmusic:(id)sender
[MBProgressHUDshowHUDAddedTo:self.viewanimated:YES];
***MutableComposition *composition =[***MutableCompositioncomposition];
audioMixParams =[[NSMutableArrayalloc]initWithObjects:nil];
//录制的视频
NSURL *video_inputFileUrl =[NSURLfileURLWithPath:self.videoPath];
***URLAsset *songAsset =[***URLAssetURLAssetWithURL:video_inputFileUrloptions:nil];
CMTime startTime =CMTimeMakeWithSeconds(0,songAsset.duration.timescale);
CMTime trackDuration =songAsset.
//获取视频中的音频素材
[selfsetUpAndAddAudioAtPath:video_inputFileUrltoComposition:compositionstart:startTimedura:trackDurationoffset:CMTimeMake(14*)];
//本地要插入的音乐
NSString *bundleDirectory =[[NSBundlemainBundle]bundlePath];
NSString *path = [bundleDirectorystringByAppendingPathComponent:@&30secs.mp3&];
NSURL *assetURL2 =[NSURLfileURLWithPath:path];
//获取设置完的本地音乐素材
[selfsetUpAndAddAudioAtPath:assetURL2toComposition:compositionstart:startTimedura:trackDurationoffset:CMTimeMake(0,44100)];
//创建一个可变的音频混合
***MutableAudioMix *audioMix =[***MutableAudioMixaudioMix];
audioMix.inputParameters =[NSArrayarrayWithArray:audioMixParams];//从数组里取出处理后的音频轨道参数
//创建一个输出
***AssetExportSession *exporter =[[***AssetExportSessionalloc]
initWithAsset:composition
presetName:***AssetExportPresetAppleM4A];
exporter.audioMix = audioM
exporter.outputFileType=@&com.apple.m4a-audio&;
NSString* fileName =[NSStringstringWithFormat:@&%@.mov&,@&overMix&];
//输出路径
NSString *exportFile =[NSStringstringWithFormat:@&%@/%@&,[selfgetLibarayPath], fileName];
if([[NSFileManagerdefaultManager]fileExistsAtPath:exportFile]) {
[[NSFileManagerdefaultManager]removeItemAtPath:exportFileerror:nil];
NSLog(@&是否在主线程1%d&,[NSThreadisMainThread]);
NSLog(@&输出路径===%@&,exportFile);
NSURL *exportURL =[NSURLfileURLWithPath:exportFile];
exporter.outputURL = exportURL;
self.mixURL =exportURL;
[exporterexportAsynchronouslyWithCompletionHandler:^{
int exportStatus =(int)exporter.
switch (exportStatus){
case***AssetExportSessionStatusFailed:{
NSError *exportError =exporter.
NSLog(@&错误,信息: %@&, exportError);
[MBProgressHUDhideHUDForView:self.viewanimated:YES];
case***AssetExportSessionStatusCompleted:{
NSLog(@&是否在主线程2%d&,[NSThreadisMainThread]);
NSLog(@&成功&);
//最终混合
[selftheVideoWithMixMusic];
//最终音频和视频混合
-(void)theVideoWithMixMusic
NSError *error =
NSFileManager *fileMgr =[NSFileManagerdefaultManager];
NSString *documentsDirectory =[NSHomeDirectory()
stringByAppendingPathComponent:@&Documents&];
NSString *videoOutputPath =[documentsDirectorystringByAppendingPathComponent:@&test_output.mp4&];
if ([fileMgrremoveItemAtPath:videoOutputPatherror:&error]!=YES) {
NSLog(@&无法删除文件,错误信息:%@&,[error localizedDescription]);
//声音来源路径(最终混合的音频)
*audio_inputFileUrl =self.mixURL;
//视频来源路径
*video_inputFileUrl = [NSURLfileURLWithPath:self.videoPath];
//最终合成输出路径
NSString *outputFilePath =[documentsDirectorystringByAppendingPathComponent:@&final_video.mp4&];
*outputFileUrl = [NSURLfileURLWithPath:outputFilePath];
if([[NSFileManagerdefaultManager]fileExistsAtPath:outputFilePath])
[[NSFileManagerdefaultManager]removeItemAtPath:outputFilePatherror:nil];
CMTime nextClipStartTime =kCMTimeZ
//创建可变的音频视频组合
***MutableComposition* mixComposition =[***MutableCompositioncomposition];
//视频采集
***URLAsset* videoAsset =[[***URLAssetalloc]initWithURL:video_inputFileUrloptions:nil];
CMTimeRange video_timeRange =CMTimeRangeMake(kCMTimeZero,videoAsset.duration);
***MutableCompositionTrack*a_compositionVideoTrack = [mixCompositionaddMutableTrackWithMediaType:***MediaTypeVideopreferredTrackID:kCMPersistentTrackID_Invalid];
[a_compositionVideoTrackinsertTimeRange:video_timeRangeofTrack:[[videoAssettracksWithMediaType:***MediaTypeVideo]objectAtIndex:0]atTime:nextClipStartTimeerror:nil];
//声音采集
***URLAsset* audioAsset =[[***URLAssetalloc]initWithURL:audio_inputFileUrloptions:nil];
CMTimeRange audio_timeRange =CMTimeRangeMake(kCMTimeZero,videoAsset.duration);//声音长度截取范围==视频长度
***MutableCompositionTrack*b_compositionAudioTrack = [mixCompositionaddMutableTrackWithMediaType:***MediaTypeAudiopreferredTrackID:kCMPersistentTrackID_Invalid];
[b_compositionAudioTrackinsertTimeRange:audio_timeRangeofTrack:[[audioAssettracksWithMediaType:***MediaTypeAudio]objectAtIndex:0]atTime:nextClipStartTimeerror:nil];
//创建一个输出
***AssetExportSession* _assetExport =[[***AssetExportSessionalloc]initWithAsset:mixCompositionpresetName:***AssetExportPresetMediumQuality];
_assetExport.outputFileType =***FileTypeQuickTimeM
_assetExport.outputURL =outputFileU
_assetExport.shouldOptimizeForNetworkUse=YES;
self.theEndVideoURL=outputFileU
[_assetExportexportAsynchronouslyWithCompletionHandler:
^(void ) {
[MBProgressHUDhideHUDForView:self.viewanimated:YES];
NSURL*url = [NSURLfileURLWithPath:outputFilePath];
MPMoviePlayerViewController *theMovie =[[MPMoviePlayerViewControlleralloc]initWithContentURL:url];
[selfpresentMoviePlayerViewControllerAnimated:theMovie];
theMovie.moviePlayer.movieSourceType=MPMovieSourceTypeF
[theMovie.moviePlayerplay];
NSLog(@&完成!输出路径==%@&,outputFilePath);
//通过文件路径建立和添加音频素材
- (void)setUpAndAddAudioAtPath:(NSURL*)assetURLtoComposition:(***MutableComposition*)composition start:(CMTime)startdura:(CMTime)duraoffset:(CMTime)offset{
***URLAsset *songAsset =[***URLAssetURLAssetWithURL:assetURLoptions:nil];
***MutableCompositionTrack *track =[compositionaddMutableTrackWithMediaType:***MediaTypeAudiopreferredTrackID:kCMPersistentTrackID_Invalid];
***AssetTrack *sourceAudioTrack =[[songAssettracksWithMediaType:***MediaTypeAudio]objectAtIndex:0];
NSError *error =
BOOL ok =NO;
CMTime startTime =
CMTime trackDuration =
CMTimeRange tRange =CMTimeRangeMake(startTime,trackDuration);
//设置音量
//***MutableAudioMixInputParameters(输入参数可变的音频混合)
//audioMixInputParametersWithTrack(音频混音输入参数与轨道)
***MutableAudioMixInputParameters *trackMix =[***MutableAudioMixInputParametersaudioMixInputParametersWithTrack:track];
[trackMixsetVolume:0.8fatTime:startTime];
//素材加入数组
[audioMixParamsaddObject:trackMix];
//Insert audio into track
//offsetCMTimeMake(0, 44100)
ok = [trackinsertTimeRange:tRangeofTrack:sourceAudioTrackatTime:kCMTimeInvaliderror:&error];
#pragma mark - 保存路径
-(NSString*)getLibarayPath
NSFileManager *fileManager =[NSFileManagerdefaultManager];
NSArray* paths =NSSearchPathForDirectoriesInDomains(NSDocumentDirectory,NSUserDomainMask,YES);
NSString* path = [pathsobjectAtIndex:0];
NSString *movDirectory = [pathstringByAppendingPathComponent:@&tmpMovMix&];
[fileManagercreateDirectoryAtPath:movDirectorywithIntermediateDirectories:YESattributes:nilerror:nil];
return movD
本文已收录于以下专栏:
相关文章推荐
Duration = MAX(input a, v)1. Audio merge1.1 amerge-ac 2 speed up
ffmpeg -i test.mp4 -i test.mp3 -fil...
ios上音频文件合成有多种方法,一是使用***AssetExportSession结合***MutableComposition,二是使用***AssetReader和***AssetWriter. 三是转换...
网络绝对是任何系统的核心,对于容器而言也是如此。Docker 作为目前最火的轻量级容器技术,有很多令人称道的功能,如 Docker 的镜像管理。然而,Docker的网络一直以来都比较薄弱,所以我们有必要深入了解Docker的网络知识,以满足更高的网络需求。
裁剪视频是很久之前所做的项目中用到的,现在又看到了,整理一下。
与之相关的这些类有些抽象,所以我这里重点将它们具体化。用代码将视频合成其实与***/vegas等软件将视频合成的过程类似,首先了解下...
使用***MutableComposition将声音与视频合成一个视频
iOS 如何对音频、视频合成,配音、卡拉OK技术iOS原生的开发框架集成了丰富的视频/音频处理功能,所以用不着去找第三方框架。只要:#import ***Foundation基本上能满足大部分的音频/视...
因为最近在做关于视频相关的一些东西,有一个是给视频添加背景音乐或者配音,自己Google和百度了一些代码,将代码共享出来:/**
为了方便,我都将选取的视频和音乐文件以及导出的视频将路径设置在桌...
最近在研究剪辑视频,目前知道了怎么剪辑视频片段和添加背景音乐,不多说了,代码写的很清楚,如下:
//抽取原视频的音频与需要的音乐混合
-(void)addmusic:(id)sender
[MBProgressHUD
showHUDAddedTo:self.view
animate...
这几天抽空把WWDC的Session看了一些,总结了一些iOS11新的特性,可能对我们的App有影响,需要我们进行适配。本文作为一个总结。
本文内容包括:集成了搜索的大标题栏、横向选项...
他的最新文章
讲师:董西成
讲师:唐宇迪
您举报文章:
举报原因:
原文地址:
原因补充:
(最多只允许输入30个字)[][][][][][][][][][][][]
最新文章热门文章
[][][][][][][][][][][][]
[][][][][][][][][][][][]
新手必看: 游戏资料: 游戏进阶:
12-2009-1209-1007-27
09-1605-0104-2604-04
今日推荐有奖活动
随着2017年KPL秋季赛开赛时间的临近,各支队伍也已整装待发。
【心游揭秘第二期】:最游良心的卡牌游戏《游戏王YGOMobile》!
英雄为棋,天下为局!《三国群英传-霸王之业》9月12日不删档强势开启!
天天酷跑周年庆开启,决战吸血鬼玩法,上线玩游戏截图就有好礼相送。
日期名称状态下载号
09-21公测09-22内测09-22内测09-22公测09-25封测09-28内测09-28公测09-30公测10-12公测10-18内测10-19公测
12345678910
日期名称号
09-1308-0908-0908-0708-0708-0408-0308-0308-02
京公网安备 92 京ICP证140355号 京网文【-109号
未成年人家长监护分享到:更多
类型:射击游戏评分:语言:中文
游戏大礼包手游开测表
共和国之辉:红警安卓双11礼包口袋妖怪复刻双11狂欢礼包天子光棍节双十一疯狂派对礼包幻灵首发游戏园礼包明珠三国2光棍节约玩双端礼包《口袋妖怪重制》更新畅享礼包
11-16公测11-15内测11-14内测11-14内测11-10内测11-08内测11-04公测11-03公测11-01内测11-01内测
推荐阅读本月最新
手游排行网游单机
12345678910
12345678910