2016-01-02 10 views
11

Sto provando a riprodurre un video utilizzando MPMoviePlayerController per un'app iOS in Swift.Impostare MPNowPlayingInfoCenter con altro audio di sottofondo in riproduzione

Il mio obiettivo è poter riprodurre musica di sistema con qualcosa come la musica di Apple, quindi aprire la mia app e inserire l'audio, ma voglio che la mia app sia in grado di assumere il controllo di MPNowPlayingInfoCenter.

Come è possibile utilizzare AVAudioSession.sharedInstance().setCategory(AVAudioSessionCategoryPlayback, withOptions: .MixWithOthers) mentre si imposta MPNowPlayingInfoCenter?

Google Maps mescola audio durante l'impostazione di MPNowPlayingInfoCenter. Qui di seguito è come sto cercando di impostare il MPNowPlayingInfoCenter:

func setMeta(){ 
    UIApplication.sharedApplication().beginReceivingRemoteControlEvents() 
    self.becomeFirstResponder() 
    if let player = PlayWorkoutViewController.player{ 
     let coverArt = MPMediaItemArtwork(image: UIImage(named: "AlbumArt")!) 
     let dict: [String: AnyObject] = [ 
      MPMediaItemPropertyArtwork: coverArt, 
      MPMediaItemPropertyTitle:workout.title, 
      MPMediaItemPropertyArtist:"Alex", 
      MPMediaItemPropertyAlbumTitle:workout.program.title, 
      MPNowPlayingInfoPropertyPlaybackRate: player.currentPlaybackRate, 
      MPNowPlayingInfoPropertyElapsedPlaybackTime: player.currentPlaybackTime, 
      MPMediaItemPropertyPlaybackDuration: player.playableDuration 
     ] 
     MPNowPlayingInfoCenter.defaultCenter().nowPlayingInfo = dict 
    } 
} 

La funzione di cui sopra funziona quando sono non cercando di riprodurre la musica all'esterno con un'opzione (.MixWithOthers), allo stesso tempo, ma mentre sto cercando di riprodurre musica esterna con l'opzione (.MixWithOthers), il centro informazioni non viene aggiornato.

Modifica 1: solo per rendere le cose super nitide, ho già il video che riproduce correttamente sto cercando di riprodurre video con altri audio di sottofondo pur essendo in grado di impostare MPNowPlayingInfoCenter.

risposta

3

Questo non è attualmente possibile in iOS. Anche solo modificando le opzioni di categoria su .MixWithOthers viene ignorato lo nowPlayingInfo.

La mia ipotesi è iOS considera solo le app non di missaggio per l'inclusione in MPNowPlayingInfoCenter, perché non vi è alcuna incertezza su quale app apparirebbe nel (ad esempio) Centro di controllo se ci sono più app di missaggio in riproduzione allo stesso tempo.

Mi piacerebbe molto se iOS utilizzato un approccio best-effort per la scelta del "Now Playing app", qualcosa di simile:

  1. Se c'è un app di gioco non-miscelazione, raccogliere quello. Altrimenti ..
  2. Se è in esecuzione una sola app di missaggio, scegli quella. Altrimenti ..
  3. Se ci sono più app di missaggio in riproduzione, scegline una :) o scegli nessuna, sto bene con entrambi.

Se desideri questo comportamento, ti incoraggio a segnalare un problema con Apple.

0

Hai provato a implementare la tua funzione personalizzata per aggiornare MPNowPlayingInfoCenter? Recentemente stavo usando un AVAudioPlayer per riprodurre musica e dovevo fare l'aggiornamento manualmente.

Questa è fondamentalmente la funzione che ho chiamato su un nuovo brano in fase di caricamento.

func updateNowPlayingCenter() { 
    let center = MPNowPlayingInfoCenter.defaultCenter() 
    if nowPlayingItem == nil { 
     center.nowPlayingInfo = nil 
    } else { 
     var songInfo = [String: AnyObject]() 

     // Add item to dictionary if it exists 
     if let artist = nowPlayingItem?.artist { 
      songInfo[MPMediaItemPropertyArtist] = artist 
     } 
     if let title = nowPlayingItem?.title { 
      songInfo[MPMediaItemPropertyTitle] = title 
     } 
     if let albumTitle = nowPlayingItem?.albumTitle { 
      songInfo[MPMediaItemPropertyAlbumTitle] = albumTitle 
     } 
     if let playbackDuration = nowPlayingItem?.playbackDuration { 
      songInfo[MPMediaItemPropertyPlaybackDuration] = playbackDuration 
     } 
     if let artwork = nowPlayingItem?.artwork { 
      songInfo[MPMediaItemPropertyArtwork] = artwork 
     } 
     center.nowPlayingInfo = songInfo 
    } 
} 

Non sono sicuro se questo modo su di un film viene caricato sovrascriverà la MPMoviePlayerController, ma sembra la pena un colpo.

Inoltre, hanno ammortizzato MPMoviePlayerController e lo hanno sostituito con AVPlayerViewController, quindi vale anche la pena esaminare.

Modifica: inoltre, vorrei verificare che stiate ricevendo correttamente gli eventi del telecomando, in quanto ciò influisce sui dati visualizzati dal centro informazioni.

+0

Ciao, grazie per la risposta. Ho aggiornato la domanda. Il problema non è l'impostazione del centro informazioni normalmente è l'impostazione del centro informazioni durante la riproduzione di musica con l'opzione .MixWithOthers –

0

per riprodurre il video in uso rapido questo: -

func playVideoEffect() { 
    let path = NSBundle.mainBundle().pathForResource("egg_grabberAnmi", ofType:"mp4") 
    let url = NSURL.fileURLWithPath(path!) 
    self.moviePlayer = MPMoviePlayerController(contentURL: url) 
    if let player = moviePlayer { 
     let screenSize: CGRect = UIScreen.mainScreen().bounds 
     player.view.frame = CGRect(x: frame.size.width*0.10,y: frame.size.width/2, width:screenSize.width * 0.80, height: screenSize.width * 0.80) 
     player.view.sizeToFit() 
     player.scalingMode = MPMovieScalingMode.Fill 
     player.fullscreen = true 
     player.controlStyle = MPMovieControlStyle.None 
     player.movieSourceType = MPMovieSourceType.File 
     player.play() 
     self.view?.addSubview(player.view) 
     var timer = NSTimer.scheduledTimerWithTimeInterval(6.0, target: self, selector: Selector("update"), userInfo: nil, repeats: false)  
    } 
} 


// And Use the function to play Video 
playVideoEffect() 
+1

OK Bello, ma posso riprodurre video da URL Come "http: //" in swift –

+0

sì, possiamo: - var url: NSURL = NSURL (stringa: "Il tuo URL") – Rex

+0

@Raksha Penso che tu abbia completamente perso la domanda. So già come riprodurre video, ti preghiamo di rileggere la domanda. –