2012-10-10 41 views
30

He creado un proyecto en blanco (IOS) y poner esto en mi viewDidLoad:iOS: Cómo utilizar MPMoviePlayerController

NSString *moviePath = [[NSBundle mainBundle] pathForResource:@"Movie" ofType:@"m4v"]; 
MPMoviePlayerViewController *playerController = [[MPMoviePlayerViewController alloc] initWithContentURL:[NSURL fileURLWithPath:moviePath]]; 
[self presentMoviePlayerViewControllerAnimated:playerController]; 
[playerController.moviePlayer play]; 

Cuando se inicia la aplicación de todo lo que consigo es una pantalla blanca con mensajes de error en el ingrese:

<Error>: CGContextSaveGState: invalid context 0x0 
<Error>: CGContextClipToRect: invalid context 0x0 
<Error>: CGContextTranslateCTM: invalid context 0x0 
<Error>: CGContextDrawShading: invalid context 0x0 
<Error>: CGContextRestoreGState: invalid context 0x0 
Warning: Attempt to present <MPMoviePlayerViewController: 0x821e3b0> on <ViewController: 0x863aa40> whose view is not in the window hierarchy! 

... y un montón de líneas con respecto a la desactivación de reproducción automática. Especialmente no entiendo la línea sobre la vista que no forma parte de la jerarquía, ya que es un proyecto de iOS "Aplicación de vista única" en blanco y el código está en ViewController.m. ESTÁ en la jerarquía de vista.

Sé con certeza que el archivo de película en sí no es el problema porque lo obtuve del código de muestra de Apple en MPMoviePlayer. Y aunque (aparentemente) intenté todo lo escrito en la muestra, simplemente no pude hacer que el jugador trabajara.

Aquí es otro intento, esta vez con MPMoviePlayerController (no MPMoviePlayerViewController):

MPMoviePlayerController *player = [[MPMoviePlayerController alloc] initWithContentURL:url]; 
[player setContentURL:url]; 
[player setMovieSourceType:MPMovieSourceTypeFile]; 

[[player view] setFrame:self.view.bounds]; 
[player view].backgroundColor = [UIColor greenColor]; 

player.scalingMode = MPMovieScalingModeNone; 
player.controlStyle = MPMovieControlModeDefault; 
player.backgroundView.backgroundColor = [UIColor whiteColor]; 
player.repeatMode = MPMovieRepeatModeNone; 

[self.view addSubview: [player view]]; 
[player play]; 

un resultado similar, con pantalla en blanco y los errores. Por favor, ayuda ....

+0

trate de poner en 'viewDidAppear'. –

+0

Poniéndolo en viewDidAppear resolvió los errores de contexto, gracias, pero todavía no obtengo el reproductor, solo una pantalla en blanco –

Respuesta

89

Resulta que todo lo que tenemos a hacer es esto:

NSURL *movieURL = [NSURL URLWithString:@"http://example.com/somefile.mp4"]; 
movieController = [[MPMoviePlayerViewController alloc] initWithContentURL:movieURL]; 
[self presentMoviePlayerViewControllerAnimated:movieController]; 
[movieController.moviePlayer play]; 
  • movieController es una instancia de MPMoviePlayerViewController declarada en el fichero .h.

  • Importante: al definir la URL utilizar el método de NSURL URLWithString si desea acceder al archivo a través de una red y el uso de fileUrlWithPath si tiene el archivo localmente NSURL!

  • [movieController.moviePlayer play]no se requiere y el reproductor comenzará a importar si no configuró la reproducción automática de NO, pero he observado que si se pone play en ella se inicia un poco más rápido. Esto podría ser solo una coincidencia.

  • Si quieres saber cuando el usuario golpeó el botón de hecho (el jugador será expulsado automáticamente) debe saber que -viewDidAppear se llama en el controlador de la vista que aparece cuando se desestimó el jugador. Puede establecer una variable BOOL cuando el jugador se inicia y verificar el BOOL en su -viewDidAppear para que sepa que -viewDidAppear se llamó porque el jugador fue despedido. Alternativamente, puede registrarse para la notificación MPMoviePlayerDidExitFullScreen, pero eso no funcionó para mí.

o, si esto no está funcionando sólo se puede hacer lo siguiente

self.moviePlayer = [[MPMoviePlayerController alloc] initWithContentURL:[NSURL fileURLWithPath:[[NSBundle mainBundle] pathForResource:@"something" ofType:@"mp4"]]]; 
[self.moviePlayer.view setFrame:CGRectMake(0, 0, 320, 320)]; 
[self.moviePlayer play]; 
[self.view addSubview:self.moviePlayer.view]; 
  • self.movieplayer es una instancia de MPMoviePlayerController (no MPMoviePlayerViewController). En mi experiencia, es importante declararlo como una propiedad (como así: @property (strong, nonatomic) MPMoviePlayerController *moviePlayer;) en lugar de un simple ivar, porque a veces simplemente no funciona si es un ivar

  • establecer el marco también es importante, porque si no lo configure, el video no aparecerá en absoluto. El marco puede ser cualquier cosa, siempre y cuando lo defina está dentro de los límites de su punto de vista

  • importantes: Igual que el anterior, al definir la URL utilizar el método de NSURL URLWithString si desea acceder al archivo través de una red y use NSURL fileUrlWithPath si tiene el archivo localmente!

+0

He probado este código y solo veo el video cuando lo agrego a una subvista como esta: [self.view addSubview: _movieController.view]; Pero, por alguna razón, el depurador superior está unos pocos píxeles más abajo de lo normal de la barra de estado. ¿Hay alguna forma de rectificar esto? Y obtengo estos errores como se muestra en esta pregunta. http://stackoverflow.com/questions/12822420/ios-how-to-use-mpmovieplayercontroller ¿Qué estoy haciendo mal? – vnchopra

1

Intenta añadir

[player prepareToPlay]; 

después

MPMoviePlayerController *player = [[MPMoviePlayerController alloc] initWithContentURL:url]; 

Puede leer más sobre MPMoviePlayerController en la documentación de Apple: http://developer.apple.com/library/ios/#documentation/mediaplayer/reference/MPMoviePlayerController_Class/Reference/Reference.html#//apple_ref/doc/c_ref/MPMoviePlayerController

+3

Esto debería ser un comentario, no una respuesta. De los documentos que acabas de vincular pero que obviamente no has leído: "Si un reproductor de películas no está preparado para jugar cuando llamas al método de reproducción, ese método llama automáticamente a este método". Entonces este no puede ser el problema. El problema es que el contexto CoreGraphics actual es 'NULL' en el momento en que OP intenta iniciar la reproducción. –

+0

Incluso con la muestra en los documentos que publicó (en la parte de Información general en la parte superior hay algunas líneas de código que creo que sería el código mínimo para que funcione) no funciona. –

1

Prueba esto:

//Hello guise :- complete process here. 

//1. add framework in .h 
MediaPlayer/MediaPlayer.h 

//2.add delegate in @interface, MPMediaPickerControllerDelegate 

//[email protected] (retain, nonatomic) MPMoviePlayerViewController *moviePlayerController; 

//4.and synthesize in .m - @synthesize moviePlayerController; 

//5.IN - tableViewdelegateMethod 

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath: (NSIndexPath *)indexPath{  

    //given path for song 
    NSArray *paths1 = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES); 
    NSString *documentsDirectory1 = [paths1 objectAtIndex:0]; 
    NSString *strPath = [NSString stringWithFormat:@"%@/%@",documentsDirectory1,[movieArray objectAtIndex:indexPath.row]]; 
    NSLog(@"strPath %@",strPath); 
    //path for song. 
    //convert path in NSURL. 
    NSURL *videosURL = [NSURL fileURLWithPath:strPath]; 
    moviePlayerController = [[MPMoviePlayerViewController alloc]initWithContentURL:videosURL]; 
    [self presentMoviePlayerViewControllerAnimated:moviePlayerController]; 
    [moviePlayerController.moviePlayer play]; 
} 

//play song on UITableViewCell click. 
+0

erhm ¿qué es movieArray? – KennyVB

8

Tienes que probar este ......

NSString *path = [[NSBundle mainBundle]pathForResource:@"test" ofType:@"mp4"]; 
    player = [[MPMoviePlayerViewController alloc]initWithContentURL:[NSURL fileURLWithPath:path]]; 
    [player.view setFrame:CGRectMake(0, 0, 320, 320)]; 
    [self presentMoviePlayerViewControllerAnimated:player]; 
    [player.moviePlayer play]; 
    [self.view addSubview:player.view]; 
Cuestiones relacionadas