iOS: Comment utiliser MPMoviePlayerController

J'ai créé un projet vide (iOS) et l'ai mis dans mon viewDidLoad:

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

Lorsque l'application démarre, tout ce que je reçois est un écran blanc avec des messages d'erreur dans le journal :

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

… et un tas de lignes concernant la désactivation de la lecture automatique. Je ne comprends pas particulièrement la ligne sur la vue ne faisant pas partie de la hiérarchie puisqu'il s'agit d'un projet iOS "Single View Application" iOS et le code est dans ViewController.m. C'est dans la hiérarchie de vue.

Je sais pertinemment que le file video lui-même n'est pas le problème car je l'ai obtenu à partir du code d'Apple sur MPMoviePlayer. Et même si j'ai (apparemment) essayé tout ce qui était écrit dans l'échantillon, je n'arrivais tout simplement pas à faire fonctionner le lecteur.

Voici un autre essai, cette fois avec MPMoviePlayerController (pas 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]; 

Résultat similaire, avec un écran blanc et des erreurs. S'il vous plaît aider ….

Il s'avère que tout ce que nous avons à faire est ceci:

 NSURL *movieURL = [NSURL URLWithSsortingng:@"http://example.com/somefile.mp4"]; movieController = [[MPMoviePlayerViewController alloc] initWithContentURL:movieURL]; [self presentMoviePlayerViewControllerAnimated:movieController]; [movieController.moviePlayer play]; 
  • movieController est une instance de MPMoviePlayerViewController déclarée dans le file .h.

  • Important : lors de la définition de l'URL, utilisez la méthode URLWithSsortingng de URLWithSsortingng si vous voulez accéder au file via un réseau et utiliser fileUrlWithPath de fileUrlWithPath si vous avez le file en local!

  • [movieController.moviePlayer play] n'est pas nécessaire et le lecteur démarre même si vous n'avez pas réglé la lecture automatique sur NO, mais j'ai remarqué que si vous mettez le play dedans, il commence un peu plus vite. Cela pourrait être juste une coïncidence.

  • Si vous voulez savoir quand l'user a appuyé sur le button terminé (le joueur sera automatiquement rejeté), vous devriez savoir que -viewDidAppear est appelé sur le controller de vue qui apparaît lorsque le joueur est renvoyé. Vous pouvez définir une variable BOOL lorsque le joueur démarre et vérifier la BOOL dans votre -viewDidAppear pour que vous sachiez que -viewDidAppear été appelé car le joueur a été renvoyé. Vous pouvez également vous inscrire à la notification MPMoviePlayerDidExitFullScreen , mais cela n'a pas fonctionné pour moi.

OU, si cela ne fonctionne pas, vous pouvez simplement faire ce qui suit

 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 est une instance de MPMoviePlayerController (pas MPMoviePlayerViewController). Dans mon expérience, il est important de le déclarer comme une propriété (comme par exemple: @property (strong, nonatomic) MPMoviePlayerController *moviePlayer; ) plutôt que comme un simple ivar, parce que parfois ça ne marche pas si c'est un ivar

  • le réglage du cadre est également important, car si nous ne le réglons pas, la video n'apparaîtra pas du tout. Le cadre peut être n'importe quoi tant que ce que vous définissez est dans les limites de votre vue

  • Important : Comme ci-dessus, lors de la définition de l'URL, utilisez la méthode URLWithSsortingng de URLWithSsortingng si vous voulez accéder au file via un réseau et utiliser fileUrlWithPath de fileUrlWithPath si vous avez le file en local !

Tu dois essayer ça……

 NSSsortingng *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]; 

Essayez d'append

 [player prepareToPlay]; 

après

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

Vous pouvez en savoir plus sur MPMoviePlayerController dans la documentation Apple: http://developer.apple.com/library/ios/#documentation/mediaplayer/reference/MPMoviePlayerController_Class/Reference/Reference.html#//apple_ref/doc/c_ref/MPMoviePlayerController

Essaye ça:

 //Hello guise :- complete process here. //1. add framework in .h MediaPlayer/MediaPlayer.h //2.add delegate in @interface, MPMediaPickerControllerDelegate //3.@property (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); NSSsortingng *documentsDirectory1 = [paths1 objectAtIndex:0]; NSSsortingng *strPath = [NSSsortingng ssortingngWithFormat:@"%@/%@",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.