在iOS7和更高版本的接收器和扬声器之间切换audio输出?
我有一个audio播放器,当接近传感器通知1时,可以select将audio输出从扬声器切换到接收器/听筒(不pipe耳机是否连接)。以下是我的代码。
- (void) switchAudioOutput:(NSString*)output{ AVAudioSession* audioSession = [AVAudioSession sharedInstance]; BOOL success; NSError* error; if([output isEqualToString:keAudioOutputReciever]){ //Force current audio out through reciever //set the audioSession override success = [audioSession overrideOutputAudioPort:AVAudioSessionPortOverrideNone error:&error]; if (!success) NSLog(@"AVAudioSession error overrideOutputAudioPort:%@",error); //activate the audio session success = [audioSession setActive:YES error:&error]; if (!success) NSLog(@"AVAudioSession error activating: %@",error); else NSLog(@"AVAudioSession active with override: AVAudioSessionPortOverrideNone"); }else if([output isEqualToString:keAudioOutputSpeaker]){ //set the audioSession override success = [audioSession overrideOutputAudioPort:AVAudioSessionPortOverrideSpeaker error:&error]; if (!success) NSLog(@"AVAudioSession error overrideOutputAudioPort:%@",error); //activate the audio session success = [audioSession setActive:YES error:&error]; if (!success) NSLog(@"AVAudioSession error activating: %@",error); else NSLog(@"AVAudioSession active with override: AVAudioSessionPortOverrideSpeaker"); } }
这是基于答案切换button路由audio扬声器和接收器,并input链接说明在这里 。 我注意到,这只会强制单独的audio到扬声器,但不能确保路由单独到达接收器。 此外,转移到扬声器时,我得到以下错误:
AVAudioSession错误overrideOutputAudioPort:错误域= NSOSStatusErrorDomain代码= -50“该操作无法完成。(OSStatus错误-50。)”
我想通过避免Receiver的覆盖来解决这个问题
- (void) setAudioSession:(NSString*)audioOutput{ NSError* error; if([audioOutput isEqualToString:audioOutputSpeaker.lowercaseString]){ //set the audioSession override if(![self setCategory:AVAudioSessionCategoryPlayAndRecord withOptions:AVAudioSessionCategoryOptionDefaultToSpeaker|AVAudioSessionCategoryOptionAllowBluetooth error:&error]) NSLog(@"AVAudioSession error AVAudioSessionCategoryPlayAndRecord:%@",error); //activate the audio session if (![self setActive:YES error:&error]) NSLog(@"AVAudioSession error activating: %@",error); else NSLog(@"AVAudioSession active with override: AVAudioSessionPortOverrideNone"); }else if ([audioOutput isEqualToString:audioOutputReciever.lowercaseString]){ //Force current audio out through reciever //set the audioSession override if(![self setCategory:AVAudioSessionCategoryPlayAndRecord withOptions:AVAudioSessionCategoryOptionAllowBluetooth error:&error]) NSLog(@"AVAudioSession error AVAudioSessionCategoryPlayAndRecord:%@",error); if (![self overrideOutputAudioPort:AVAudioSessionPortOverrideNone error:&error]) NSLog(@"AVAudioSession error overrideOutputAudioPort to Reciever:%@",error); //activate the audio session if (![self setActive:YES error:&error]) NSLog(@"AVAudioSession error activating: %@",error); else NSLog(@"AVAudioSession active with override: AVAudioSessionPortOverrideNone"); } }
- 与AVAudioSessionCategoryPlayAndRecord组合在一起的低录音量
- AVAudioRecorder / AVAudioSession与苹果Airpods
- AvAudioSession不能在iOS7中工作?
- AVPlayer不会在iPhone上的结束中断时继续播放,但在iPad上也是如此
- 如何在iPhone设备上使用AVAudioSessionCategoryMultiRoute?
- AVAudioSessionManager availableInputs“端口iPhone麦克风的未知选定数据源”
- AVCaptureSession和背景audioiOS 7
- 如何使用MPMoviePlayerController播放video时将audio静音/取消静音?
- 如何解决iOS中的AVCaptureSession v AVAudioSession冲突?