如何判断IOS设备是否仅支持硬件48kHz

时间:2016-06-09 19:49:30

标签: ios core-audio

像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?苹果公司关于此的公开文件毫无价值,它只是指责人们假设设备支持两者而不告诉你如何解决这个问题。

1 个答案:

答案 0 :(得分:2)

你真的必须假设采样率可以改变。如果systemSampleRate是外部要求,请尝试将采样率设置为该值,然后使用您获得的值。问题在于,每次音频渲染链开始时都必须进行检查,或者在采样率发生变化时中断。

我使用两种不同的方法来处理这个问题,如果采样率发生变化,则会涉及拆除和重新初始化我的音频单元链。

一种简单的方法是将我的所有音频单元的采样率设为系统采样率(由活动音频会话上的采样率属性提供)。我认为这是最高质量的方法,因为没有采样率转换。

如果我有采样率要求,我将使用我所需的采样率创建我的链。然后检查系统采样率是否与我的要求不同。如果不同,我会将转换器单元放在系统单元(远程io)和链的末端之间。

最重要的是,最重要的信息是系统采样率是否与您的要求不同,而不是它是否可以改变。这是一个彻头彻尾的痛苦,当6S出现时,一堆音频应用程序破了,但这是处理它的正确方法。