Я пытаюсь создать приложение, которое запускает БПФ для данных микрофона, поэтому я могу проверить, например. самая громкая частота на входе.
Я вижу, что существует множество способов получения аудиовхода (службы RemoteIO AudioUnit, AudioQueue и AVFoundation), но кажется, что AVFoundation является самым простым. У меня есть эта установка:
// Configure the audio session
AVAudioSession *session = [AVAudioSession sharedInstance];
[session setCategory:AVAudioSessionCategoryRecord error:NULL];
[session setMode:AVAudioSessionModeMeasurement error:NULL];
[session setActive:YES error:NULL];
// Optional - default gives 1024 samples at 44.1kHz
//[session setPreferredIOBufferDuration:samplesPerSlice/session.sampleRate error:NULL];
// Configure the capture session (strongly-referenced instance variable, otherwise the capture stops after one slice)
_captureSession = [[AVCaptureSession alloc] init];
// Configure audio device input
AVCaptureDevice *device = [AVCaptureDevice defaultDeviceWithMediaType:AVMediaTypeAudio];
AVCaptureDeviceInput *input = [AVCaptureDeviceInput deviceInputWithDevice:device error:NULL];
[_captureSession addInput:input];
// Configure audio data output
AVCaptureAudioDataOutput *output = [[AVCaptureAudioDataOutput alloc] init];
dispatch_queue_t queue = dispatch_queue_create("My callback", DISPATCH_QUEUE_SERIAL);
[output setSampleBufferDelegate:self queue:queue];
[_captureSession addOutput:output];
// Start the capture session.
[_captureSession startRunning];
(плюс проверка ошибок, опущенная здесь для удобства чтения).
Затем я реализую следующий AVCaptureAudioDataOutputSampleBufferDelegate. метод:
- (void)captureOutput:(AVCaptureOutput *)captureOutput
didOutputSampleBuffer:(CMSampleBufferRef)sampleBuffer
fromConnection:(AVCaptureConnection *)connection
{
NSLog(@"Num samples: %ld", CMSampleBufferGetNumSamples(sampleBuffer));
// Usually gives 1024 (except the first slice)
}
Я не уверен, каким должен быть следующий шаг. Что именно описывает формат CMSampleBuffer
(и какие предположения можно сделать по этому поводу, если таковые имеются)? Как получить необработанные аудиоданные в vDSP_fft_zrip
с наименьшим объемом дополнительной предварительной обработки? (Кроме того, что бы вы порекомендовали сделать, чтобы убедиться, что необработанные данные, которые я вижу, верны?)