您需要做的是找到一种方法来检测硬件采样率,并使用您在后续代码中找到的任何内容。
有一个音频会话属性会给你这个:CurrentHardwareSampleRate
- (void) logSampleRate {
Float64 sampleRate;
UInt32 srSize = sizeof (sampleRate);
OSStatus error =
AudioSessionGetProperty(
kAudioSessionProperty_CurrentHardwareSampleRate,
&srSize,
&sampleRate);
if (error == noErr) {
NSLog (@"CurrentHardwareSampleRate = %f", sampleRate);
}
}
iPhone 4S 和 iPhone 5S 报告 hardwareSampleRate = 44100.000000 但其他设备可能(将)不同...
编辑
在回答问题和阅读最新文档时,我发现 CurrentHardwareSampleRate 在 iOS6 中已被弃用。真的,我应该知道得更好,因为my own advice。
事情是这样的:
1 - 不要使用这个过时和弃用的 C 接口,使用 AVAudioSession API
2 - 不要使用HardwareSampleRate,使用sampleRate。
这引发了人们的怀疑,即 Apple 想(甚至)进一步拉开我们与金属的距离。但我们应该放心。而sampleRate 的文档仅提供
当前有效的音频采样率,以赫兹为单位。 (只读)
特别是省略了hardware这个词,我们也有这个方法:
- (BOOL)setPreferredSampleRate:(double)sampleRate error:(NSError **)outError
其中 sampleRate 被充分描述为
您要使用的硬件采样率。硬件采样率的可用范围取决于设备。它通常在 8,000 到 48,000 赫兹之间。
似乎我们应该使用它的方式是设置我们的首选速率,设备将从该速率设置(?)实际速率根据硬件,大概会尽可能接近首选。因此,一旦您设置了首选速率,您可以检查 sampleRate(与 preferredSampleRate 相对)属性的值,以发现将使用的实际采样率。这是 - 我们希望 - 硬件采样。
这是现代的方式......
- (void) logAudioFormatAV {
AVAudioSession* session = [AVAudioSession sharedInstance];
BOOL success;
NSError* error = nil;
double preferredSampleRate = 48000;
success = [session setPreferredSampleRate:preferredSampleRate error:&error];
if (success) {
NSLog (@"session.sampleRate = %f", session.sampleRate);
} else {
NSLog (@"error setting sample rate %@", error);
}
}
我已经在 4S 和 5S 上尝试了各种首选采样率,并且总是返回 44100。所以这似乎是在做正确的事情,并报告了实际 硬件 采样率。但这值得更广泛的测试以获得更大的确定性。
我还想向您指出 Chris Adamson 的优秀著作 Learning Core Audio 的方向,该书在第 10 章 iOS 上的 Core Audio 中涉及了这个主题.