ios - AVAudioSessionManager availableInputs"Unknown selected data source for port iPhone Microphone"

我已经在控制台日志中注意到这个错误,虽然它不会影响我的应用程序的执行,但我发现它真的很烦人。因此,我开始追踪这个错误的来源。当我调用availableInputs时,


NSArray *inputs = [[AVAudioSession sharedInstance] availableInputs];

它将给我日志消息:


ERROR: [0x3d61318c] AVAudioSessionPortImpl.mm:50: ValidateRequiredFields: Unknown selected data source for Port iPhone Microphone (type: MicrophoneBuiltIn)

我试图把这些输入打印出来。


Printing description of inputs:
<__NSArrayI 0x188c4610>(
<AVAudioSessionPortDescription: 0x188c4580, type = MicrophoneBuiltIn; name = iPhone Microphone; UID = Built-In Microphone; selectedDataSource = (null)>,
<AVAudioSessionPortDescription: 0x18835d90, type = BluetoothHFP; name = Valore-BTi22; UID = 00:23:01:10:38:77-tsco; selectedDataSource = (null)>

那么selectedDataSource是(null),我不知道该怎么做才能使它无效? iPhone麦克风是内置的输入,我想它已经被Apple设定好了吗?

时间:

这个问题似乎不只是发生在我身上,我将在这里分享我的理解。

我的情况是,我正在使用pjsip库,它对音频资源有一个较低级的控制,我注意到那个声音装置在我调用它之前已经关闭了,[[AVAudioSession sharedInstance] availableInputs];

因此,作为一个更高级别的控制,(我觉得)AVAudioSession无法为它输入找到相应的音频数据源。

为了进一步研究这个问题,最好在代码中检查修改音频源的地方。 并确保在调用AVAudioSession之前激活了音频源

我现在只能这么整了,对音频控制的深入理解和更好的解释总是值得的!

关于控制台中的错误,我可以确认我在使用iPhone 5S时有时会收到此消息,但是,我从未在4S上看到过。它可能只是一些核心音频转储,但是,它似乎并不影响实际性能(至少对于我来说)。

关于可用输入,您实际打印的是可用输入端口及它描述。这一点更令人困惑,我不明白为什么selectedDataSource字段为每个字段为空。

我会说,无论选择的数据源是什么?iPhone肯定是默认为其中一个来源(可能是内置麦克风)。

如果你想显式选择一个端口描述,你可以执行如下操作:


NSArray *availableInputs = [[AVAudioSession sharedInstance] availableInputs];
AVAudioSessionPortDescription *port = [availableInputs objectAtIndex:0]; //built in mic for your case
NSError *portErr = nil;
[[AVAudioSession sharedInstance] setPreferredInput:port error:&portErr];

之后我会检查portErr以确保在设置preferredInput时没有错误。

值得注意的是,你还可以为特定端口描述循环访问可用的数据源,并使用,


[port setPreferredDataSource:source error:&sourceErr];

然后跟上:


[[AVAudioSession sharedInstance] setPreferredInput:port error:&portErr];

...