Обработка звука в iOS для получения громкости и высоты тона

Я пытаюсь создать анализатор звука в реальном времени на iOS7. Я хочу получить громкость и высоту звука от родного микрофона на iPod Touch Gen 5 и записать в CSV вместе с отметкой времени. Я хотел бы разбить его на 7 каналов и сэмплировать на частоте 8 Гц. Я просмотрел кучу документации и примеров кода, но ничего не могу заставить работать.

Я пытаюсь начать что-то простое сейчас с нуля, но мне кажется, что нет ничего, что бы обрисовывало в общих чертах, как я могу достичь того, что я упомянул выше.

Совсем недавно я пробовал AVAudioSessionCategoryAudioProcessing, надеясь использовать его для обработки сигналов, но документы Audio Session предполагают, что возможна только автоматическая обработка сигналов... и только в режимах голосового или видеочата.

- (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];
}

Есть ли простой способ с помощью Audio Session получить то, что я ищу?


person RoboArch    schedule 22.07.2014    source источник


Ответы (1)


Выяснил, что я могу использовать метод updateMeters AVAudioRecorder по таймеру, чтобы получить значение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]);
}
person RoboArch    schedule 22.07.2014
comment
Хороший ответ, но как получить тон звука? - person Leslie Godwin; 27.08.2014
comment
Я так и не смог добраться до этой части. Есть некоторые библиотеки, которые предположительно работают, но они требуют написания кода на Objective-C++, что выше моего понимания. - person RoboArch; 28.08.2014