2015-06-30 4 views
11

Я воспроизвожу аудио с URL-адреса с помощью AVPlayer, но когда iPhone подключен к Bluetooth-устройству, он не воспроизводится через Bluetooth, как играть по Bluetooth, если он я вижу некоторые сообщения в SO, но ни один из них не объясняется четко. Ниже мой код.Как подключить звук к Bluetooth при воспроизведении с использованием AVPlayer

-(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 

} 
+0

Вы имеете в виду, что он не воспроизводится через Bluetooth вообще, или он не воспроизводит Bluetooth при переключении с динамика на Bluetooth во время воспроизведения песни? – MDB983

+0

@ MDB983: он не воспроизводится через Bluetooth вообще. –

+0

@ MDB983: Любая идея по этому вопросу, пожалуйста, помогите мне. –

ответ

4

Попробуйте

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); 
+0

где напишите этот код –

+0

@PoojaSrivastava напишите этот код в этом методе «didFinishLaunchingWithOptions» этого файла " AppDelegate.m». Примечание: - напишите этот код перед этой строкой «[self.window makeKeyAndVisible]; ». – Pramod

2

Вам необходимо установить категорию и параметры на 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."); 
} 
2

Для 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") 
} 

Расширенная версия, чтобы быть уверенным, что вы используете правильный вход:

/** 
    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 функции для изменения настроек звука сеанса. Используйте setupSessionForRecording перед записью и setupSessionForPlaying перед воспроизведением звука.

Важно использовать AVAudioSessionCategoryRecord и AVAudioSessionCategoryPlayback, но не AVAudioSessionCategoryPlayAndRecord, из-за его ошибки. Используйте AVAudioSessionCategoryPlayAndRecord, только если вам действительно нужно играть и записывать звук одновременно.

+0

Пробовал вышеуказанный код и искал почти все решения в Интернете. Все настроено правильно. Но вход/выход гарнитуры bluetooth просто не принимаются приложением. Микрофон телефона также останавливается, когда вход успешно устанавливается в bluetoothHFP, но когда вы говорите, он не ломается. проводные гарнитуры прекрасно работают. Та же Bluetooth-гарнитура отлично работает с Siri. Есть ли другой параметр конфигурации, который мне не хватает - например, разрешения или возможности? Используемое устройство: iphone 5c (10.3.2) –

+0

@SayaleePote Вы пытались установить категорию AV на «AVAudioSessionCategoryPlayAndRecord»? –

+0

Да, ранее он был установлен в PlayAndRecord. Не работает. Затем я устанавливаю его отдельно, как предлагается здесь. Все еще нет успеха. –

 Смежные вопросы

  • Нет связанных вопросов^_^