使用AVPlayer播放时如何将audio连接到蓝牙

我正在使用AVPlayer从url播放audio,但是当iPhone连接到蓝牙设备,它不是通过蓝牙播放,如何通过蓝牙播放,如果它连接,我看到在SO中的一些职位,但没有一个是明确解释。 以下是我的代码。

-(void)playselectedsong{ AVPlayer *player = [[AVPlayer alloc]initWithURL:[NSURL URLWithString:urlString]]; self.songPlayer = player; [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(playerItemDidReachEnd:) name:AVPlayerItemDidPlayToEndTimeNotification object:[songPlayer currentItem]]; [self.songPlayer addObserver:self forKeyPath:@"status" options:0 context:nil]; [NSTimer scheduledTimerWithTimeInterval:0.1 target:self selector:@selector(updateProgress:) userInfo:nil repeats:YES]; [self.songPlayer play]; } - (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context { if (object == songPlayer && [keyPath isEqualToString:@"status"]) { if (songPlayer.status == AVPlayerStatusFailed) { NSLog(@"AVPlayer Failed"); } else if (songPlayer.status == AVPlayerStatusReadyToPlay) { NSLog(@"AVPlayerStatusReadyToPlay"); } else if (songPlayer.status == AVPlayerItemStatusUnknown) { NSLog(@"AVPlayer Unknown"); } } } - (void)playerItemDidReachEnd:(NSNotification *)notification { // code here to play next sound file } 

尝试这个

 UInt32 sessionCategory = kAudioSessionCategory_MediaPlayback; AudioSessionSetProperty (kAudioSessionProperty_AudioCategory, sizeof(sessionCategory),&sessionCategory); // Set AudioSession NSError *sessionError = nil; [[AVAudioSession sharedInstance] setCategory:AVAudioSessionCategoryPlayback withOptions:AVAudioSessionCategoryOptionAllowBluetooth error:&sessionError]; UInt32 doChangeDefaultRoute = 1; AudioSessionSetProperty(kAudioSessionProperty_OverrideCategoryEnableBluetoothInput, sizeof(doChangeDefaultRoute), &doChangeDefaultRoute); 

您需要在AVAudioSession上设置一个类别和选项。

当应用程序启动时试试这个:

 //configure audio session NSError *setCategoryError = nil; BOOL setCategorySuccess = [[AVAudioSession sharedInstance] setCategory:AVAudioSessionCategoryPlayback withOptions:AVAudioSessionCategoryOptionAllowBluetooth error:&setCategoryError]; if (setCategorySuccess) { NSLog(@"Audio Session options set."); } else { NSLog(@"WARNING: Could not set audio session options."); } 

对于Swift 3.1

简洁版本:

 let audioSession = AVAudioSession.sharedInstance() do { try audioSession.setCategory(AVAudioSessionCategoryRecord, with: [.allowBluetooth]) try audioSession.setActive(true) } catch { fatalError("Error Setting Up Audio Session") } 

扩展版本可以肯定,您使用的是正确的input:

 /** Check availability of recording and setups audio session with prioritized input. */ func setupSessionForRecording() { let audioSession = AVAudioSession.sharedInstance() do { try audioSession.setCategory(AVAudioSessionCategoryRecord, with: [.allowBluetooth]) } catch { fatalError("Error Setting Up Audio Session") } var inputsPriority: [(type: String, input: AVAudioSessionPortDescription?)] = [ (AVAudioSessionPortLineIn, nil), (AVAudioSessionPortHeadsetMic, nil), (AVAudioSessionPortBluetoothHFP, nil), (AVAudioSessionPortUSBAudio, nil), (AVAudioSessionPortCarAudio, nil), (AVAudioSessionPortBuiltInMic, nil), ] for availableInput in audioSession.availableInputs! { guard let index = inputsPriority.index(where: { $0.type == availableInput.portType }) else { continue } inputsPriority[index].input = availableInput } guard let input = inputsPriority.filter({ $0.input != nil }).first?.input else { fatalError("No Available Ports For Recording") } do { try audioSession.setPreferredInput(input) try audioSession.setActive(true) } catch { fatalError("Error Setting Up Audio Session") } } /** Check availability of playing audio and setups audio session with mixing audio. */ func setupSessionForPlaying() { let audioSession = AVAudioSession.sharedInstance() do { try audioSession.setCategory(AVAudioSessionCategoryPlayback, with: [.mixWithOthers]) try audioSession.setActive(true) } catch { fatalError("Error Setting Up Audio Session") } } 

你有2个function来改变audio会话设置的主要想法。 在录音之前使用setupSessionForRecording ,在播放audio之前使用setupSessionForRecording

重要的是使用AVAudioSessionCategoryRecordAVAudioSessionCategoryPlayback ,但不是AVAudioSessionCategoryPlayAndRecord ,因为它的错误。 只有在确实需要同时播放和录制audio的AVAudioSessionCategoryPlayAndRecord才能使用AVAudioSessionCategoryPlayAndRecord