2015-11-21 29 views
13

Mam app, które musi posiadać:Korzystanie Spotify/tło muzyczne z kamery otwartym

  • tle gra muzyka podczas korzystania z aplikacji (Np. Spotify)
  • tło odtwarzania muzyki podczas oglądania filmu z AVPlayer
  • zatrzymać odtwarzanie muzyki podczas nagrywania filmu

Podoba snapchat, aparat-viewcontroller jest częścią „swipeview” i dlatego zawsze włączony.

Jednak podczas otwierania i zamykania aplikacji muzyka tworzy krótki "trzask" hałas/dźwięk, który niszczy muzykę.

Nagrałem go tutaj: https://soundcloud.com/morten-stulen/hacky-sound-ios (3 wystąpień)

używam tych ustawień do zmiany AVAudiosession w appdelegate didFinishLaunchingWithOptions:

 do { 
      try AVAudioSession.sharedInstance().setCategory(AVAudioSessionCategoryPlayAndRecord,withOptions: 
       [AVAudioSessionCategoryOptions.MixWithOthers, 
       AVAudioSessionCategoryOptions.DefaultToSpeaker]) 
      try AVAudioSession.sharedInstance().setActive(true) 

     } catch { 
      print("error") 
     } 

używam kontrolę LLSimpleCamera do nagrywania wideo i Skonfigurowałem tam sesję na:

_session.automaticallyConfiguresApplicationAudioSession = NO; 

Wydaje inni mają ten sam problem z innymi bibliotekami kamer, a także: https://github.com/rFlex/SCRecorder/issues/127

https://github.com/rFlex/SCRecorder/issues/224

Ten facet usunął audioDeviceInput, ale trochę trzeba, że ​​do nagrywania wideo. https://github.com/omergul123/LLSimpleCamera/issues/48

Próbowałem również z kodem Apple "AvCam" i nadal mam ten sam problem. Jak Snapchat to robi ?!

Każda pomoc zostanie bardzo doceniona, a ja z chęcią udzielę więcej informacji lub kodu!

+0

Czy znalazłeś rozwiązanie? Potrzebuję tego samego i nie mogę tego osiągnąć. –

+1

Znalazłem rozwiązanie, ale nie jest optymalne. Dodaję audiodeviceInput, gdy zaczynam nagrywanie ([self.session addInput: _audioDeviceInput];) i usuwam, gdy skończę. Jednocześnie ustawiam kategorię AVAudioSession na AVAudioSessionCategoryPlayAndRecord, którą również później przełączam. Aby zrekompensować dziwne zachowanie UI kamery, pojawia się na wierzchu widok rozmycia. –

+0

Tak, właśnie tego próbowałem. Nie optymalny, jak powiedziałeś. Próbowałem również zachować kategorię PlayAndRecord za pomocą MixWithOthers, DuckOthers, DefaultToSpeaker, ale podkład muzyczny zatrzymuje się na sekundę, gdy inicjuję sesję. Również muzyka jest zbyt głośna (nawet w przypadku Duckothers) i nie słyszę dobrze własnego dźwięku podczas grania. –

Odpowiedz

5

Robię coś podobnego do tego, czego chcesz, ale bez aspektu aparatu, ale myślę, że zrobi to, co chcesz. Moja aplikacja pozwala na dźwięk w tle, który będzie miksowany z nie pełnoekranowym wideo/audio. Kiedy użytkownik odtwarza plik audio lub plik wideo na pełnym ekranie, całkowicie zatrzymuję podkład dźwiękowy.

Powodem zrobić SoloAmbient następnie Odtwarzanie dlatego pozwalam moim audio mają być odtwarzane w tle, gdy urządzenie jest zablokowane. Going SoloAmbient zatrzyma odtwarzanie wszystkich podkładów muzycznych, a następnie przełączenie na Odtwarzanie pozwala odtwarzać dźwięk zarówno w aplikacji, jak iw tle.

Dlatego pojawia się wezwanie do metody, która ustawia informacje na ekranie blokady w metodzie Unload. W tym przypadku jest to zerowanie, więc nie ma informacji o ekranie blokady.

W AppDelegate.Swift

//MARK: Audio Session Mixing 
func allowBackgroundAudio() 
{ 
    do { 
     try AVAudioSession.sharedInstance().setCategory(AVAudioSessionCategoryPlayback, withOptions: .MixWithOthers) 
    } catch { 
     NSLog("AVAudioSession SetCategory - Playback:MixWithOthers failed") 
    } 
} 

func preventBackgroundAudio() 
{ 
    do { 
     //Ask for Solo Ambient to prevent any background audio playing, then change to normal Playback so we can play while locked 
     try AVAudioSession.sharedInstance().setCategory(AVAudioSessionCategorySoloAmbient) 
     try AVAudioSession.sharedInstance().setCategory(AVAudioSessionCategoryPlayback) 
    } catch { 
     NSLog("AVAudioSession SetCategory - SoloAmbient failed") 
    } 
} 

Kiedy chcę zatrzymać dźwięku tła, na przykład podczas odtwarzania ścieżki dźwiękowej, która powinna być sama, wykonaj następujące czynności:

W MyAudioPlayer.swift

func playUrl(url: NSURL?, backgroundImageUrl: NSURL?, title: String, subtitle: String) 
{ 
    ForgeHelper.appDelegate().preventBackgroundAudio() 

    if _mediaPlayer == nil { 
     self._mediaPlayer = MediaPlayer() 
     _mediaPlayer!.delegate = self 
    } 

    //... Code removed for brevity 
} 

Kiedy skończę grać w mediach, robię to:

private func unloadMediaPlayer() 
{ 
    if _mediaPlayer != nil { 
     _mediaPlayer!.unload() 
     self._mediaPlayer = nil 
    } 

    _controlView.updateForProgress(0, duration: 0, animate: false) 

    ForgeHelper.appDelegate().allowBackgroundAudio() 
    setLockScreenInfo() 
} 

Mam nadzieję, że to pomoże!

+0

Dzięki za odpowiedź! Jednak jest inaczej w przypadku kamery, ponieważ kamera wymaga wejścia audio. Zgodnie z [Dokumentacja Apple] (https://developer.apple.com/library/ios/documentation/Audio/Conceptual/AudioSessionProgrammingGuide/AudioSessionCategoriesandModes/AudioSessionCategoriesandModes.html#//apple_ref/doc/uid/TP40007875-CH10-SW1) AVAudioSessionCategoryPlayback pozwala tylko na wyjście. Używając przykładowego kodu, muzyka w tle będzie dobrze odtwarzana, ale aparat się nie uruchomi. –