2015-11-21 7 views
13

Ho un app che ha bisogno di avere:Utilizzando Spotify/musica di sottofondo con la macchina fotografica aperta

  • musica di sottofondo mentre si utilizza l'applicazione (es. Spotify)
  • musica di sottofondo durante la visione di film da AVPlayer
  • fermare la musica durante la registrazione di un video

Come Snapchat, la fotocamera-viewcontroller è parte di un "swipeview" e quindi sempre attiva.

Tuttavia, quando si apre e si chiude l'app, la musica emette un breve suono "crack" che distrugge la musica.

ho registrato qui: https://soundcloud.com/morten-stulen/hacky-sound-ios (3 occorrenze)

Io uso queste impostazioni per la modifica della AVAudiosession nelle didFinishLaunchingWithOptions AppDelegate:

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

     } catch { 
      print("error") 
     } 

Io uso il controllo LLSimpleCamera per la registrazione video e Ho impostato la sessione in:

_session.automaticallyConfiguresApplicationAudioSession = NO; 

Sembra altri hanno lo stesso problema con altre librerie della fotocamera, come pure: https://github.com/rFlex/SCRecorder/issues/127

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

Questo ragazzo ha rimosso l'audioDeviceInput, ma io kinda bisogno che per la registrazione video. https://github.com/omergul123/LLSimpleCamera/issues/48

Ho anche provato con il codice Apple "AvCam" e ho ancora lo stesso problema. Come fa Snapchat a fare questo ?!

Qualsiasi aiuto sarebbe molto apprezzato, e sarò lieto di fornire ulteriori informazioni o codice!

+0

Hai trovato una soluzione? Ho bisogno della stessa cosa e non posso realizzarla. –

+1

Ho trovato una soluzione, ma non è ottimale. Aggiungo audiodeviceInput quando avvio la registrazione ([self.session addInput: _audioDeviceInput];) e lo rimuovo quando ho finito. Allo stesso tempo, ho impostato la categoria AVAudioSession su AVAudioSessionCategoryPlayAndRecord, che torno anche dopo. Per compensare il comportamento strano dell'interfaccia utente della fotocamera, faccio scorrere in avanti e indietro una vista sfocata. –

+0

Sì, questo è quello che ho provato. Non ottimale come hai detto tu. Ho anche provato a mantenere la categoria PlayAndRecord con MixWithOthers, DuckOthers, DefaultToSpeaker ma la musica di sottofondo si interrompe per un secondo quando avvio la sessione. Anche la musica è troppo forte (anche con Duckothers) e non riesco a sentire bene il mio suono quando suona. –

risposta

5

Faccio qualcosa di simile a quello che vuoi, ma senza l'aspetto della fotocamera, ma penso che farà ciò che desideri. La mia app consente l'audio di sottofondo che si mescolerà con video/audio non a schermo intero. Quando l'utente riproduce un file audio o un file video a schermo intero, interrompo completamente l'audio di sottofondo.

La ragione per cui faccio SoloAmbient poi riproduzione è perché io permetto mio audio da riprodurre in background quando il dispositivo è bloccato. Going SoloAmbient interromperà la riproduzione di sottofondo musicale e passerà a Riproduzione consente di riprodurre l'audio nell'app e sullo sfondo.

Ecco perché viene visualizzata una chiamata a un metodo che imposta le informazioni della schermata di blocco nel metodo Unload. In questo caso, lo annulla in modo tale che non ci siano informazioni sulla schermata di blocco.

In 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") 
    } 
} 

Quando voglio smettere di sottofondo audio, ad esempio durante la riproduzione di una traccia audio che dovrebbe essere da sola, faccio la seguente:

In 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 
} 

E quando ho finito con i miei media, faccio questo:

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

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

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

Spero che questo ti aiuti!

+0

Grazie per la tua risposta! Tuttavia, è diverso quando si ha a che fare con una fotocamera perché la telecamera richiede l'ingresso audio. Secondo la [Documentazione Apple] (https://developer.apple.com/library/ios/documentation/Audio/Conceptual/AudioSessionProgrammingGuide/AudioSessionCategoriesandModes/AudioSessionCategoriesandModes.html#//apple_ref/doc/uid/TP40007875-CH10-SW1) l'AVAudioSessionCategoryPlayback consente solo l'output. Usando il codice di esempio, la musica di sottofondo funziona bene, ma la fotocamera non si avvia. –

Problemi correlati