30 votes

iOS: comment utiliser MPMoviePlayerController

J'ai créé un projet vide (iOS) et de mettre ça dans ma viewDidLoad:

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 j'obtiens un écran blanc avec des messages d'erreur dans le log:

 <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 l'exécution automatique. Surtout je ne comprends pas la ligne sur la vue ne faisant pas partie de la hiérarchie puisqu'il est vierge "Seule Vue de l'Application iOS de projet et le code est dans le ViewController.m. C'EST dans la vue de la hiérarchie.

Je sais pour un fait que le fichier du film lui-même n'est pas le problème, car je l'ai eu à partir de Apple est un exemple de code sur MPMoviePlayer. Et bien que j'ai (apparemment) essayé tout ce qui est écrit dans l'échantillon, je ne pouvais pas obtenir le joueur de travail.

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

Des résultats similaires, avec un écran blanc et d'erreurs. S'il vous plaît aider....

89voto

Zoltán Matók Points 1518

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

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 l' MPMoviePlayerViewController déclaré dans le .h fichier.

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

  • [movieController.moviePlayer play] n'est pas nécessaire et que le joueur va commencer, peu importe si vous n'avez pas défini de lecture automatique ou PAS, mais j'ai observé que si vous mettez play il démarre un peu plus vite. Cela pourrait être juste une coïncidence.

  • Si vous voulez savoir lorsque l'utilisateur a tapé le bouton done (le joueur sera automatiquement rejetée), vous devriez savoir qu' -viewDidAppear est appelée sur la vue-contrôleur qui apparaît lorsque le lecteur est rejeté. Vous pouvez définir un BOOL variable lorsque le joueur commence et vérifier l' BOOL votre -viewDidAppear , de sorte que vous savez qu' -viewDidAppear a été appelé becaouse le joueur a été rejetée. Sinon, vous pouvez vous inscrire pour MPMoviePlayerDidExitFullScreen de notification, mais cela ne fonctionne pas pour moi.

--------- EDIT: OU, si cela ne fonctionne pas, vous pouvez le faire qu'à la suite de ----------

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];
  • auto.movieplayer est une instance de MPMoviePlayerController (pas MPMoviePlayerViewController). Dans mon expérience, il est important de le déclarer comme une propriété (comme: @property (strong, nonatomic) MPMoviePlayerController *moviePlayer;) plutôt qu'une simple ivar, parce que parfois, il ne fonctionne tout simplement pas si c'est une ivar

  • le cadre est aussi important, si nous ne le faisons pas, la vidéo ne s'affiche pas du tout. Le cadre peut être n'importe quoi tant que ce que vous définissez est dans les limites de votre point de vue

  • Important: Comme ci-dessus, lors de la définition de l'URL de NSURL de l' URLWithString méthode si vous souhaitez accéder au fichier par l'intermédiaire d'un réseau et de l'utilisation NSURL de l' fileUrlWithPath si vous avez le fichier localement!

8voto

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

2voto

Rakesh Points 1

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.
 

1voto

Mikhail Viceman Points 534

Essayez d'ajouter

[player prepareToPlay];

après

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

Vous pouvez en lire plus à propos de MPMoviePlayerController dans la documentation d'Apple: http://developer.apple.com/library/ios/#documentation/mediaplayer/reference/MPMoviePlayerController_Class/Reference/Reference.html#//apple_ref/doc/c_ref/MPMoviePlayerController

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X