2012-07-05 6 views
7

Ok, quindi la mia app riproduce video, voglio che il suono continui a suonare in background. Ma quando premo il pulsante "Home" la riproduzione si interrompe. Sto testando su iPhone 4s con iOS 5.0.1AVPlayer: l'audio in background si interrompe quando viene premuto il tasto Home, ma viene riprodotto con lo schermo bloccato

ciò che funziona?

  • Se il video è in riproduzione e ho bloccare schermo, si continua a giocare,
  • posso controllare la riproduzione dei controlli dello schermo di blocco: il prossimo, precedente, play, pausa.
  • Se premo "casa", quindi passare alla sezione "telecomandi" dalla barra multitask, funziona.

Cosa c'è che non va?

  • voglio l'applicazione di continuare a giocare quando si preme il tasto "home", perché quando lo faccio, audio si interrompe.

Che cosa ho fatto:

  • Aggiunto "audio" a "Richiesto modalità sfondo" nel mio app.plist

aggiunto il seguente codice per app applicazione del delegato : didFinishLaunchingWithOptions:

NSError *setCategoryErr = nil; 
NSError *activationErr = nil; 
[[AVAudioSession sharedInstance] setCategory: AVAudioSessionCategoryPlayback error:&setCategoryErr];  
[[AVAudioSession sharedInstance] setActive:YES error:&activationErr]; 

A mio controller della vista Ho implementato i metodi per ricevere telecomandi:

- (BOOL)canBecomeFirstResponder { 
    return YES; 
} 
- (void)viewDidAppear:(BOOL)animated { 
    [super viewDidAppear:animated]; 
    [[UIApplication sharedApplication] beginReceivingRemoteControlEvents]; 
    [self becomeFirstResponder]; 
} 
- (void)viewWillDisappear:(BOOL)animated { 
    [super viewWillDisappear:animated]; 

    //End recieving events 
    [[UIApplication sharedApplication] endReceivingRemoteControlEvents]; 
    [self resignFirstResponder]; 
} 

- (void)remoteControlReceivedWithEvent:(UIEvent *)receivedEvent { 
    if (receivedEvent.type == UIEventTypeRemoteControl) { 

     switch (receivedEvent.subtype) { 

      case UIEventSubtypeRemoteControlTogglePlayPause: 
       [self play:nil]; 
       break; 

      case UIEventSubtypeRemoteControlPreviousTrack: 
       [self actionPlaybackPreviousItem]; 
       break; 

      case UIEventSubtypeRemoteControlNextTrack: 
       [self actionPlaybackNextItem]; 
       break; 

      default: 
       break; 
     } 
    } 
} 

Come mai tutto funziona, ma, questo?

risposta

4

Stack Overflow sta diventando sempre meno reattivo ogni volta ... Speriamo che non sia poi così male per tutti là fuori. Non ho trovato nulla da rispondere perché è che il video è in pausa dopo aver premuto il pulsante Home, tuttavia, sono venuto con una soluzione se è di aiuto a chiunque:

Poiché il giocatore sta giocando fino a quando l'app non va per lo sfondo, ho creato un timer, per verificare se l'applicazione stava giocando mentre era in primo piano, in caso affermativo, riprendere la riproduzione:

- (void)applicationWillResignActive:(UIApplication *)application 
{ 
    MainViewController* mainController=self.viewController; 
    playerWasPlaying=mainController.player.rate!=0; 
} 

-(void)resumePlayback { 
    MainViewController* mainController=self.viewController; 
    if (mainController.player.rate==0&&playerWasPlaying) 
     [mainController play:nil]; 
} 
- (void)applicationDidEnterBackground:(UIApplication *)application 
{ 
    [NSTimer scheduledTimerWithTimeInterval:0.1 target:self selector:@selector(resumePlayback) userInfo:nil repeats:NO]; 
} 

non la soluzione migliore, a mio parere, ma per ora è funzionante, con un piccolo salto nella riproduzione mentre riprende.

+2

È inoltre possibile registrare da dentro il lettore al 'UIApplicationDidEnterBackgroundNotification' quando il film è in riproduzione e rimuovere il osservare quando si arresta il filmato. Devi ancora utilizzare un timer per riprendere il video quando viene avviata la notifica. – MacTeo

+1

Otto Boy è già un commento [questo collegamento] (https://developer.apple.com/library/content/qa/qa1668/_index.html), ma il timer non è buono per questo caso. Quando usiamo il timer, c'è un breve stop durante 0.1 secondi. Basta rimuovere AVPlayer da AVPlayerLayer. –

3

Vedere questo link dalla documentazione Apple e leggere la parte Considerazioni speciali per supporti video. Ecco spiegato perché il video è in pausa e come puoi evitarlo. Mi ha aiutato. Ho provato entrambe le opzioni, ed entrambe funzionano bene.

1

Swift 3

primo registro per la notifica quando la vostra applicazione va a sfondo e torna:

NotificationCenter.default.addObserver(self, selector: #selector(appEnteredBackgound), name: Notification.Name.UIApplicationDidEnterBackground, object: nil) 
NotificationCenter.default.addObserver(self, selector: #selector(appEnteredForeground), name: Notification.Name.UIApplicationWillEnterForeground, object: nil) 

Opzione 1 - rimuovere/aggiungere il AVPlayer dalla sua AVPlayerLayer:

func appEnteredBackgound() { 
    playerLayer.player = nil 
} 

func appEnteredForeground() { 
    playerLayer.player = player 
} 

Opzione 2 - abilitare/disabilitare le tracce video:

func appEnteredBackgound() { 
    if let tracks = player.currentItem?.tracks { 
    for track in tracks { 
     if track.assetTrack.hasMediaCharacteristic(AVMediaCharacteristicVisual) { 
     track.isEnabled = false 
     } 
    } 
    } 
} 

func appEnteredForeground() { 
    if let tracks = player.currentItem?.tracks { 
    for track in tracks { 
     if track.assetTrack.hasMediaCharacteristic(AVMediaCharacteristicVisual) { 
     track.isEnabled = true 
     } 
    } 
    } 
}