像6S这样的新型IOS设备仅支持原生48kHz播放。由于标准的CoreAudio图重新采样得很好,因此不是很大的问题。问题是,如果您使用语音处理单元进行VOIP类型的应用程序,则无法将手机设置为44.1kHz;它创造了一个不错的Darth-Vader体验!
以前,我曾经检查设备的型号并简单地说'如果它是6S或更高版本,那么我必须重新采样44.1到48kHz),这很好用。我不喜欢这个修复,所以我尝试了以下代码:
session = [AVAudioSession sharedInstance];
[session setActive:YES error:&nsError];
if (systemSampleRate == 44100) // We may need to resample if it's a phone that only supports 48kHz like the 6S or 6SPlus
{
[session setCategory:AVAudioSessionCategoryPlayback
withOptions:0
error:&nsError];
result = [session setPreferredSampleRate:systemSampleRate error:&nsError];
hardwareSampleRate = [session sampleRate];
NSLog (@"Phone reports sample rate of %f", hardwareSampleRate);
if (hardwareSampleRate != (double)systemSampleRate) // We can't set it!!!!
needsResampling = YES;
else
{
[session setCategory:AVAudioSessionCategoryRecord
withOptions:AVAudioSessionCategoryOptionAllowBluetooth
error:&nsError];
result = [session setPreferredSampleRate:systemSampleRate error:&nsError];
hardwareSampleRate = [session sampleRate];
if (hardwareSampleRate != (double)systemSampleRate) // We can't set it!!!!
needsResampling = YES;
else
needsResampling = NO;
}
}
大部分时间,这都有效。 6S设备将报告48kHz,而所有其他设备报告44.1kHz。但是,如果它被绑定到仅支持8kHz麦克风音频和44.1kHz播放的蓝牙耳机类型的系统,则第一个硬件采样率值报告44.1 !!!!所以我继续认为该设备本身支持44.1并且一切都搞砸了。
问题是:如何判断IOS上的原生播放设备是否仅支持48kHz,或者是否支持44.1和48kHz?苹果公司关于此的公开文件毫无价值,它只是指责人们假设设备支持两者而不告诉你如何解决这个问题。
答案 0 :(得分:2)
你真的必须假设采样率可以改变。如果systemSampleRate是外部要求,请尝试将采样率设置为该值,然后使用您获得的值。问题在于,每次音频渲染链开始时都必须进行检查,或者在采样率发生变化时中断。
我使用两种不同的方法来处理这个问题,如果采样率发生变化,则会涉及拆除和重新初始化我的音频单元链。
一种简单的方法是将我的所有音频单元的采样率设为系统采样率(由活动音频会话上的采样率属性提供)。我认为这是最高质量的方法,因为没有采样率转换。
如果我有采样率要求,我将使用我所需的采样率创建我的链。然后检查系统采样率是否与我的要求不同。如果不同,我会将转换器单元放在系统单元(远程io)和链的末端之间。
最重要的是,最重要的信息是系统采样率是否与您的要求不同,而不是它是否可以改变。这是一个彻头彻尾的痛苦,当6S出现时,一堆音频应用程序破了,但这是处理它的正确方法。