为了避免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接口,使用AVAudioSession
API
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上的核心音频》中谈到了这一主题。