MPMoviePlayerController que muestra una pantalla negra vacía

Utilizo MPMoviePlayerController para reproducir un file local en la carpeta de mi documento de aplicación que he descargado para una URL del server:

 itemMoviePlayerController = [[MPMoviePlayerController alloc] initWithContentURL:fileURL]; [self.view addSubview:itemMoviePlayerController.view]; itemMoviePlayerController.fullscreen = YES; itemMoviePlayerController.movieSourceType = MPMovieSourceTypeFile; itemMoviePlayerController.initialPlaybackTime = -1.0; [itemMoviePlayerController play]; 

Cuando juego el file .mov justo después de downloadlo, aparece una pantalla negra vacía y la interfaz de usuario de la aplicación no se puede utilizar. Pero si reproduce el mismo file local la próxima vez, se reproduce bien. Incluso verifiqué playState y localState para MPMoviePlayerController , parecen estar bien. ¿Cuál podría ser la razón para la pantalla negra vacía?

Debe conservar su instancia de MPMoviePlayerController, es decir, como una propiedad o una variable de instancia. La reference al reproductor de películas se pierde si no la retienes.

Puedes intentar poner [itemMoviePlayerController prepareToPlay]; antes de que [itemMoviePlayerController play];

La forma preferida por Apple para mostrar un video de pantalla completa es presentar un MPMoviePlayerViewController modal (como dijo Hollance). Para presentarlo, debe usar algo como:

  moviePlayerViewController = [[MPMoviePlayerViewController alloc] initWithContentURL:fileURL]; [self presentMoviePlayerViewControllerAnimated:moviePlayerViewController]; [itemMoviePlayerController play]; 

Esto es documentado por Apple aquí

Puede leer allí que debe mantener una reference a su MPMoviePlayerViewController para descartarlo más tarde con

[self dismissMoviePlayerViewControllerAnimated:moviePlayerViewController] .

Arreglé esto poniendo

 @property (strong, nonatomic) MPMoviePlayerController *moviePlayer; 

en mi file .h, y llamando a self.moviePlayer en todo mi código y funcionó.

Debe usar MPMoviePlayerViewController en su lugar. Observe la palabra "Ver" allí.

Espero que esto sea de ayuda. Resolví este problema en mi proyecto.

  -(void)startPlayingMovie { NSLog(@"startPlayingMovie"); NSURL *url = [NSURL fileURLWithPath:[[NSBundle mainBundle] pathForResource:@"Start_video" ofType:@"mov"]]; moviePlayer = [[MPMoviePlayerViewController alloc] initWithContentURL:url]; moviePlayer.view.frame = CGRectMake(0, 0, self.view.bounds.size.height, self.view.bounds.size.width); [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(moviePlayBackDidFinish:) name:MPMoviePlayerPlaybackDidFinishNotification object:moviePlayer.moviePlayer]; moviePlayer.moviePlayer.controlStyle = MPMovieControlStyleNone; moviePlayer.moviePlayer.shouldAutoplay = YES; [self presentMoviePlayerViewControllerAnimated:moviePlayer]; [moviePlayer.moviePlayer setFullscreen:YES animated:NO]; NSLog(@"endPlayingMovie"); } 

A mi me pasó lo mismo. Resulta que había intentado tocar la película mientras que el UIImagePicker no fue descartado todavía.

En mi UIImagePickerDelegate tuve que descartar primero el UIImagePicker Popup y luego abrir el ViewController administra el MPMediaPlayerController :

 - (void)imagePickerController:(UIImagePickerController *)picker didFinishPickingMediaWithInfo:(NSDictionary *)infoDict { //the first thing to do: dismiss the media picker if ([ipPop isPopoverVisible]) { [ipPop dismissPopoverAnimated:ANIMATION_SETTING]; } myMediaPlayerViewController * playerVC = [[myMediaPlayerViewController alloc] initWithMediaDict:infoDict]; [self.navigationController pushViewController:playerVC animated:ANIMATION_SETTING]; } 

Tuve el mismo problema y me volvió loco. Funcionaría en un controller de vista bien (audio y video), pero no funcionaría en otro (pantalla negra con solo audio). Al final, todo lo que hice fue CAMBIAR EL ORDEN de las llamadas: simplemente esperé hasta que terminé de configurar el reproductor de películas antes de agregarlo a la vista. En otras palabras, llamé a "addSubview" en la línea justo antes de la llamada para "reproducir".

Este es el código que estoy usando para reproducir un file desde la URL:

 MPMoviePlayerViewController *movieViewController = [[MPMoviePlayerViewController alloc] initWithContentURL:[NSURL URLWithString:contentUrl]]; movieViewController.moviePlayer.movieSourceType = MPMovieSourceTypeFile; [self presentMoviePlayerViewControllerAnimated:movieViewController]; [movieViewController release]; 

Parece funcionarme bien. Dos notas:

  • Algunos simuladores (como el actual iOS 5.0) se cuelgan cuando se reproduce una película, pero funciona en un dispositivo real
  • Si movieSourceType parte movieSourceType , se muestra una pantalla en negro durante aproximadamente un segundo antes de que comience la película

Tuve el mismo problema, lo resolví cambiando la extensión del file que se está reproduciendo desde .mpg a .mp4. aparentemente MPMoviePlayerController espera una extensión correcta, aunque de la documentation no está claro para mí que este es un requisito:

http://developer.apple.com/library/ios/#documentation/mediaplayer/reference/MPMoviePlayerController_Class/Reference/Reference.html

Formatos compatibles Esta class reproduce cualquier película o file de audio compatible con iOS. Esto incluye tanto contenido transmitido como files de longitud fija. Para los files de película, esto generalmente significa files con las extensiones .mov, .mp4, .mpv y .3gp y con uno de los siguientes estándares de compression:

Este problema parece corregido después de actualizar el dispositivo iOS a 5.0.
Parece que el problema del SDK de iOS para la versión anterior

¡debes hacer así con CGRectMake (0, 0, 0, 0) en la callback finalizada!

 -(void)playMovieAtURL:(NSURL*)theURL { MPMoviePlayerController* theMovie=[[MPMoviePlayerController alloc] initWithContentURL:theURL]; theMovie.scalingMode=MPMovieScalingModeAspectFill; theMovie.view.frame = CGRectMake(2, 246, 317, 70); [self.view addSubview:theMovie.view]; // Register for the playback finished notification. [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(myMovieFinishedCallback:) name:MPMoviePlayerPlaybackDidFinishNotification object:theMovie]; // Movie playback is asynchronous, so this method returns immediately. [theMovie play]; } // When the movie is done,release the controller. -(void)myMovieFinishedCallback:(NSNotification*)aNotification { MPMoviePlayerController* theMovie=[aNotification object]; [[NSNotificationCenter defaultCenter] removeObserver:self name:MPMoviePlayerPlaybackDidFinishNotification object:theMovie]; theMovie.view.frame = CGRectMake(0, 0, 0, 0); // Release the movie instance created in playMovieAtURL [theMovie release]; } 

Estaba teniendo un problema similar. Después de la reproducción, aparece una pantalla vacía que evita que vuelva a reproducir el video. Bueno, aquí está mi trabajo. De esa forma, el button de reproducción no desaparece.

 [self.movieController stop]; [self.movieController prepareToPlay]; [self.movieController pause]; 

Además, si usa URL http, asegúrese de deshabilitar la security de transporte de aplicaciones en su file * .plist de proyectos. También causará una pantalla negra.

Agregue el siguiente código:

 <key>NSAppTransportSecurity</key> <dict> <key>NSAllowsArbitraryLoads</key><true/> </dict> 

Aquí:

  [INSERT CODE ABOVE HERE] </dict> </plist> ----- BOTTOM OF PLIST FILE