iOS开发 音频合成,改变音轨音量,改变背景音乐音量,音频剪辑

项目里面的音频合成,看下面代码就可以实现了,这里只简单实现了俩段音轨的合成以及降低其中一个音频的音量功能

//
//  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

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值