有人可以向我指出文档,说明不同iPhone版本的原生采样率,以避免core-audio
内部采样率转换吗?
修改 否则,请您指点一个源代码示例,说明如何以编程方式获取这些值?
修改 这个Apple document (page 26)指的是Canonical音频格式,但仅提及样本类型(PCM)和位深度(16位)。它没有提到捕获硬件直接支持的任何本机采样率。这些是我正在寻找的价值观。
答案 0 :(得分:10)
您需要做的是找到一种方法来检测硬件采样率,并使用您在后续代码中找到的任何内容。
有一个音频会话属性可以为您提供: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但其他设备可能(将)不同......
修改强>
在回答问题并阅读最新文档时,我发现iOS6中已弃用CurrentHardwareSampleRate
。真的,我应该知道更好,给定my own advice。
所以这就是事情:
1 - 请勿使用此陈旧且已弃用的C接口,请使用AVAudioSession
API
2 - 请勿使用HardwareSampleRate
,请使用sampleRate
。
这引起了人们的怀疑,即苹果希望让我们(甚至)远离金属。但我们应该放心。虽然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.所以这似乎做得对,并报告实际 硬件< / em>采样率。但是,这需要更广泛的测试,以获得更大的确定性。
我还想向你指出Chris Adamson出色的书学习核心音频的方向,该书在第10章 iOS上的核心音频中触及了这个主题