我的应用程序包括用户录制简短消息的能力;我想从录制的开始和结束中删除任何静音(或者更确切地说,任何音量低于给定阈值的音频)。
我正在使用AVAudioRecorder录制音频,并将其保存为.aif文件。我已经在其他地方看到了一些方法,我可以让它等待开始录音直到音频电平达到阈值;那会让我走到一半,但不会在最后修剪沉默。
如果有一个简单的方法可以做到这一点,我将永远感激不尽!
感谢。
答案 0 :(得分:3)
此项目从麦克风接收音频,在嘈杂时触发,在安静时触发非触发。它还会在两端修剪和淡入/淡出。
https://github.com/fulldecent/FDSoundActivatedRecorder
您正在寻找的相关代码:
- (NSString *)recordedFilePath
{
// Prepare output
NSString *trimmedAudioFileBaseName = [NSString stringWithFormat:@"recordingConverted%x.caf", arc4random()];
NSString *trimmedAudioFilePath = [NSTemporaryDirectory() stringByAppendingPathComponent:trimmedAudioFileBaseName];
NSFileManager *fileManager = [NSFileManager defaultManager];
if ([fileManager fileExistsAtPath:trimmedAudioFilePath]) {
NSError *error;
if ([fileManager removeItemAtPath:trimmedAudioFilePath error:&error] == NO) {
NSLog(@"removeItemAtPath %@ error:%@", trimmedAudioFilePath, error);
}
}
NSLog(@"Saving to %@", trimmedAudioFilePath);
AVAsset *avAsset = [AVAsset assetWithURL:self.audioRecorder.url];
NSArray *tracks = [avAsset tracksWithMediaType:AVMediaTypeAudio];
AVAssetTrack *track = [tracks objectAtIndex:0];
AVAssetExportSession *exportSession = [AVAssetExportSession
exportSessionWithAsset:avAsset
presetName:AVAssetExportPresetAppleM4A];
// create trim time range
CMTime startTime = CMTimeMake(self.recordingBeginTime*SAVING_SAMPLES_PER_SECOND, SAVING_SAMPLES_PER_SECOND);
CMTimeRange exportTimeRange = CMTimeRangeFromTimeToTime(startTime, kCMTimePositiveInfinity);
// create fade in time range
CMTime startFadeInTime = startTime;
CMTime endFadeInTime = CMTimeMake(self.recordingBeginTime*SAVING_SAMPLES_PER_SECOND + RISE_TRIGGER_INTERVALS*INTERVAL_SECONDS*SAVING_SAMPLES_PER_SECOND, SAVING_SAMPLES_PER_SECOND);
CMTimeRange fadeInTimeRange = CMTimeRangeFromTimeToTime(startFadeInTime, endFadeInTime);
// setup audio mix
AVMutableAudioMix *exportAudioMix = [AVMutableAudioMix audioMix];
AVMutableAudioMixInputParameters *exportAudioMixInputParameters =
[AVMutableAudioMixInputParameters audioMixInputParametersWithTrack:track];
[exportAudioMixInputParameters setVolumeRampFromStartVolume:0.0 toEndVolume:1.0
timeRange:fadeInTimeRange];
exportAudioMix.inputParameters = [NSArray
arrayWithObject:exportAudioMixInputParameters];
// configure export session output with all our parameters
exportSession.outputURL = [NSURL fileURLWithPath:trimmedAudioFilePath];
exportSession.outputFileType = AVFileTypeAppleM4A;
exportSession.timeRange = exportTimeRange;
exportSession.audioMix = exportAudioMix;
// MAKE THE EXPORT SYNCHRONOUS
dispatch_semaphore_t semaphore = dispatch_semaphore_create(0);
[exportSession exportAsynchronouslyWithCompletionHandler:^{
dispatch_semaphore_signal(semaphore);
}];
dispatch_semaphore_wait(semaphore, DISPATCH_TIME_FOREVER);
if (AVAssetExportSessionStatusCompleted == exportSession.status) {
NSLog(@"AVAssetExportSessionStatusCompleted");
return trimmedAudioFilePath;
} else if (AVAssetExportSessionStatusFailed == exportSession.status) {
// a failure may happen because of an event out of your control
// for example, an interruption like a phone call comming in
// make sure and handle this case appropriately
NSLog(@"AVAssetExportSessionStatusFailed %@", exportSession.error.localizedDescription);
} else {
NSLog(@"Export Session Status: %d", exportSession.status);
}
return nil;
}
答案 1 :(得分:0)
我正在使用AVAudioRecorder录制音频,并将其保存为.aif文件。我已经在其他地方看到了一些方法,我可以让它等待开始录音直到音频电平达到阈值;那会让我中途到那里
如果没有足够的缓冲,那就会截断开始。
我不知道一个简单的方法。在录制和分析所需的起点和终点后,您必须编写新的音频文件。如果你很好地了解AIFF格式(不是很多人),并且有一种简单的方法来读取文件的样本数据,那么修改现有文件将非常简单。
分析阶段对于基本实施来说非常简单 - 评估样本数据的平均功效,直到超过阈值。反复重复以结束。