iOS视频添加背景音乐同时保留原音

发布时间 - 2026-01-11 00:26:34    点击率:

话不多说,请看代码:

//抽取原视频的音频与需要的音乐混合 
-(void)addmusic:(id)sender 
{ 
 [MBProgressHUDshowHUDAddedTo:self.viewanimated:YES]; 

 AVMutableComposition *composition =[AVMutableCompositioncomposition]; 
 audioMixParams =[[NSMutableArrayalloc]initWithObjects:nil]; 

 //录制的视频 
 NSURL *video_inputFileUrl =[NSURLfileURLWithPath:self.videoPath]; 
 AVURLAsset *songAsset =[AVURLAssetURLAssetWithURL:video_inputFileUrloptions:nil]; 
 CMTime startTime =CMTimeMakeWithSeconds(0,songAsset.duration.timescale); 
 CMTime trackDuration =songAsset.duration; 

 //获取视频中的音频素材 
 [selfsetUpAndAddAudioAtPath:video_inputFileUrltoComposition:compositionstart:startTimedura:trackDurationoffset:CMTimeMake(14*44100,44100)]; 

 //本地要插入的音乐 
 NSString *bundleDirectory =[[NSBundlemainBundle]bundlePath]; 
 NSString *path = [bundleDirectorystringByAppendingPathComponent:@"30secs.mp3"]; 
 NSURL *assetURL2 =[NSURLfileURLWithPath:path]; 
 //获取设置完的本地音乐素材 
 [selfsetUpAndAddAudioAtPath:assetURL2toComposition:compositionstart:startTimedura:trackDurationoffset:CMTimeMake(0,44100)]; 

 //创建一个可变的音频混合 
 AVMutableAudioMix *audioMix =[AVMutableAudioMixaudioMix]; 
 audioMix.inputParameters =[NSArrayarrayWithArray:audioMixParams];//从数组里取出处理后的音频轨道参数 

 //创建一个输出 
 AVAssetExportSession *exporter =[[AVAssetExportSessionalloc] 
        initWithAsset:composition 
        presetName:AVAssetExportPresetAppleM4A]; 
 exporter.audioMix = audioMix; 
 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.status; 
  switch (exportStatus){ 
   caseAVAssetExportSessionStatusFailed:{ 
    NSError *exportError =exporter.error; 
    NSLog(@"错误,信息: %@", exportError); 
    [MBProgressHUDhideHUDForView:self.viewanimated:YES]; 
    break; 
   } 
   caseAVAssetExportSessionStatusCompleted:{ 
    NSLog(@"是否在主线程2%d",[NSThreadisMainThread]); 
    NSLog(@"成功"); 
    //最终混合 
    [selftheVideoWithMixMusic]; 
    break; 
   } 
  } 
 }]; 
} 

//最终音频和视频混合 
-(void)theVideoWithMixMusic 
{ 
 NSError *error =nil; 
 NSFileManager *fileMgr =[NSFileManagerdefaultManager]; 
 NSString *documentsDirectory =[NSHomeDirectory() 
        stringByAppendingPathComponent:@"Documents"]; 
 NSString *videoOutputPath =[documentsDirectorystringByAppendingPathComponent:@"test_output.mp4"]; 
 if ([fileMgrremoveItemAtPath:videoOutputPatherror:&error]!=YES) { 
  NSLog(@"无法删除文件,错误信息:%@",[error localizedDescription]); 
 } 

 //声音来源路径(最终混合的音频) 
 NSURL *audio_inputFileUrl =self.mixURL; 

 //视频来源路径 
 NSURL *video_inputFileUrl = [NSURLfileURLWithPath:self.videoPath]; 

 //最终合成输出路径 
 NSString *outputFilePath =[documentsDirectorystringByAppendingPathComponent:@"final_video.mp4"]; 
 NSURL *outputFileUrl = [NSURLfileURLWithPath:outputFilePath]; 

 if([[NSFileManagerdefaultManager]fileExistsAtPath:outputFilePath]) 
  [[NSFileManagerdefaultManager]removeItemAtPath:outputFilePatherror:nil]; 

 CMTime nextClipStartTime =kCMTimeZero; 

 //创建可变的音频视频组合 
 AVMutableComposition* mixComposition =[AVMutableCompositioncomposition]; 

 //视频采集 
 AVURLAsset* videoAsset =[[AVURLAssetalloc]initWithURL:video_inputFileUrloptions:nil]; 
 CMTimeRange video_timeRange =CMTimeRangeMake(kCMTimeZero,videoAsset.duration); 
 AVMutableCompositionTrack*a_compositionVideoTrack = [mixCompositionaddMutableTrackWithMediaType:AVMediaTypeVideopreferredTrackID:kCMPersistentTrackID_Invalid]; 
 [a_compositionVideoTrackinsertTimeRange:video_timeRangeofTrack:[[videoAssettracksWithMediaType:AVMediaTypeVideo]objectAtIndex:0]atTime:nextClipStartTimeerror:nil]; 

 //声音采集 
 AVURLAsset* audioAsset =[[AVURLAssetalloc]initWithURL:audio_inputFileUrloptions:nil]; 
 CMTimeRange audio_timeRange =CMTimeRangeMake(kCMTimeZero,videoAsset.duration);//声音长度截取范围==视频长度 
 AVMutableCompositionTrack*b_compositionAudioTrack = [mixCompositionaddMutableTrackWithMediaType:AVMediaTypeAudiopreferredTrackID:kCMPersistentTrackID_Invalid]; 
 [b_compositionAudioTrackinsertTimeRange:audio_timeRangeofTrack:[[audioAssettracksWithMediaType:AVMediaTypeAudio]objectAtIndex:0]atTime:nextClipStartTimeerror:nil]; 

 //创建一个输出 
 AVAssetExportSession* _assetExport =[[AVAssetExportSessionalloc]initWithAsset:mixCompositionpresetName:AVAssetExportPresetMediumQuality]; 
 _assetExport.outputFileType =AVFileTypeQuickTimeMovie; 
 _assetExport.outputURL =outputFileUrl; 
 _assetExport.shouldOptimizeForNetworkUse=YES; 
 self.theEndVideoURL=outputFileUrl; 

 [_assetExportexportAsynchronouslyWithCompletionHandler: 
 ^(void ) { 
  [MBProgressHUDhideHUDForView:self.viewanimated:YES]; 
  //播放 
  NSURL*url = [NSURLfileURLWithPath:outputFilePath]; 
  MPMoviePlayerViewController *theMovie =[[MPMoviePlayerViewControlleralloc]initWithContentURL:url]; 
  [selfpresentMoviePlayerViewControllerAnimated:theMovie]; 
  theMovie.moviePlayer.movieSourceType=MPMovieSourceTypeFile; 
  [theMovie.moviePlayerplay]; 
 } 
 ]; 
 NSLog(@"完成!输出路径==%@",outputFilePath); 
} 

//通过文件路径建立和添加音频素材 
- (void)setUpAndAddAudioAtPath:(NSURL*)assetURLtoComposition:(AVMutableComposition*)composition start:(CMTime)startdura:(CMTime)duraoffset:(CMTime)offset{ 

 AVURLAsset *songAsset =[AVURLAssetURLAssetWithURL:assetURLoptions:nil]; 

 AVMutableCompositionTrack *track =[compositionaddMutableTrackWithMediaType:AVMediaTypeAudiopreferredTrackID:kCMPersistentTrackID_Invalid]; 
 AVAssetTrack *sourceAudioTrack =[[songAssettracksWithMediaType:AVMediaTypeAudio]objectAtIndex:0]; 

 NSError *error =nil; 
 BOOL ok =NO; 

 CMTime startTime = start; 
 CMTime trackDuration = dura; 
 CMTimeRange tRange =CMTimeRangeMake(startTime,trackDuration); 

 //设置音量 
 //AVMutableAudioMixInputParameters(输入参数可变的音频混合) 
 //audioMixInputParametersWithTrack(音频混音输入参数与轨道) 
 AVMutableAudioMixInputParameters *trackMix =[AVMutableAudioMixInputParametersaudioMixInputParametersWithTrack: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 movDirectory; 
} 

以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,同时也希望多多支持!


# ios添加音乐  # ios视频添加音乐  # 视频添加音乐保留原声  # 讲解iOS开发中对音效和音乐播放的简单实现  # iOS App中实现播放音效和音乐功能的简单示例  # 实例解析iOS中音乐播放器应用开发的基本要点  # iOS开发中音频工具类的封装以及音乐播放器的细节控制  # iOS实现播放远程网络音乐的核心技术点总结  # ios开发:一个音乐播放器的设计与实现案例  # iOS利用AVPlayer播放网络音乐的方法教程  # iOS中关于音乐锁屏控制音乐(锁屏信息设置)的实例代码  # 运用iOS教你轻松制作音乐播放器  # iOS实现获取系统iTunes音乐的方法示例  # 创建一个  # 多说  # 错误信息  # 混音  # 里取出  # 视频采集  # NSStringstringWithFormat  # mov  # fileName  # NSFileManagerdefaultManager  # audio  # overMix  # fileExistsAtPath  # removeItemAtPath  # exportFileerror  # exportFile  # selfgetLibarayPath  # AVAssetExportSession  # exporter  # AVAssetExportSessionalloc 


相关栏目: 【 网站优化151355 】 【 网络推广146373 】 【 网络技术251813 】 【 AI营销90571


相关推荐: 如何用IIS7快速搭建并优化网站站点?  Thinkphp 中 distinct 的用法解析  Laravel怎么进行数据库回滚_Laravel Migration数据库版本控制与回滚操作  Python面向对象测试方法_mock解析【教程】  百度浏览器如何管理插件 百度浏览器插件管理方法  html5的keygen标签为什么废弃_替代方案说明【解答】  微信小程序 canvas开发实例及注意事项  Laravel如何实现邮件验证激活账户_Laravel内置MustVerifyEmail接口配置【步骤】  Laravel模型关联查询教程_Laravel Eloquent一对多关联写法  微信小程序制作网站有哪些,微信小程序需要做网站吗?  网站制作价目表怎么做,珍爱网婚介费用多少?  JS中使用new Date(str)创建时间对象不兼容firefox和ie的解决方法(两种)  Laravel中间件起什么作用_Laravel Middleware请求生命周期与自定义详解  如何快速搭建高效可靠的建站解决方案?  Laravel表单请求验证类怎么用_Laravel Form Request分离验证逻辑教程  如何在新浪SAE免费搭建个人博客?  Laravel如何与Vue.js集成_Laravel + Vue前后端分离项目搭建指南  如何基于云服务器快速搭建个人网站?  用yum安装MySQLdb模块的步骤方法  如何在宝塔面板创建新站点?  在线制作视频网站免费,都有哪些好的动漫网站?  Laravel怎么使用Session存储数据_Laravel会话管理与自定义驱动配置【详解】  详解jQuery停止动画——stop()方法的使用  开心动漫网站制作软件下载,十分开心动画为何停播?  零服务器AI建站解决方案:快速部署与云端平台低成本实践  如何在宝塔面板中修改默认建站目录?  手机网站制作平台,手机靓号代理商怎么制作属于自己的手机靓号网站?  轻松掌握MySQL函数中的last_insert_id()  北京网站制作费用多少,建立一个公司网站的费用.有哪些部分,分别要多少钱?  如何在HTML表单中获取用户输入并用JavaScript动态控制复利计算循环  Laravel Eloquent访问器与修改器是什么_Laravel Accessors & Mutators数据处理技巧  Laravel如何实现全文搜索功能?(Scout和Algolia示例)  Laravel怎么实现软删除SoftDeletes_Laravel模型回收站功能与数据恢复【步骤】  Laravel如何实现URL美化Slug功能_Laravel使用eloquent-sluggable生成别名【方法】  laravel怎么用DB facade执行原生SQL查询_laravel DB facade原生SQL执行方法  如何在IIS管理器中快速创建并配置网站?  网站制作大概多少钱一个,做一个平台网站大概多少钱?  Mybatis 中的insertOrUpdate操作  高配服务器限时抢购:企业级配置与回收服务一站式优惠方案  Angular 表单中正确绑定输入值以确保提交与验证正常工作  canvas 画布在主流浏览器中的尺寸限制详细介绍  VIVO手机上del键无效OnKeyListener不响应的原因及解决方法  Laravel的路由模型绑定怎么用_Laravel Route Model Binding简化控制器逻辑  如何在阿里云通过域名搭建网站?  laravel怎么配置和使用PHP-FPM来优化性能_laravel PHP-FPM配置与性能优化方法  音乐网站服务器如何优化API响应速度?  昵图网官方站入口 昵图网素材图库官网入口  公司网站制作价格怎么算,公司办个官网需要多少钱?  高端网站建设与定制开发一站式解决方案 中企动力  韩国网站服务器搭建指南:VPS选购、域名解析与DNS配置推荐