没有声音问题会杀死设备上所有应用程序的音频

Posted

技术标签:

【中文标题】没有声音问题会杀死设备上所有应用程序的音频【英文标题】:No sound issue kills audio for all apps on the device 【发布时间】:2016-11-10 16:53:51 【问题描述】:

我们的应用程序正在失去声音(没有声音),但这会导致所有其他应用程序也失去声音。我不知道我们怎么可能阻止来自 Apple Music 应用等外部应用的声音。

我们正在转储AVAudiosession 会话的内容,我们可以看到声音正常工作和不工作之间没有区别。我们已经验证了路由输出仍然是 iPhone 的扬声器,即使我们失去了声音。

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

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

【问题讨论】:

也许您应该使用他们的错误报告系统向 Apple 发送一个可重现的代码示例。 不幸的是,这被连接到如此多的代码中,很难重现。我们可能在链中做错了什么,但如果是这样,那是非常微妙的,我们较小的测试应用程序似乎没问题。我们甚至不知道它是如何影响另一个应用程序的,所以如果我们能发现我们可能能够追踪问题的根源。 【参考方案1】:

我们发现问题的根源在于发送到 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;
    

【讨论】:

以上是关于没有声音问题会杀死设备上所有应用程序的音频的主要内容,如果未能解决你的问题,请参考以下文章

我的电脑突然放歌放电影没声音,显示音频设备无法播放,请检查声卡设置

电脑无法播放声音,提示没有音频设备,这该怎么办?

音频流服务器是不是需要声音设备?

音频无法在所有 iOS 设备上播放

如何在 Windows 上使用 C++ 在特定音频设备上播放声音?

为啥hdmi线插上音响没声音了?