web-dev-qa-db-fra.com

iOS: comment utiliser MPMoviePlayerController

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

NSString *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 surtout pas la ligne sur la vue ne faisant pas partie de la hiérarchie car c'est un projet iOS "Single View Application" vide et le code est dans ViewController.m. Il IS dans la hiérarchie des vues.

Je sais pertinemment que le fichier vidéo lui-même n'est pas le problème parce que je l'ai obtenu à partir de l'exemple de code d'Apple sur MPMoviePlayer. Et même si j'ai (apparemment) essayé tout ce qui est écrit dans l'échantillon, je n'ai tout simplement pas réussi à 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 écran blanc et erreurs. Veuillez aider ....

30
Zoltán Matók

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

NSURL *movieURL = [NSURL URLWithString:@"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 fichier .h.

  • Important: lors de la définition de l'URL, utilisez la méthode URLWithString de NSURL si vous souhaitez accéder au fichier via un réseau et utilisez fileUrlWithPath de NSURL si vous avez le fichier localement!

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

  • Si vous voulez savoir lorsque l'utilisateur a appuyé sur le bouton terminé (le joueur sera automatiquement renvoyé), vous devez savoir que -viewDidAppear Est appelé sur le contrôleur de vue qui apparaît lorsque le joueur est renvoyé. . Vous pouvez définir une variable BOOL au démarrage du lecteur et rechercher la BOOL dans votre -viewDidAppear Afin de savoir que -viewDidAppear A été appelé parce que le le joueur a été renvoyé. Alternativement, vous pouvez 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). D'après mon expérience, il est important de le déclarer comme une propriété (comme ceci: @property (strong, nonatomic) MPMoviePlayerController *moviePlayer;) plutôt qu'un simple ivar, car parfois cela ne fonctionne tout simplement pas s'il s'agit d'un ivar

  • le réglage du cadre est également important, car si nous ne le définissons pas, la vidéo 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 URLWithString de NSURL si vous souhaitez accéder au fichier via un résea et utilisez fileUrlWithPath si vous avez le fichier localement!

89
Zoltán Matók

Tu dois essayer ça......

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];
8

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);
    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.
2
Rakesh Kumar

Essayez d'ajouter

[player prepareToPlay];

après

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

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

1
Mikhail Viceman