2016-06-09 70 views
3

像6S这样的新型IOS设备仅支持本机48kHz回放。由于标准CoreAudio图形重新采样很好,因此没有什么问题。问题是,如果您使用语音处理单元进行VOIP类型的应用,则无法将手机设置为44.1kHz;它创造了一个不错的Darth-Vader,就像体验一样!以前,我用来检查设备的型号,并简单地说'如果它是6S或更高版本,那么我必须重新采样44.1到48kHz),并且这工作得很好。我不喜欢这种修复,所以我尝试了下面的代码:如何判断IOS设备是否仅在硬件中支持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

你从哪里得到systemSampleRate? – dave234

+0

啊,应该提到。这是系统“想要”运行的期望采样率。它只是通过这个例程并在其他地方定义。它只有44100或48000的值。 – chuckd

+0

它在哪里定义? – dave234

回答

1

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

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

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

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

底线是最重要的信息是系统采样率是否与您的要求不同,而不是它是否可以改变。这完全是一种痛苦,6S出现时一批音频应用破裂了,但这是正确处理它向前发展的方式。

+1

虽然这是问题。如果您尝试在6S或6S Plus上使用44100上的kAudioUnitSubType_VoiceProcessingIO,系统会很快接受它(甚至会说它运行在44100),但会产生可怕的音频瑕疵。这些电话必须运行在48000,并在CoreAudio之外进行外部重采样。说出手机的型号很容易,但我讨厌假设所有未来的设备必须始终运行在48000。 – chuckd