web-dev-qa-db-fra.com

MPMoviePlayerController montrant un écran vide noir

J'utilise MPMoviePlayerController pour lire un fichier local dans mon dossier Application Document que j'ai téléchargé pour une URL de serveur:

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

Lorsque je joue le fichier .mov juste après l'avoir téléchargé, il affiche un écran vide et l'interface utilisateur de l'application est inutilisable. Mais si le même fichier local est lu la prochaine fois, la lecture est correcte. J'ai même vérifié. playState & localState pour MPMoviePlayerController ils semblent bien. Quelle pourrait être la raison pour un écran vide noir?

25
Ritika

Ce problème semble résolu après la mise à jour du périphérique iOS vers la version 5.0.
Semble avoir un problème avec le SDK iOS pour la version précédente

0
Ritika

Vous devez conserver votre instance de MPMoviePlayerController, c’est-à-dire en tant que propriété ou variable d’instance. La référence au lecteur de film est perdue si vous ne la conservez pas.

31
Toms Shaji Mathew

Vous pouvez essayer de mettre [itemMoviePlayerController prepareToPlay]; Avant le [itemMoviePlayerController play];

La manière préférée par Apple d’afficher une vidéo uniquement en plein écran est de présenter une MPMoviePlayerViewController modale (comme l’a dit Hollance). Pour la présenter, vous devriez utiliser quelque chose comme:

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

Ceci est documenté par Apple ici

Vous pouvez lire ici que vous devriez garder une référence à votre MPMoviePlayerViewController afin de la rejeter plus tard avec

[self dismissMoviePlayerViewControllerAnimated:moviePlayerViewController].

15
dulgan

J'ai corrigé cela en mettant 

@property (strong, nonatomic) MPMoviePlayerController *moviePlayer; 

dans mon fichier .h et en appelant self.moviePlayer dans tout mon code et cela a fonctionné!

13
mattblessed

Vous devez utiliser MPMoviePlayerViewController à la place. Remarquez le mot "Voir" ici.

7
Hollance

J'espère que cela aidera. J'ai résolu ce problème dans mon projet

 -(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");

}
3
Jerin4info24x7

Il m'est arrivé la même chose. En fin de compte, j'avais essayé de jouer le film alors que la UIImagePicker n'était pas encore rejetée. 

Dans ma UIImagePickerDelegate je devais d'abord fermer le UIImagePicker Popup et ensuite ouvrir le ViewController gérer le 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];
}
2
cayeric

J'ai eu le même problème et ça m'a rendu fou. Cela ferait travail sur un contrôleur de vue très bien (audio et vidéo), mais pas sur un autre (écran noir avec seulement de l’audio). En fin de compte, tout ce que je fis fut de changer l'ordre des appels: j'attendis simplement d'avoir fini de configurer le lecteur de film avant de l'ajouter à la vue. En d'autres termes, j'ai appelé "addSubview" sur la ligne juste avant l'appel à "jouer".

2
ghostatron

C'est le code que j'utilise pour lire un fichier à partir d'une URL:

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

Cela semble bien fonctionner pour moi. Deux notes:

  • Certains simulateurs (comme l'actuel iOS 5.0) se bloquent lors de la lecture d'un film, mais cela fonctionne sur un appareil réel
  • Si vous omettez la partie movieSourceType, un écran noir s'affiche pendant environ une seconde avant le début du film.
1
talkol

vous devez faire comme ça avec CGRectMake (0, 0, 0, 0) dans le rappel terminé!

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

}
0
plop

De même, si vous utilisez des URL http, veillez à désactiver App Transport Security dans vos projets * .plist file. Cela provoquera également un écran noir.

Ajoutez le code suivant:

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

Ici:

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

J'ai eu le même problème, résolu en changeant l'extension du fichier en cours de lecture de .mpg à .mp4. Apparemment, MPMoviePlayerController attend une extension correcte, bien que la documentation ne m'indique pas qu'il s'agit d'une exigence:

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

Formats pris en charge Cette classe lit tout film ou fichier audio pris en charge Sous iOS. Cela inclut à la fois le contenu en flux et les fichiers de longueur fixe. Pour les fichiers vidéo, cela signifie généralement des fichiers avec les extensions. normes de compression :

0

J'avais un problème similaire. Après la lecture, un écran vide apparaît, ce qui m'empêche de lire à nouveau la vidéo. Eh bien voici mon travail. De cette façon, le bouton de lecture ne disparaît pas.

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