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

Posted

技术标签:

【中文标题】如何获得本机(硬件支持)音频采样率以避免内部采样率转换?【英文标题】:How can I obtain the native (hardware-supported) audio sampling rates in order to avoid internal sample rate conversion? 【发布时间】:2014-01-02 19:02:11 【问题描述】:

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

编辑: 否则,您能否指出我如何以编程方式获取这些值的源代码示例?

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

【问题讨论】:

我不是要求基于偏好的推荐设置,我要求的是一个已知设置,它将避免核心音频自动添加采样率转换层。请重新考虑删除暂停状态。 我建议您稍微改写您的问题(或重新考虑您的方法)......您需要知道如何在代码中获得设备的硬件采样率。 Core Audio 可以为您提供所需的信息。如果您可以重新打开此问题,我可以为您解答! 【参考方案1】:

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

有一个音频会话属性会给你这个: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 中已被弃用。真的,我应该知道得更好,因为my own advice。

事情是这样的:

1 - 不要使用这个过时和弃用的 C 接口,使用 AVAudioSession API

2 - 不要使用HardwareSampleRate,使用sampleRate

这引发了人们的怀疑,即 Apple 想(甚至)进一步拉开我们与金属的距离。但我们应该放心。而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。所以这似乎是在做正确的事情,并报告了实际 硬件 采样率。但这值得更广泛的测试以获得更大的确定性。

我还想向您指出 Chris Adamson 的优秀著作 Learning Core Audio 的方向,该书在第 10 章 iOS 上的 Core Audio 中涉及了这个主题.

【讨论】:

很好的答案!我同意你的观点,即苹果似乎在推动与金属的距离更远。至少,随着设备版本数量的减少,它比 android 好得多,Android 的音频堆栈支持如此分散,令人恐惧!感谢您的帮助! 我在 iPod 4g 和 iPhone 5 上都试过了,结果与你的不同。我发现 session.sampleRate 与首选采样率的值匹配,只要它是一组典型值(48000、44100、32000、24000)中的一个;如果我将其设置为其他值(例如 44101),实际费率将是下一个最高值(例如 48000)。只有在调用 [session setActive:YES] 之后才会设置 session.sampleRate 的新值。否则,它只保留应用程序上一次运行的值。所以我不确定我是否确信 44100 是硬件速率... @foundry,很有趣。我试过这个,发现超过 48000 的首选采样率返回 48000 的实际采样率,而对于 44100 和 47999 之间的首选采样率,返回的值是 44100。对于低于 44099 的值,返回的值是 32000。也许你告诉我,如果我'我问错了这个***.com/questions/37692276/…

以上是关于如何获得本机(硬件支持)音频采样率以避免内部采样率转换?的主要内容,如果未能解决你的问题,请参考以下文章

iPhone 3GS + / iPad 1 + 最大硬件音频采样率

听说高通平台处理器有先天的音频采样率缺陷,是啥

libfdk_aac音频采样率和编码字节数注意

对于某些特定视频的音频,我使用 mediaExtractor 和 mediaFormat 获得一半的通道数和一半的采样率

AudioTrack 采样率不一致

如何在 AVCaptureSession 上设置音频采样率?