我们的应用程序正在丢失声音(无声音),但这以某种方式导致所有其他应用程序也丢失了声音。我不知道我们怎么可能阻止来自Apple Music应用程序等外部应用程序的声音。

我们正在转储AVAudioSession session 的内容,并且在声音正常工作与无效之间没有区别。我们已经验证,即使我们丢失声音,路线输出仍然是iPhone的扬声器。

这是在带有扬声器的iPhone 6s和6s Plus上发生的。我们可以通过更改输出路线(例如插入和拔出耳机)来“修复”音频。

如何影响播放其他应用程序声音的能力,这可能有助于解决正在发生的事情?

最佳答案

我们跟踪了问题的根源,即发送到Core Audio的音频缓冲区中有不良数据。具体来说,音频处理步骤之一输出的数据为NaN(非数字),而不是有效范围+/- 1.0中的浮点数。

似乎在某些设备上,如果数据包含NaN,则会杀死整个设备的音频。

我们通过遍历音频数据以检查NaN值并将其转换为0.0来解决此问题。请注意,检查浮点数是否为NaN是一种奇怪的检查(或者对我来说似乎很奇怪)。 NaN不等于任何事物,包括自身。

在我们获得具有正确修复程序的新库之前,可以使用一些伪代码来解决此问题:

float        *interleavedAudio; // pointer to a buffer of the audio data
unsigned int  numberOfSamples;  // number of left/right samples in the audio buffer
unsigned int  numberOfLeftRightSamples = numberOfSamples * 2; // number of float values in the audio buffer

// loop through each float in the audio data
for (unsigned int i = 0; i < numberOfLeftRightSamples; i++)
{
    float *sample = interleavedAudio + i;

    // NaN is never equal to anything, including itself
    if( *sample != *sample )
    {
        // This sample is NaN - force it to 0.0 so it doesn't corrupt the audio
        *sample = 0.0;
    }
}

10-07 19:02
查看更多