¿Es posible reproducir video usando Avplayer en segundo plano?

Estoy usando Avplayer para mostrar video clips y cuando return (aplicación en segundo plano), se detiene el video. ¿Cómo puedo seguir jugando el video?

Tengo búsqueda sobre la tarea de background y el hilo de background, IOS solo admite música en segundo plano (No video) http://developer.apple.com/library/ios/#documentation/iphone/conceptual/iphoneosprogrammingguide/ManagingYourApplicationsFlow/ManagingYourApplicationsFlow.html

aquí hay alguna discusión sobre reproducir video en segundo plano

1) https://discussions.apple.com/thread/2799090?start=0&tstart=0

2) http://www.cocoawithlove.com/2011/04/background-audio-through-ios-movie.html

Pero hay muchas aplicaciones en AppStore, que reproducen videos en background como

Swift Player: https://itunes.apple.com/us/app/swift-player-speed-up-video/id545216639?mt=8&ign-mpt=uo%3D2

SpeedUpTV: https://itunes.apple.com/ua/app/speeduptv/id386986953?mt=8

Este método admite todas las posibilidades:

  • Pantalla bloqueada por el usuario;
  • Producto en la list
  • Botón de inicio presionado;

Siempre que tenga una instancia de AVPlayer ejecutando iOS, se evitará el locking automático del dispositivo.

Primero debe configurar la aplicación para admitir el background de audio del file Info.plist, agregando en el array UIBackgroundModes el elemento de audio.

Luego ingrese su AppDelegate.m en

– (BOOL) aplicación: aplicación (UIApplication *) didFinishLaunchingWithOptions: (NSDictionary *) launchOptions:

estos methods

[[AVAudioSession shanetworkingInstance] setDelegate: self]; [[AVAudioSession shanetworkingInstance] setCategory:AVAudioSessionCategoryPlayback error:nil]; 

y #import <AVFoundation / AVFoundation.h>

Luego en su controller de vista que controla AVPlayer

 -(void)viewDidAppear:(BOOL)animated { [super viewDidAppear:animated]; [[UIApplication shanetworkingApplication] beginReceivingRemoteControlEvents]; [self becomeFirstResponder]; } 

y

 - (void)viewWillDisappear:(BOOL)animated { [mPlayer pause]; [super viewWillDisappear:animated]; [[UIApplication shanetworkingApplication] endReceivingRemoteControlEvents]; [self resignFirstResponder]; } 

luego responde a la

  - (void)remoteControlReceivedWithEvent:(UIEvent *)event { switch (event.subtype) { case UIEventSubtypeRemoteControlTogglePlayPause: if([mPlayer rate] == 0){ [mPlayer play]; } else { [mPlayer pause]; } break; case UIEventSubtypeRemoteControlPlay: [mPlayer play]; break; case UIEventSubtypeRemoteControlPause: [mPlayer pause]; break; default: break; } } 

Se necesita otro truco para reanudar la reproducción si el usuario presiona el button de inicio (en cuyo caso la reproducción se suspende con un desvanecimiento).

Cuando controle la reproducción del video (tengo methods de reproducción) establezca

 [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(applicationDidEnterBackground:) name:UIApplicationDidEnterBackgroundNotification object:nil]; 

y el método correspondiente a invocar que iniciará un timer y reanudará la reproducción.

 - (void)applicationDidEnterBackground:(NSNotification *)notification { [mPlayer performSelector:@selector(play) withObject:nil afterDelay:0.01]; } 

Me funciona para reproducir videos en Backgorund. Gracias a todos.

Si intentas cambiar el modo de background: Lo sentimos, App store no lo aprobará. Video de reproducción MPMoviePlayerViewController después de ir a segundo plano para YouTube

En mi investigación, alguien tomaría la pista de sonido para jugar en el background cuando se ponga en segundo plano, ya que el video sería pausa y obtendría el time de reproducción para la reproducción del reanudar cuando salga a primer plano

No es posible reproducir música de background / video con Avplayer. Pero es posible usar

MPMoviePlayerViewController. Lo he hecho en una de mis aplicaciones usando este reproductor y esta aplicación

se ejecuta con éxito en appstore.

Prueba con este fragment, ya lo he integrado a mi aplicación y me resulta útil … ¡Espero que esto funcione para ti!

Siga los pasos que se detallan a continuación:

  • Agregue UIBackgroundModes en APPNAME-Info.plist, con la aplicación de selección, reproduce audio
  • A continuación, agregue la estructura de AudioToolBox a los frameworks de carpetas.
  • En la APPNAMEAppDelegate.h agregue:

    #import < AVFoundation/AVFoundation.h>

    #import < AudioToolbox/AudioToolbox.h>

  • En el APPNAMEAppDelegate.m agregue lo siguiente:

    // Establecer session de audio

      NSError *sessionError = nil; [[AVAudioSession shanetworkingInstance] setDelegate:self]; [[AVAudioSession shanetworkingInstance] setCategory:AVAudioSessionCategoryPlayAndRecord error:&sessionError]; 
  • / * Elija uno de ellos * /

  • // 1. Anulación de la ruta de audio de salida

// UInt32 audioRouteOverride = kAudioSessionOverrideAudioRoute_Speaker; // AudioSessionSetProperty (kAudioSessionProperty_OverrideAudioRoute, sizeof (audioRouteOverride), y audioRouteOverride);

================================================== ============================================

// 2. Cambiar la ruta de audio de salida pnetworkingeterminada

 UInt32 doChangeDefaultRoute = 1; AudioSessionSetProperty(kAudioSessionProperty_OverrideCategoryDefaultToSpeaker, sizeof(doChangeDefaultRoute), &doChangeDefaultRoute); 

en el

 - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions { 
  • pero antes de las dos líneas:

    [self.window addSubview: viewController.view];

    [self.window makeKeyAndVisible];

¡Disfruta de la progtwigción!

Además de la respuesta de Fattomhk, esto es lo que puede hacer para lograr el reenvío de video al momento en que debería ser después de que su aplicación llegue a primer plano:

  • Obtenga currentPlaybackTime de reproducir video cuando vaya a segundo plano y guárdelo en lastPlayBackTime
  • Almacene la hora en que la aplicación va a segundo plano (en probablyDeusuario)
  • Nuevamente obtén el momento en que la aplicación aparece en primer plano
  • Calcule la duration entre el background y el time de primer plano.
  • Establezca el time de reproducción actual del video a la duration lastPlayBackTime +

Versión Swift para la respuesta aceptada.

En el delegado:

 AVAudioSession.shanetworkingInstance().setCategory(AVAudioSessionCategoryPlayback, error: nil) AVAudioSession.shanetworkingInstance().setActive(true, error: nil) 

En el controller de vista que controla AVPlayer

 override func viewDidAppear(animated: Bool) { UIApplication.shanetworkingApplication().beginReceivingRemoteControlEvents() self.becomeFirstResponder() } override func viewWillDisappear(animated: Bool) { mPlayer.pause() UIApplication.shanetworkingApplication().endReceivingRemoteControlEvents() self.resignFirstResponder() } 

No olvide "importar AVFoundation"

Si está reproduciendo videos con WebView, puede manejar el uso de javascript para reproducir videos en segundo plano.

 strVideoHTML = @"<html><head><style>body.........</style></head> <body><div id=\"overlay\"><div id=\"youtubelogo1\"></div></div><div id=\"player\"></div> <script> var tag = document.createElement('script'); tag.src = \"http://www.youtube.com/player_api\"; var firstScriptTag = document.getElementsByTagName('script')[0]; firstScriptTag.parentNode.insertBefore(tag, firstScriptTag); var player; events: { 'onReady': onPlayerReady, } }); } function onPlayerReady(event) { event.target.playVideo(); } function changeBG(url){ document.getElementById('overlay').style.backgroundImage=url;} function manualPlay() { player.playVideo(); } function manualPause() { player.pauseVideo(); } </script></body> </html>"; NSString *html = [NSString stringWithFormat:strVideoHTML,url, width, height,videoid; webvideoView.delegate = self; [webvideoView loadHTMLString:html baseURL:[NSURL URLWithString:@"http://www.your-url.com"]]; 

A la vista diappear llamada

 strscript = @"manualPlay(); [webvideoView stringByEvaluatingJavaScriptFromString:strscript]; 

Me gustaría agregar algo que por alguna razón terminó siendo el culpable para mí. Utilicé AVPlayer y reproducción de background durante mucho time sin problemas, pero esta vez no pude lograr que funcionara.

Me enteré de que cuando se pasa a segundo plano, la propiedad de rate del AVPlayer veces parece AVPlayer a 0.0 (es decir, pausada), y por esa razón simplemente necesitamos que KVO verifique la propiedad de la tasa en todo momento, o al less cuando vayamos a background. Si la tasa cae por debajo de 0.0 y podemos suponer que el usuario quiere jugar (es decir, el usuario no tocó deliberadamente pausa en los controles remotos, la película terminó, etc.) necesitamos volver a llamar a .play() en el AVPlayer.

AFAIK no hay otra palanca en el AVPlayer para evitar que se detenga cuando la aplicación va al background.