如何获得本机(硬件支持)音频采样率以避免内部采样率转换?
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 + 最大硬件音频采样率
对于某些特定视频的音频,我使用 mediaExtractor 和 mediaFormat 获得一半的通道数和一半的采样率