如何获得原生(硬件支持的)audio采样率以避免内部采样率转换?

任何人都可以指向我的文档,说明在不同的iPhone版本的本地采样率,以避免core-audio内部采样率转换?

编辑:否则,请你指点我的一个源代码的例子,我怎样才能以编程方式获得这些值?

编辑:这个Apple文档(第26页)是指Canonicalaudio格式,但仅提及样本types(PCM)和位深度(16位)。 它没有提到捕获硬件直接支持的任何本地采样率。 这些是我正在寻找的价值。

你需要做的是find一种方法来检测硬件采样率,并使用你在随后的代码中find的任何东西。

有一个audio会话属性会给你这个: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中已被弃用。 而且,根据我自己的build议 ,我应该知道得更清楚些。

所以这里是事情:

1 – 不要使用这个过时的和不赞成使用的C接口,请使用AVAudioSession API

2 – 不要使用HardwareSampleRate ,使用sampleRate

这引起了苹果想要把我们(甚至)远离金属的怀疑。 但我们应该放心。 虽然sampleRate的文档只提供

当前有效的audio采样率(赫兹)。 (只读)

值得注意的是省略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.所以这似乎是做正确的事情,并报告实际的 硬件采样率。 但是,这更值得肯定,值得更广泛的testing。

我还想指出Chris Adamson出色的书籍“ 学习核心audio”Core Core Audio)的方向,第10章介绍了iOS上的Core Audio