如何获得原生(硬件支持的)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 。