iOS - 切换手​​机、手机扬声器、耳机或蓝牙设备的音频输出

Mic*_*uan 5 audio bluetooth ios avaudiosession

我正在做一个关于视频和音频聊天的项目。音频输出有很多种类型,苹果在开发文档中列出了:

/* output port types */
NSString *const AVAudioSessionPortLineOut;
NSString *const AVAudioSessionPortHeadphones;
NSString *const AVAudioSessionPortBuiltInReceiver;
NSString *const AVAudioSessionPortBluetoothA2DP;
NSString *const AVAudioSessionPortBuiltInSpeaker;
NSString *const AVAudioSessionPortHDMI;
NSString *const AVAudioSessionPortAirPlay;
NSString *const AVAudioSessionPortBluetoothLE;

/* port types that refer to either input or output */
NSString *const AVAudioSessionPortBluetoothHFP;
NSString *const AVAudioSessionPortUSBAudio;
NSString *const AVAudioSessionPortCarAudio;
Run Code Online (Sandbox Code Playgroud)

如果现在我找到三种音频输出类型:iPhone扬声器、iPhone内置扬声器和蓝牙设备,如何切换彼此的输出?

我使用下面的代码将音频输出从蓝牙设备更改为扬声器。它有效:

[[AVAudioSession sharedInstance] overrideOutputAudioPort:AVAudioSessionPortOverrideSpeaker error:nil];
Run Code Online (Sandbox Code Playgroud)

我使用下面的代码将音频从其他类型更改为蓝牙,它也有效:

NSArray *availInputs = [[AVAudioSession sharedInstance] availableInputs];
int count = [availInputs count];
for (int i = 0; i < count; i++)
{
    AVAudioSessionPortDescription* inPort = [availInputs objectAtIndex:i];
    if ([self isBluetoothDevice:inPort.portType])
    {
         NSError *setPreferredErr = nil;
         [[AVAudioSession sharedInstance] setPreferredInput:inPort error:&setPreferredErr];
         if(setPreferredErr)
              NSLog (@"%@", setPreferredErr);
     }
}
Run Code Online (Sandbox Code Playgroud)

但我无法将输出从蓝牙更改为 iPhone 内置扬声器。从蓝牙换成耳机怎么样?谢谢。