J'essaie de créer une application qui exécute une FFT sur les données d'un microphone, afin de pouvoir examiner, par exemple, la fréquence la plus élevée dans l'entrée.
Je constate qu'il existe plusieurs méthodes pour obtenir une entrée audio (AudioUnit RemoteIO, services AudioQueue et AVFoundation), mais il semble que AVFoundation soit la plus simple. J'ai la configuration suivante :
// 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];
(plus le contrôle des erreurs, omis ici pour des raisons de lisibilité).
Je mets ensuite en œuvre ce qui suit AVCaptureAudioDataOutputSampleBufferDelegate méthode :
- (void)captureOutput:(AVCaptureOutput *)captureOutput
didOutputSampleBuffer:(CMSampleBufferRef)sampleBuffer
fromConnection:(AVCaptureConnection *)connection
{
NSLog(@"Num samples: %ld", CMSampleBufferGetNumSamples(sampleBuffer));
// Usually gives 1024 (except the first slice)
}
Je ne sais pas quelle est la prochaine étape. Que fait exactement le CMSampleBuffer
décrit (et quelles hypothèses peuvent être formulées à son sujet, le cas échéant) ? Comment dois-je obtenir les données audio brutes dans le format vDSP_fft_zrip
avec le moins possible de prétraitement supplémentaire ? (Par ailleurs, que recommanderiez-vous de faire pour vérifier que les données brutes que je vois sont correctes ?)