我的应用程序包括用户录制简短消息的功能;我想从录音的开头和结尾剪掉任何静音(或者更准确地说,任何音量低于给定阈值的音频)。
我正在使用 AVAudioRecorder 录制音频,并将其保存到 .aif 文件中。我在其他地方看到过一些方法,通过这些方法我可以让它等待开始录制,直到音频电平达到阈值。那会让我走到一半,但无助于修剪最后的沉默。
如果有一个简单的方法可以做到这一点,我将永远感激!
谢谢。
我的应用程序包括用户录制简短消息的功能;我想从录音的开头和结尾剪掉任何静音(或者更准确地说,任何音量低于给定阈值的音频)。
我正在使用 AVAudioRecorder 录制音频,并将其保存到 .aif 文件中。我在其他地方看到过一些方法,通过这些方法我可以让它等待开始录制,直到音频电平达到阈值。那会让我走到一半,但无助于修剪最后的沉默。
如果有一个简单的方法可以做到这一点,我将永远感激!
谢谢。
该项目从麦克风获取音频,在响亮的噪音时触发并在安静时取消触发。它还会在末端修剪和淡入/淡出。
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;
}
我正在使用 AVAudioRecorder 录制音频,并将其保存到 .aif 文件中。我在其他地方看到过一些方法,通过这些方法我可以让它等待开始录制,直到音频电平达到阈值。那会让我走到一半
如果没有足够的缓冲,那会截断开始。
我不知道一个简单的方法。在录制并分析所需的起点和终点后,您必须编写一个新的音频文件。如果您非常了解 AIFF 格式(没有多少人知道)并且有一种简单的方法可以读取文件的示例数据,那么修改现有文件将很简单。
对于基本实现,分析阶段非常容易——评估样本数据的平均功率,直到超过您的阈值。反向重复结束。