项目里面的音频合成,看下面代码就可以实现了,这里只简单实现了俩段音轨的合成以及降低其中一个音频的音量功能
//
// NoticeAudioJoinToAudioModel.m
// NoticeXi
//
// Created by li lei on 2022/4/1.
// Copyright © 2022 zhaoxiaoer. All rights reserved.
//
#import "NoticeAudioJoinToAudioModel.h"
@implementation NoticeAudioJoinToAudioModel
/// 音频合成的方法,可以实现音频合成,不同音频音量的不同
/// @param audioPath 录音的音频文件地址
/// @param bgmPath 本地或者网络的音频文件地址
/// @param isTuiJian 这个是自己项目的bool值,可以不管
- (void)recoderAudioPath:(NSString *)audioPath bgmPath:(NSString *)bgmPath isTuijian:(BOOL)isTuiJian{
AVURLAsset *audioAsset = [AVURLAsset assetWithURL:[NSURL fileURLWithPath:audioPath]];
AVURLAsset *bgmAsset = [AVURLAsset assetWithURL:[NSURL URLWithString:bgmPath]];
CMTime audioDuration = audioAsset.duration;
float audioDurationSeconds = CMTimeGetSeconds(audioDuration);
CMTime bgmDuration = bgmAsset.duration;//录音时长
float bgmDurationSeconds = CMTimeGetSeconds(bgmDuration);//bgm时长
AVMutableComposition *compostion = [AVMutableComposition composition];
AVMutableCompositionTrack *bgmAudio = [compostion addMutableTrackWithMediaType:AVMediaTypeAudio preferredTrackID:0];
if (audioDurationSeconds > bgmDurationSeconds) {//如果录音时长大于bgm时长,则bgm时间合成为原时长,否则截取为bgm时间
[bgmAudio insertTimeRange:CMTimeRangeMake(kCMTimeZero, bgmAsset.duration) ofTrack:[bgmAsset tracksWithMediaType:AVMediaTypeAudio].firstObject atTime:kCMTimeZero error:nil];
AVMutableCompositionTrack *bgmAudio1 = [compostion addMutableTrackWithMediaType:AVMediaTypeAudio preferredTrackID:0];
if (bgmDurationSeconds*2 > audioDurationSeconds) {//如果bgm双倍合成大于录音时长,则取录音时长
[bgmAudio1 insertTimeRange:CMTimeRangeMake(kCMTimeZero, CMTimeMakeWithSeconds(audioDurationSeconds-bgmDurationSeconds,bgmAsset.duration.timescale)) ofTrack:[bgmAsset tracksWithMediaType:AVMediaTypeAudio].firstObject atTime:bgmAsset.duration error:nil];
}else{
[bgmAudio1 insertTimeRange:CMTimeRangeMake(kCMTimeZero, CMTimeMakeWithSeconds(0,bgmAsset.duration.timescale)) ofTrack:[bgmAsset tracksWithMediaType:AVMediaTypeAudio].firstObject atTime:bgmAsset.duration error:nil];
}
}else{
[bgmAudio insertTimeRange:CMTimeRangeMake(kCMTimeZero, audioAsset.duration) ofTrack:[bgmAsset tracksWithMediaType:AVMediaTypeAudio].firstObject atTime:kCMTimeZero error:nil];
}
AVMutableCompositionTrack *audio = [compostion addMutableTrackWithMediaType:AVMediaTypeAudio preferredTrackID:0];
[audio insertTimeRange:CMTimeRangeMake(kCMTimeZero, audioAsset.duration) ofTrack:[audioAsset tracksWithMediaType:AVMediaTypeAudio].firstObject atTime:kCMTimeZero error:nil];
NSString *_filePath = NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES).firstObject;
_filePath = [_filePath stringByAppendingPathComponent:@"user"];
NSFileManager *manage = [NSFileManager defaultManager];
if ([manage createDirectoryAtPath:_filePath withIntermediateDirectories:YES attributes:nil error:nil])
{
_filePath = [_filePath stringByAppendingPathComponent:@"testAudio.aac"];
}
//修改背景音乐的音量,这个可以修改不同音轨的音量,实现不同音轨音频的音量不一样以及淡入淡出效果
AVMutableAudioMix *videoAudioMixTools = [AVMutableAudioMix audioMix];
NSMutableArray * params = [[NSMutableArray alloc] initWithCapacity:0];
if (bgmAsset) {
//调节音量
//获取音频轨道
AVMutableAudioMixInputParameters *firstAudioParam = [AVMutableAudioMixInputParameters audioMixInputParametersWithTrack:bgmAudio];
//设置音轨音量,可以设置渐变,设置为1.0就是全音量
[firstAudioParam setVolumeRampFromStartVolume:0.01 toEndVolume:0.1 timeRange:CMTimeRangeMake(kCMTimeZero, audioAsset.duration)];
[firstAudioParam setTrackID:bgmAudio.trackID];
[params addObject:firstAudioParam];
}
videoAudioMixTools.inputParameters = [NSArray arrayWithArray:params];
//合并音频
AVAssetExportSession *session = [[AVAssetExportSession alloc]initWithAsset:compostion presetName:AVAssetExportPresetAppleM4A];
NSString *outPutFilePath = [[_filePath stringByDeletingLastPathComponent] stringByAppendingPathComponent:@"Audio.m4a"];
if ([[NSFileManager defaultManager] fileExistsAtPath:outPutFilePath])
{
[[NSFileManager defaultManager] removeItemAtPath:outPutFilePath error:nil];
}
__weak typeof(self) weakSelf = self;
session.outputURL = [NSURL fileURLWithPath:outPutFilePath];
session.outputFileType = @"com.apple.m4a-audio";
session.shouldOptimizeForNetworkUse = YES;
session.audioMix = videoAudioMixTools;
[session exportAsynchronouslyWithCompletionHandler:^{
if ([[NSFileManager defaultManager] fileExistsAtPath:outPutFilePath])
{
dispatch_async(dispatch_get_main_queue(), ^{
//放在主线程中
// 调用播放方法,这里已经合成完毕,可以上传到自己后台,也可以当地播放
DRLog(@"合成位置%@",outPutFilePath);
if (weakSelf.audioBlock) {
weakSelf.audioBlock(outPutFilePath, 0);
}
});
}
else
{
dispatch_async(dispatch_get_main_queue(), ^{
DRLog(@"输出错误");
if (weakSelf.audioBlock) {
weakSelf.audioBlock(outPutFilePath, 1);
}
});
}
}];
}
@end