2012-07-05 17 views
7

Ok, entonces mi aplicación reproduce videos, quiero que el sonido continúe sonando en segundo plano. Pero cuando presiono el botón "Inicio" la reproducción se detiene. Estoy probando en iPhone 4s con iOS 5.0.1AVPlayer: el audio de fondo se detiene cuando se presiona el botón de inicio, pero se reproduce con la pantalla bloqueada

¿Qué está funcionando?

  • Si se reproduce el video y me bloquear la pantalla, que sigue jugando,
  • puedo controlar la reproducción a partir de los controles de la pantalla de bloqueo: siguiente, anterior, reproducción, pausa.
  • Si presiono "casa", a continuación, vaya a la "controles remotos" en la barra de tareas múltiples, funciona.

¿Qué problema?

  • Quiero la aplicación para seguir jugando cuando se presiona el botón "Inicio", porque cuando lo haga, audio se detiene.

¿Qué he hecho:

  • Agregado "audio" a "modos de antecedentes requeridas" en mi app.plist

Agregado el siguiente código de la aplicación aplicación de delegado : didFinishLaunchingWithOptions:

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

En mi controlador de vista he aplicado los métodos para recibir los mandos a distancia:

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

¿Cómo es que todo funciona, pero esto?

Respuesta

4

Stack Overflow es cada vez menos receptivo ... Espero que no sea tan malo para todos. No he encontrado nada para responder por qué el video está en pausa después de presionar el botón de Inicio, sin embargo, he venido con una solución si es de ayuda para cualquiera:

Dado que el reproductor está jugando hasta que la aplicación se apaga para el fondo, he creado un temporizador, para comprobar si la aplicación estaba jugando mientras estaba en el primer plano, en caso afirmativo, continuar con la reproducción:

- (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]; 
} 

No es la mejor opción en mi opinión, pero por ahora es trabajando, con un pequeño salto en la reproducción mientras se reanuda.

+2

También se puede registrar desde el interior de su reproductor a la 'UIApplicationDidEnterBackgroundNotification' cuando se reproduce la película y retire la observe cuando se detiene la película. Todavía tiene que usar un temporizador para reanudar el video cuando se inicia la notificación. – MacTeo

+1

Otto Boy ya comenta [este enlace] (https://developer.apple.com/library/content/qa/qa1668/_index.html), pero el temporizador no es bueno para este caso. Cuando usamos el temporizador, hay una parada breve durante 0.1seg. Simplemente eliminas AVPlayer de AVPlayerLayer. –

3

Consulte esto link de la documentación de Apple, y lea el Consideraciones especiales para la parte de medios de video. Aquí se explica por qué el video se está deteniendo y cómo puede evitarlo. Me ayudó. Intenté ambas opciones, y ambas funcionan bien.

1

Swift 3

primer registro de notificación si su aplicación va a fondo y regresa:

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) 

Opción 1 - eliminar/añadir el AVPlayer de su AVPlayerLayer:

func appEnteredBackgound() { 
    playerLayer.player = nil 
} 

func appEnteredForeground() { 
    playerLayer.player = player 
} 

Opción 2 - activar/desactivar pistas de vídeo:

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