Sto provando a creare un'applicazione che esegue un FFT sui dati del microfono, quindi posso esaminare ad es. la più alta frequenza nell'input.Passare dati AVCaptureAudioDataOutput in vDSP/Accelerate.framework
Vedo che ci sono molti metodi per ottenere l'ingresso audio (RemoteIO AudioUnit, AudioQueue services e AVFoundation) ma sembra che AVFoundation sia il più semplice. Ho questa impostazione:
// 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];
(più errore di controllo, omesso qui per la leggibilità).
Poi ho implementare il AVCaptureAudioDataOutputSampleBufferDelegate seguente metodo:
- (void)captureOutput:(AVCaptureOutput *)captureOutput
didOutputSampleBuffer:(CMSampleBufferRef)sampleBuffer
fromConnection:(AVCaptureConnection *)connection
{
NSLog(@"Num samples: %ld", CMSampleBufferGetNumSamples(sampleBuffer));
// Usually gives 1024 (except the first slice)
}
io sono sicuro quello che il prossimo passo dovrebbe essere. Che cosa descrive esattamente il formato CMSampleBuffer
(e quali ipotesi possono essere fatte al riguardo, se ce ne sono)? Come devo ottenere i dati audio grezzi in vDSP_fft_zrip
con il minor numero possibile di pre-elaborazione extra? (Inoltre, cosa consiglieresti di fare per verificare che i dati grezzi che vedo siano corretti?)
"Il formato audio predefinito per il microfono iPhone è un singolo canale di numeri interi a 16 bit" - da dove viene questa informazione viene? Sono preoccupato che fare ipotesi del genere in generale non siano sicure su hardware di dispositivi diversi. – jtbandes
Hai ragione, e l'ipotesi era in realtà falsa comunque, l'ho aggiornata per verificare il formato audio. Alcuni commenti qui sui valori predefiniti di AVCapture: http://developer.apple.com/library/ios/#samplecode/AVCaptureToAudioUnit/Listings/CaptureSessionController_mm.html – Tark