在iOS中进行音频处理以获得音量和音高

时间:2014-07-22 18:24:00

标签: ios ios7 avaudiosession audio-analysis

我试图在iOS7上创建一个实时音频分析器。我想要获得的是iPod Touch Gen 5上本机麦克风的音量和音高,并写入CSV和时间戳。我想把它分成7个通道,并以8Hz采样。我查看过一堆文档和代码示例,但无法正常工作。

我现在尝试从头开始做一些简单的事情,但在我看来,没有任何概述我如何能够实现我上面提到的内容。

最近我尝试AVAudioSessionCategoryAudioProcessing希望能够将其用于信号处理,但音频会话文档表明只能进行自动信号处理......而且只能在语音或视频中使用聊天模式。

- (void)analyzeAudio
{
AVAudioSession *audioSession = [AVAudioSession sharedInstance];

audioUnit = (AudioUnit*)malloc(sizeof(AudioUnit));

NSError *activationError = nil;

BOOL success = [[AVAudioSession sharedInstance] setActive: YES error: &activationError];

if (!success)
{
    NSLog(@"AudioSession could not init");
}

[audioSession setCategory:AVAudioSessionCategoryAudioProcessing error:nil];

[audioSession setActive:YES error:nil];
}

音频会话是否有一种简单的方法可以获得我想要的内容?

1 个答案:

答案 0 :(得分:1)

发现我可以在计时器上使用AVAudioRecorder方法updateMeters以某个时间间隔获取peakPowerForChannel:值。

- (void)recordAudio
{
_audioSession = [AVAudioSession sharedInstance];

NSError *error;
[_audioSession setCategory:AVAudioSessionCategoryPlayAndRecord error:&error];
[_audioSession setActive:YES error:&error];

NSMutableDictionary *settings = [NSMutableDictionary dictionary];
[settings setValue:[NSNumber numberWithInt:kAudioFormatMPEG4AAC] forKey:AVFormatIDKey];
[settings setValue:[NSNumber numberWithFloat:8000.0] forKey:AVSampleRateKey];
[settings setValue:[NSNumber numberWithInt:1] forKey:AVNumberOfChannelsKey];
[settings setValue:[NSNumber numberWithFloat:16000] forKey:AVEncoderBitRateKey];
[settings setValue:[NSNumber numberWithInt:AVAudioQualityMin] forKey:AVEncoderAudioQualityForVBRKey];

NSArray *dirPath = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
NSString *documentsPath = [dirPath objectAtIndex:0];

long currentTime = [[NSDate date] timeIntervalSince1970];
NSString *filePath = [documentsPath stringByAppendingPathComponent:[NSString stringWithFormat:@"audio_%ld.aac", currentTime]];
NSURL *audioFileURL = [NSURL fileURLWithPath:filePath];

_audioRecorder = [[AVAudioRecorder alloc] initWithURL:audioFileURL settings:settings error:&error];

if (error)
{
    NSLog(@"audio record error: %@", [error localizedDescription]);

} else {
    [_audioRecorder prepareToRecord];
    _audioRecorder.meteringEnabled = YES;
    [_audioRecorder record];
    [self addTextToLog:@"Recording Audio"];
    self.audioTimer = [NSTimer scheduledTimerWithTimeInterval:0.2 target:self selector:@selector(updateAudioMeters) userInfo:nil repeats:YES];
}
}
- (void)updateAudioMeters
{
[_audioRecorder updateMeters];

NSLog(@"pkPwr: %f", [_audioRecorder peakPowerForChannel:0]);
}