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

时间:2014-01-02 19:02:11

标签: ios core-audio audio-recording

有人可以向我指出文档,说明不同iPhone版本的原生采样率,以避免core-audio内部采样率转换吗?

修改 否则,请您指点一个源代码示例,说明如何以编程方式获取这些值?

修改 这个Apple document (page 26)指的是Canonical音频格式,但仅提及样本类型(PCM)和位深度(16位)。它没有提到捕获硬件直接支持的任何本机采样率。这些是我正在寻找的价值观。

1 个答案:

答案 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上的核心音频中触及了这个主题