---页首---

用AVAssetExportSession导出一个修剪的音频

用AVAssetExportSession导出一个修剪的音频

当创建一个 .m4a 输出文件时,该如何配置一个AVAssetExportSession对象修剪音频并执行淡出 ?

AVAssetExportSession对象用于转换AVAsset源的内容,有很多可配置的属性,允许自定义导出操作。由指定的预置的来描述输出,例如AVAssetExportPresetAppleM4A将只生成.m4a文件。

// 演示了一个AVAssetExportSession对象的基本配置,该对象需要导出一个音频资源,该资源被缩减到20秒,并有10秒的淡入时间。在代码段中设置的修剪发生在资源的30秒标记处,因此跟踪持续时间应该至少为50秒。
- (BOOL)exportAsset:(AVAsset *)avAsset toFilePath:(NSString *)filePath {
    
    // 前提需要一个至少50s的音频资源
    CMTime assetTime = [avAsset duration];
    Float64 duration = CMTimeGetSeconds(assetTime);
    if (duration < 50.0) return NO;
    
    // 获取第一个音轨
    NSArray *tracks = [avAsset tracksWithMediaType:AVMediaTypeAudio];
    if ([tracks count] == 0) return NO;
    
    AVAssetTrack *track = [tracks objectAtIndex:0];
    
    // 创建导出会话
    AVAssetExportSession *exportSession = [AVAssetExportSession exportSessionWithAsset:avAsset presetName:AVAssetExportPresetAppleM4A];
    
    if (exportSession == nil) return NO;
    
    // 创建一个裁剪范围 从30s开始的一个20s时长
    CMTime startTime = CMTimeMake(30, 1);
    CMTime stopTime = CMTimeMake(50, 1);
    CMTimeRange exportTimeRange = CMTimeRangeFromTimeToTime(startTime, stopTime);
    
    // 创建一个淡出时间范围,从修剪的时间开始的10s
    CMTime startFadeInTime = startTime;
    CMTime endFadeInTime = CMTimeMake(40, 1);
    CMTimeRange fadeInTimeRange = CMTimeRangeFromTimeToTime(startFadeInTime, endFadeInTime);
    
    // 创建音频混响
    AVMutableAudioMix *exportAudioMix = [AVMutableAudioMix audioMix];
    AVMutableAudioMixInputParameters *exportAudioMixInputParameters = [AVMutableAudioMixInputParameters audioMixInputParametersWithTrack:track];
    [exportAudioMixInputParameters setVolumeRampFromStartVolume:0.0 toEndVolume:1.0 timeRange:fadeInTimeRange];
    exportAudioMix.inputParameters = @[exportAudioMixInputParameters];
    
    // 配置导出会话
    exportSession.outputURL = [NSURL fileURLWithPath:filePath]; // output path
    exportSession.outputFileType = AVFileTypeAppleM4A; // output file type
    exportSession.timeRange = exportTimeRange; // trim time range
    exportSession.audioMix = exportAudioMix; // fade in audio mix
    
    // 执行导出
    [exportSession exportAsynchronouslyWithCompletionHandler:^{
        if (AVAssetExportSessionStatusCompleted == exportSession.status) {
            NSLog(@"completed");
        } else if (AVAssetExportSessionStatusFailed == exportSession.status) {
            NSLog(@"failed");
        } else {
            NSLog(@"Export Seesion Status: %zd", exportSession.status);
        }
    }];
    
    
    return YES;
}

Apple 参考

posted @ 2020-05-19 21:10  20190311  阅读(1046)  评论(0编辑  收藏  举报
---页脚---