Ios 当覆盖接近传感器时,音频单元增加渲染帧数

Ios 当覆盖接近传感器时,音频单元增加渲染帧数,ios,audiounit,linphone,Ios,Audiounit,Linphone,我正在为VoIP iOS应用程序使用Linphone SDK。我发现接近传感器(当你把手机靠近耳朵时,它会使你的屏幕变暗)会严重影响传入的声音 我发现当覆盖接近度时,输入渲染回调的inbunsumber将增加到1024,通常是256。当它发生时,也会导致音频单元未触发此回调的180毫秒时间间隔,从而破坏Linphone的缓冲策略 设置渲染回调: AURenderCallbackStruct renderCallbackStruct; renderCallbackStruct.inputProc

我正在为VoIP iOS应用程序使用Linphone SDK。我发现接近传感器(当你把手机靠近耳朵时,它会使你的屏幕变暗)会严重影响传入的声音

我发现当覆盖接近度时,输入渲染回调的inbunsumber将增加到1024,通常是256。当它发生时,也会导致音频单元未触发此回调的180毫秒时间间隔,从而破坏Linphone的缓冲策略

设置渲染回调:

AURenderCallbackStruct renderCallbackStruct;
renderCallbackStruct.inputProc       = au_write_cb;
renderCallbackStruct.inputProcRefCon = card;
auresult=AudioUnitSetProperty (
                               card->io_unit,
                               kAudioUnitProperty_SetRenderCallback,
                               kAudioUnitScope_Input,
                               outputBus,
                               &renderCallbackStruct,
                               sizeof (renderCallbackStruct)
                               );
static OSStatus au_write_cb (
                          void                        *inRefCon,
                          AudioUnitRenderActionFlags  *ioActionFlags,
                          const AudioTimeStamp        *inTimeStamp,
                          UInt32                      inBusNumber,
                          //it changes to 1024 when proximity sensor is triggered
                          UInt32                      inNumberFrames,
                          AudioBufferList             *ioData
                         ) {}
在渲染回调中:

AURenderCallbackStruct renderCallbackStruct;
renderCallbackStruct.inputProc       = au_write_cb;
renderCallbackStruct.inputProcRefCon = card;
auresult=AudioUnitSetProperty (
                               card->io_unit,
                               kAudioUnitProperty_SetRenderCallback,
                               kAudioUnitScope_Input,
                               outputBus,
                               &renderCallbackStruct,
                               sizeof (renderCallbackStruct)
                               );
static OSStatus au_write_cb (
                          void                        *inRefCon,
                          AudioUnitRenderActionFlags  *ioActionFlags,
                          const AudioTimeStamp        *inTimeStamp,
                          UInt32                      inBusNumber,
                          //it changes to 1024 when proximity sensor is triggered
                          UInt32                      inNumberFrames,
                          AudioBufferList             *ioData
                         ) {}
据我所知,inNumberFrames只会在切换播放设备(如将耳机切换到蓝牙)的情况下发生变化。当触发接近传感器时,有没有办法修正这个数字

我还尝试将kAudioUnitProperty_MaximumFramesPerSlice设置为256,并将PreferredIOBufferDuration设置为音频会话的持续时间,但两者都不起作用


我下载了名为Speakerbox的苹果官方演示,发现无论我如何触发接近传感器,他们的渲染回调的inNumberFrames都会持续到256。我比较了苹果的代码和我的代码,但我找不到任何可能导致这种情况的差异。谢谢你的帮助,谢谢

你的理解是错误的。iOS可以因其他原因更改数字帧,例如当前运行的应用程序生命周期状态和电源管理更改。应用程序的音频单元缓冲区管理策略需要容忍缓冲区大小的这种变化,例如音频丢失/错误隐藏或重新同步


至于iOS缓冲区大小行为的差异,可能会因应用程序选择的音频单元、音频会话类型和选项以及后台模式选项而有所修改。

谢谢您的回复。我已经找到了一种方法,通过将首选硬件IO缓冲区的持续时间限制在20ms,使其不那么具有攻击性(这是在苹果官方演示上完成的)。现在它不受接近传感器或应用程序背景状态XD的影响。