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配置推荐

