音频剪切、合成、淡入淡出

1,995 阅读2分钟

音频剪切

1.音频剪切比较简单传入音频文件和剪切的时间段就可以了

/** 初始化输出文件路径 */
    NSString *url = "音频源文件路径";
    NSString *outPutPath = "音频前切完成输出文件路径";
    NSURL *audioFileOutput = [NSURL fileURLWithPath:outPutPath];
    [[NSFileManager defaultManager] removeItemAtURL:audioFileOutput error:NULL];
    
    /** 初始化要剪切的音频文件 */
    AVAsset *asset = [AVAsset assetWithURL:url];
    
    AVAssetExportSession *exportSession = [AVAssetExportSession exportSessionWithAsset:asset
                                                                            presetName:AVAssetExportPresetAppleM4A];
    /** 剪切的时间段 */
    CMTimeRange exportTimeRange = CMTimeRangeFromTimeToTime(startTime, endTime);

    exportSession.outputURL = audioFileOutput;
    exportSession.outputFileType = AVFileTypeAppleM4A;
    exportSession.timeRange = exportTimeRange;
    
    [exportSession exportAsynchronouslyWithCompletionHandler:^{
        if (AVAssetExportSessionStatusCompleted == exportSession.status) {
            NSLog(@" FlyElephant \n %@", outPutPath);
        } else if (AVAssetExportSessionStatusFailed == exportSession.status) {
            NSLog(@"FlyElephant error: %@", exportSession.error.localizedDescription);
        }
    }];

音频的合成

1.音频的合成这里的背景是有一段录音需要加一个背景音乐,视频合成的也是一样的道理把音频源文件改成视频,然后相应的配置改成文件就好了。

    NSString *exportPath = @"导出文件路径";
    NSString *url = @"音频源文件路径";
    //音频来源路径
    NSURL *audioUrl = [NSURL fileURLWithPath:url];
    NSURL *backPathUrl = [NSURL fileURLWithPath:backPath];
    //导出路径
    NSURL *exporAudiotPath = [NSURL fileURLWithPath:exportPath];
    //删除相同导出路径的文件
    unlink([exportPath UTF8String]);
    //创建可变的音频视频组合
    AVMutableComposition *mixComposition = [AVMutableComposition composition];
    /** 初始化音频 */
    AVURLAsset *audioAsset = [[AVURLAsset alloc] initWithURL:audioUrl options:nil];
    AVURLAsset *audioBack = [[AVURLAsset alloc] initWithURL:backPathUrl options:nil];
    
    /** 音乐的时间 */
    CMTimeRange audio_timeRange = CMTimeRangeMake(kCMTimeZero,audioAsset.duration);
    
    //获取视频或者音频中的音频轨道
    AVAssetTrack *audioTrack = [[audioAsset tracksWithMediaType:AVMediaTypeAudio] objectAtIndex:0];
    AVAssetTrack *audioBackTrack = [[audioBack tracksWithMediaType:AVMediaTypeAudio] objectAtIndex:0];
    //可变音视频轨道添加一个 音频通道
    AVMutableCompositionTrack *audioCompositionTrack = [mixComposition addMutableTrackWithMediaType:AVMediaTypeAudio preferredTrackID:kCMPersistentTrackID_Invalid];
    AVMutableCompositionTrack *audioCompositionBackTrack = [mixComposition addMutableTrackWithMediaType:AVMediaTypeAudio preferredTrackID:kCMPersistentTrackID_Invalid];
    //插入音频到容器
    [audioCompositionTrack insertTimeRange:audio_timeRange ofTrack:audioTrack atTime:kCMTimeZero error:nil];
    [audioCompositionBackTrack insertTimeRange:audio_timeRange ofTrack:audioBackTrack atTime:kCMTimeZero error:nil];
    
    
    //初始化音频混合器
    AVMutableAudioMix *exportAudioMix = [AVMutableAudioMix audioMix];
    //获取到第二条音轨并且设置他的音量大小
    AVAssetTrack *mixCompositionTrack = [[mixComposition tracksWithMediaType:AVMediaTypeAudio] objectAtIndex:1];
    //初始化音频混合器导出配置参数
    AVMutableAudioMixInputParameters *exportAudioMixInputParameters = [AVMutableAudioMixInputParameters audioMixInputParametersWithTrack:mixCompositionTrack];
    /** 设置第二条音轨的背景音效声音大小 */
    [exportAudioMixInputParameters setVolumeRampFromStartVolume:0 toEndVolume:[AVAudioSession sharedInstance].outputVolume * 0.6 timeRange:audio_timeRange];
    NSArray *audioMixParameters = @[exportAudioMixInputParameters];
    exportAudioMix.inputParameters = audioMixParameters;
    
    
    //创建一个输出
    AVAssetExportSession* assetExport = [[AVAssetExportSession alloc] initWithAsset:mixComposition presetName:AVAssetExportPresetAppleM4A];
    /** 导出文件的地址 */
    assetExport.outputURL = exporAudiotPath;
    /** 导出文件的格式 */
    assetExport.outputFileType = @"com.apple.m4a-audio";
    /** 网络优化 */
    assetExport.shouldOptimizeForNetworkUse = YES;
    assetExport.audioMix = exportAudioMix;
    [assetExport exportAsynchronouslyWithCompletionHandler:
     ^(void ) {
         NSLog(@"?$");
         NSLog(@"完成!输出路径==%@",exportPath);
         if(completion)completion(exportPath);
     }];

音频的淡入淡出

1.音频的淡入只需要设置音频音轨开始的音量从0到正常的音量,淡出只需要设置音轨音量从淡出时间到结束从正常音量到0就行了。

    NSString *exportPath = @"音频导出文件路径";
    NSString *exportPath = @"音频源文件路径";
    //淡入时间
    NSInteger fadeInTime = 5;
    //淡出时间
    NSInteger fadeOutTime = 5;
    //音频来源路径
    NSURL *audioUrl = [NSURL fileURLWithPath:url];
    //导出路径
    NSURL *exporAudiotPath = [NSURL fileURLWithPath:exportPath];
    //删除相同导出路径的文件
    unlink([exportPath UTF8String]);
    //初始化开始时间
    CMTime nextClipStartTime = kCMTimeZero;
    //创建可变的音频视频组合
    AVMutableComposition *mixComposition = [AVMutableComposition composition];
    //初始化音频文件
    AVURLAsset  *audioAsset = [[AVURLAsset alloc] initWithURL:audioUrl options:nil];
    /** 获取音频时长 */
    CMTimeRange audioTimeRange = CMTimeRangeMake(kCMTimeZero,audioAsset.duration);
    
    //创建一个输出
    AVAssetExportSession* assetExport = [[AVAssetExportSession alloc] initWithAsset:mixComposition presetName:AVAssetExportPresetAppleM4A];
    assetExport.outputURL = exporAudiotPath;
    assetExport.outputFileType = @"com.apple.m4a-audio";
    assetExport.shouldOptimizeForNetworkUse = YES;
    //获取音频文件中的音频轨道
    AVAssetTrack *audioTrack = [[audioAsset tracksWithMediaType:AVMediaTypeAudio] objectAtIndex:0];
    //初始化一个音频容器
    AVMutableCompositionTrack *audioCompositionTrack = [mixComposition addMutableTrackWithMediaType:AVMediaTypeAudio preferredTrackID:kCMPersistentTrackID_Invalid];
    //插入音频到容器
    [audioCompositionTrack insertTimeRange:audioTimeRange ofTrack:audioTrack atTime:nextClipStartTime error:nil];
    
    //初始化音频混合器
    AVMutableAudioMix *exportAudioMix = [AVMutableAudioMix audioMix];
    //获取混合后的音轨
    AVAssetTrack *mixCompositionTrack = [[mixComposition tracksWithMediaType:AVMediaTypeAudio] objectAtIndex:0];
    //初始化音频混合器导出配置参数
    AVMutableAudioMixInputParameters *exportAudioMixInputParameters = [AVMutableAudioMixInputParameters audioMixInputParametersWithTrack:mixCompositionTrack];
    
    //初始化淡入淡出持续时间  这个可以根据项目需求来设置这里前5秒淡入音量从0到1.0,最后5秒淡出音量从1.0到0 大家可以根据自己需求修改
    /** 获取当前的音频 */
    CGFloat volume = [AVAudioSession sharedInstance].outputVolume;
    if(fadeInTime > 0){
        //        设置前5秒音乐淡入
        CMTime continueFadeInTime = CMTimeMakeWithSeconds(fadeInTime, 1);
        [exportAudioMixInputParameters setVolumeRampFromStartVolume:0 toEndVolume:volume timeRange:CMTimeRangeMake(CMTimeMakeWithSeconds(0, 1), continueFadeInTime)];
    }
    if(fadeOutTime > 0){
        //        计算开始淡出的时间
        CMTime continueFadeOutTime = CMTimeMakeWithSeconds(fadeOutTime, 1);
        CMTime fadeOutStartTime = CMTimeSubtract(audioAsset.duration, continueFadeOutTime);
        //        设置最后5秒音乐淡出
        [exportAudioMixInputParameters setVolumeRampFromStartVolume:volume toEndVolume:0 timeRange:CMTimeRangeMake(fadeOutStartTime, continueFadeOutTime)];
    }
    //        设置音频混合器参数
    NSArray *audioMixParameters = @[exportAudioMixInputParameters];
    exportAudioMix.inputParameters = audioMixParameters;
    //添加到导出配置中
    assetExport.audioMix = exportAudioMix;
    //开始导出
    [assetExport exportAsynchronouslyWithCompletionHandler:
     ^(void ) {
         NSLog(@"?$");
         NSLog(@"完成!输出路径==%@",exportPath);
         if(completion)completion(exportPath);
     }];