如何获得本机(硬件支持)音频采样率以避免内部采样率转换



为了避免core-audio内部采样率转换,有人能给我指一下说明不同iPhone版本的本机采样率的文档吗?

编辑:否则,您能给我举一个源代码示例,说明如何通过编程方式获取这些值吗?

编辑:此Apple文档(第26页)引用了标准音频格式,但仅提及样本类型(PCM)和位深度(16位)。它没有提到捕获硬件直接支持的任何本地采样率。这些就是我要寻找的价值观。

您需要做的是找到一种检测硬件采样率的方法,并使用您在后续代码中找到的任何东西。

有一个音频会话属性会给你这个: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报告硬件采样率=44100.000000,但其他设备可能(将)不同。。。

编辑

在回答问题和阅读最新文档时,我发现iOS6中不赞成使用CurrentHardwareSampleRate。事实上,如果有我自己的建议,我应该知道得更好。

事情是这样的:

1-不要使用这个过时和不推荐使用的C接口,使用AVAudioSessionAPI

2-不要使用HardwareSampleRate,使用sampleRate

这让人怀疑苹果想让我们(甚至)远离金属。但我们应该放心。而sampleRate的文档只提供

当前有效的音频采样率,单位为赫兹。(只读)

值得注意的是,省略了单词hardware,我们也有这种方法:

- (BOOL)setPreferredSampleRate:(double)sampleRate error:(NSError **)outError

其中sampleRate充分描述为

要使用的硬件采样率。硬件采样率的可用范围取决于设备。它的频率范围通常在8000到48000赫兹之间。

似乎我们应该使用的方法是设置我们的首选速率,根据该速率,设备将设置(?)实际比率,该比率可能会尽可能接近首选,基于硬件。因此,一旦设置了首选速率,就可以检查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的优秀著作《学习核心音频》的方向,该书在第10章《iOS上的核心音频》中谈到了这一主题。

最新更新