我正在研究开发一款iPhone应用程序,可能涉及对来自标准电话麦克风接收到的音频进行“简单”的分析。具体来说,我对麦克风捕捉到的高音和低音感兴趣,其他中间的音调对我来说并不重要。
是否有已经实现这一功能的应用程序(只是为了让我看看它的能力)?我该从哪里开始编写这样的代码呢?
感谢您的帮助。
我正在研究开发一款iPhone应用程序,可能涉及对来自标准电话麦克风接收到的音频进行“简单”的分析。具体来说,我对麦克风捕捉到的高音和低音感兴趣,其他中间的音调对我来说并不重要。
是否有已经实现这一功能的应用程序(只是为了让我看看它的能力)?我该从哪里开始编写这样的代码呢?
感谢您的帮助。
请参考音频队列框架。这是我用来获取高水位标记的方法:
AudioQueueRef audioQueue; // Imagine this is correctly set up
UInt32 dataSize = sizeof(AudioQueueLevelMeterState) * recordFormat.mChannelsPerFrame;
AudioQueueLevelMeterState *levels = (AudioQueueLevelMeterState*)malloc(dataSize);
float channelAvg = 0;
OSStatus rc = AudioQueueGetProperty(audioQueue, kAudioQueueProperty_CurrentLevelMeter, levels, &dataSize);
if (rc) {
NSLog(@"AudioQueueGetProperty(CurrentLevelMeter) returned %@", rc);
} else {
for (int i = 0; i < recordFormat.mChannelsPerFrame; i++) {
channelAvg += levels[i].mPeakPower;
}
}
free(levels);
// This works because one channel always has an mAveragePower of 0.
return channelAvg;
您可以通过kAudioQueueProperty_CurrentLevelMeterDB以dB自由比例的形式获得峰值功率,也可以将其作为介于[0.0、1.0]区间的浮点数获得(使用kAudioQueueProperty_CurrentLevelMeter)。
UInt32 d = 1;
OSStatus status = AudioQueueSetProperty(mQueue, kAudioQueueProperty_EnableLevelMetering, &d, sizeof(UInt32));
查看“SpeakHere”示例代码。它将向您展示如何使用AudioQueue API录制音频。它还包含一些代码来分析实时音频以显示电平计。
实际上,您可能能够使用大部分电平计代码来响应“高峰”和“低谷”。
https://developer.apple.com/iPhone/library/samplecode/aurioTouch/index.html
对于你的应用程序可能有些过度。