覆盖接近传感器时,音频单元增加渲染回调 inNumberFrames
Posted
技术标签:
【中文标题】覆盖接近传感器时,音频单元增加渲染回调 inNumberFrames【英文标题】:Audio Unit increases render callback inNumberFrames when proximity sensor is covered 【发布时间】:2018-05-10 06:31:37 【问题描述】:我正在将 Linphone SDK 用于 VoIP ios 应用程序。而且我发现接近传感器(当您将手机靠近耳朵时会使屏幕变暗的传感器)会严重影响传入的声音。
我发现输入渲染回调的inBusNumber在覆盖接近时会增加到1024,通常是256。发生这种情况时还会导致Audio Unit不触发此回调的大约180ms时间间隙,这破坏了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
)
据我了解,inNumberFrames 只会在切换播放设备(例如将耳机切换到蓝牙)的情况下发生变化。当接近传感器被触发时,有什么办法可以修复这个数字?
我也尝试将 kAudioUnitProperty_MaximumFramesPerSlice 设置为 256 并设置音频会话的 PreferredIOBufferDuration,但两者都不起作用。
我下载了名为 Speakerbox 的 Apple 官方演示,发现无论我如何触发接近传感器,他们的渲染回调的 inNumberFrames 都会持续到 256。我比较了苹果的代码和我的代码,但我找不到任何可能导致这种情况的差异。感谢任何帮助,谢谢。
【问题讨论】:
【参考方案1】:你的理解不正确。 iOS 可以出于其他原因更改 inNumberFrames,例如当前正在运行的应用程序生命周期状态以及电源管理更改。应用的音频单元缓冲区管理策略需要容忍缓冲区大小的此类变化,例如音频丢失/错误隐藏或重新同步。
至于 iOS 缓冲区大小行为的差异,可能会因应用选择的音频单元、音频会话类型和选项以及背景模式选项而有所改变。
【讨论】:
感谢您的回复。我已经找到了一种降低攻击性的方法(在苹果官方演示中完成),将首选硬件 IO 缓冲区持续时间限制为 20 毫秒。现在它不受接近传感器或应用程序背景状态的影响 XD。以上是关于覆盖接近传感器时,音频单元增加渲染回调 inNumberFrames的主要内容,如果未能解决你的问题,请参考以下文章