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?
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
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.
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]
.
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é!
Vous devez utiliser MPMoviePlayerViewController à la place. Remarquez le mot "Voir" ici.
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");
}
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];
}
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".
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:
movieSourceType
, un écran noir s'affiche pendant environ une seconde avant le début du film.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];
}
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
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:
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 :
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];