我正在尝试创建一个对麦克风数据运行 FFT 的应用程序,因此我可以检查例如输入中最响亮的频率。
我看到有很多获取音频输入的方法(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
我应该如何以尽可能少的额外预处理来获取原始音频数据?(另外,你会建议做什么来验证我看到的原始数据是正确的?)