2011-08-13 8 views
9

OK, hay muy pocas opciones para emular el video splash en iOS. Todo lo que podemos hacer es esperar hasta que la aplicación esté completamente cargada y luego crear el Reproductor multimedia y cargar el video en él.Emulando el video saliente en la aplicación iOS

he implementado con el código siguiente:

-(void) moviePlayBackDidFinish:(NSNotification*)notification 
{ 
    NSLog(@"Intro video stopped"); 
    [mMoviePlayer release]; 
} 

- (void)applicationDidFinishLaunching:(UIApplication *)application { 
    NSURL* mMovieURL; 
    NSBundle *bundle = [NSBundle mainBundle]; 
    if(bundle != nil) 
    { 
     NSString *moviePath = [bundle pathForResource:@"intro" ofType:@"mp4"]; 
     if (moviePath) 
     { 
      mMovieURL = [NSURL fileURLWithPath:moviePath]; 
      [mMovieURL retain]; 
     } 
    } 

    mMoviePlayer = [[MPMoviePlayerController alloc] initWithContentURL:mMovieURL]; 
    [mMovieURL release]; 

    [[NSNotificationCenter defaultCenter] addObserver:self 
              selector:@selector(moviePlayBackDidFinish:) 
               name:MPMoviePlayerPlaybackDidFinishNotification 
               object:mMoviePlayer]; 

    mMoviePlayer.controlStyle = MPMovieControlStyleNone; 
    [mMoviePlayer.backgroundView addSubview:[[[UIImageView alloc] initWithImage:[UIImage imageNamed:@"Splash/background.png"]] autorelease]]; 
    mMoviePlayer.scalingMode = MPMovieScalingModeFill; 

    [window addSubview:mMoviePlayer.view]; 
    [mMoviePlayer setFullscreen:YES animated:NO]; 

    [window makeKeyAndVisible]; 
    [mMoviePlayer play]; 

<... other stuff ...> 

} 

Mi video es sólo 1 MB. Pero este código hace algo diferente de lo que me gustaría ver:

  1. En primer lugar, el usuario puede ver una pantalla de bienvenida estática durante unos segundos;
  2. Luego aparece una pantalla negra durante 1 o 2 segundos. Creo que esto está sucediendo porque el reproductor multimedia está cargado.
  3. Se inicia el video.
  4. Carga de la interfaz principal.

Como usted entiende, no me gusta la pausa con pantalla negra: se ve feo.

Por lo que puedo ver en el registro de mi consola, el problema es que el reproductor de medios está esperando hasta que el controlador de vista principal esté completamente cargado.

Algunas palabras sobre la vista principal: estoy escribiendo una aplicación para iPad y la vista principal consiste en varias subvistas con varias imágenes. Cada imagen y cada subvista en la vista principal carga algunos datos del servicio web de Internet a través de ASIHTTPRequest lib.

creo que Media Player está esperando para todas las conexiones iniciales a fin y sólo entonces se está empezando el video ...

¿Cómo puedo forzar el video para jugar antes de cargar vista principal? ¿O quizás puedo retrasar la carga del XIB principal?

Respuesta

11

No puede deshacerse de la imagen de bienvenida estática. Mientras se muestra, el sistema operativo está cargando la aplicación y instanciando cosas hasta que esté listo para llamar a su UIApplicationDelegate. Entonces, todo lo que puede hacer es no utilizar salpicaduras (pantalla negra durante unos segundos) o hacer que la película comience exactamente con la pantalla de bienvenida que se muestra para que parezca que la imagen estática se animará repentinamente.

Para deshacerse de la pantalla en negro mientras se carga la película, puede intentar con make the player transparent y tener un UIImageView detrás del reproductor que muestra la imagen de bienvenida. El comportamiento sería el siguiente:

  • Se muestra la pantalla de bienvenida (imagen estática).
  • La aplicación está cargada. Verá el UIImageView, que también muestra la pantalla de inicio. Encima de eso está el reproductor de películas transparente.
  • El reproductor de películas finalmente ha cargado el movimiento y comienza a reproducirlo.

Al menos en teoría, esto debería provocar el efecto de que la imagen estática empiece a animarse repentinamente.

Pero si no usa una pantalla de bienvenida (muchos juegos lo hacen), entonces no importa que el reproductor muestre una pantalla negra al principio, no lo notaría.

En cuanto a mostrar la pantalla de bienvenida en un UIImageView: desafortunadamente, you have to test the interface rotation and load the image manually, no hay forma de consultar qué pantalla de bienvenida se mostró.Si solo admite una orientación de interfaz (una vez más, muchos juegos lo hacen), no tiene este problema, por supuesto.

+0

Gracias, creo que es una mejor solución :) Aunque no puedo entender por qué el jugador espera todas las conexiones ... – WASD42

10

Ahora hay una solución mejor, suponiendo que está utilizando UIViewControllers.

En lugar de usar MPMoviePlayerController, use MPMoviePlayerViewController. Aquí hay un código de ejemplo, una adaptación de la pregunta:

- (void)applicationDidFinishLaunching:(UIApplication *)application { 
    NSURL* mMovieURL; 
    NSBundle *bundle = [NSBundle mainBundle]; 
    if(bundle != nil) 
    { 
     NSString *moviePath = [bundle pathForResource:@"intro" ofType:@"mp4"]; 
     if (moviePath) 
     { 
      mMovieURL = [NSURL fileURLWithPath:moviePath]; 
      [mMovieURL retain]; 
     } 
    } 

    mMoviePlayer = [[MPMoviePlayerViewController alloc] initWithContentURL:mMovieURL]; 
    [mMovieURL release]; 
    [[NSNotificationCenter defaultCenter] addObserver:self 
              selector:@selector(moviePlayBackDidFinish) 
               name:MPMoviePlayerPlaybackDidFinishNotification 
               object:mMoviePlayer.moviePlayer]; 
    mMoviePlayer.moviePlayer.controlStyle = MPMovieControlStyleNone; 
    [mMoviePlayer.moviePlayer.backgroundView addSubview:[[[UIImageView alloc] initWithImage:[UIImage imageNamed:@"SplashCopy.png"]] autorelease]]; 
    mMoviePlayer.moviePlayer.scalingMode = MPMovieScalingModeFill; 
    [window.rootViewController.view addSubview:mMoviePlayer.moviePlayer.view]; 
    [mMoviePlayer.moviePlayer setFullscreen:YES animated:NO]; 
    [mMoviePlayer.moviePlayer play]; 

}

+4

Esto funcionó bien para mí, excepto que en el lanzamiento de la aplicación, window.rootViewController es nulo, así que llamar a addSubview en no hace nada Como resultado, puede escuchar el video, pero no verlo. Para solucionar esto, reemplace esa línea addSubview con: "window.rootViewController = moviePlayer;" ... y luego en su método moviePlayBackDidFinish, reasigne eso a lo que quiera que sea su controlador de vista raíz después de que termine la película. –

+1

funcionó para mí también. Pero, tuve que configurar el marco de vista moviePlayer para que coincida con el marco de visualización rootViewController para deshacerse de un mensaje de advertencia de aumento automático. – Brainware

0

Emulación de vídeo chapoteo en la aplicación iOS este código para swift4.0

 var mMovieURL: URL? 
     let bundle = Bundle.main 
     if bundle != nil { 
      let moviePath: String? = bundle.path(forResource: "intro", ofType: "mp4") 
      if moviePath != nil { 
       mMovieURL = URL(fileURLWithPath: moviePath ?? "") 

      } 
     } 
     mMoviePlayer = MPMoviePlayerController(contentURL: mMovieURL!) 
     NotificationCenter.default.addObserver(self, selector: #selector(self.moviePlayBackDidFinish), name: .MPMoviePlayerPlaybackDidFinish, object: mMoviePlayer) 
     mMoviePlayer.controlStyle = .none 
     mMoviePlayer.backgroundView.addSubview(UIImageView(image: UIImage(named: "Splash.png"))) 
     mMoviePlayer.scalingMode = .fill 
     window?.addSubview(mMoviePlayer.view) 
     // window?.rootViewController?.view.addSubview(mMoviePlayer.view) 
     mMoviePlayer.setFullscreen(true, animated: false) 
     window?.makeKeyAndVisible() 
     mMoviePlayer.play() 

     return true 
    } 

    @objc func moviePlayBackDidFinish(_ notification: Notification) { 
     mMoviePlayer.view.removeFromSuperview() 
    }