用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;
}