2010-11-29 31 views
11

chacun. J'essaie de comprendre comment lire un flux en direct en utilisant MPMoviePlayerController. Pour tester, j'utilise l'échantillon de flux de test Apples http://devimages.apple.com/iphone/samples/bipbopall.html. Cela fonctionne parfaitement dans UIWebView, mais je ne peux pas le faire fonctionner avec MPMoviePlayerController. Il est mon morceau de code:MPMoviePlayerController et HTTP Live Streaming

NSURL *mediaURL = [NSURL URLWithString:@"http://devimages.apple.com/iphone/samples/bipbopall.html"]; 
MPMoviePlayerController *mp = [[MPMoviePlayerController alloc] initWithContentURL:mediaURL]; 
[[NSNotificationCenter defaultCenter] addObserver:self 
             selector:@selector(moviePlayBackDidFinish:) 
              name:MPMoviePlayerPlaybackDidFinishNotification 
              object:nil]; 

[mp setControlStyle:MPMovieControlStyleFullscreen]; 
[mp setMovieSourceType:MPMovieSourceTypeStreaming]; 
[mp setFullscreen:YES]; 

[self.view addSubview:[mp view]]; 

[mp prepareToPlay]; 
[mp play]; 

En fait, le contrôleur MPMoviePlayerPlaybackDidFinishNotification sans rien recieves jouer. Où est le problème?

+0

« *** Mettre fin application en raison d'une exception non interceptée « NSInvalidArgumentException », la raison: « Un AVPlayerItem ne peut être associé à plus d'une instance de AVPlayer '" – openfrog

Répondre

17

Votre problème est probablement avec l'URL. MPMoviePlayerController veut l'URL directement au fichier que vous voulez jouer. Vous fournissez l'URL d'une page HTML que le lecteur vidéo ne comprend pas. C'est pourquoi cela fonctionne dans UIWebView depuis un navigateur Web comprend HTML. Si vous voulez plus d'informations sur ce qui ne va pas, vous pouvez vérifier l'erreur de faire ce qui suit, cité de la documentation d'Apple:

Pour vérifier les erreurs dans le chargement d'URL, registre pour les MPMoviePlayerContentPreloadDidFinishNotification ou MPMoviePlayerPlaybackDidFinishNotification notifications. En cas d'erreur, ces notifications contiennent un objet NSError disponible à l'aide de la clé @ "error" dans le dictionnaire userInfo de la notification.

Il ressemblerait à quelque chose comme:

- (void) moviePlayBackDidFinish:(NSNotification*)notification { 
    NSError *error = [[notification userInfo] objectForKey:@"error"]; 
    if (error) { 
     NSLog(@"Did finish with error: %@", error); 
    } 
} 

Si vous voulez essayer de jouer cet échantillon, vous pouvez essayer d'accéder à l'URL du flux directement, ce qui serait: http://devimages.apple.com/iphone/samples/bipbop/bipbopall.m3u8

+0

Merci beaucoup - l'URL était le vrai problème. Une question de plus: MPMoviePlayerController - est-ce le bon choix pour lire le flux audio en direct (comme la radio Internet)? J'ai cherché les moyens d'implémenter HTTP Live Streaming et suis arrivé à la conclusion que MoviePlayer était la chose dont j'avais besoin. – Andrew

+0

De rien. Je n'ai pas fait de streaming moi-même, donc je ne peux pas commenter sur quelle approche est la meilleure. –

0

Essayez object:mp au lieu de object:nil dans votre NSNotification

5

Vous devez utiliser lien direct pour lire le fichier de la liste: http://devimages.apple.com/iphone/samples/bipbop/bipbopall.m3u8

NSURL *mediaURL = [NSURL URLWithString:@"http://devimages.apple.com/iphone/samples/bipbop/bipbopall.m3u8"]; 
MPMoviePlayerController *mediaPlayer = [[MPMoviePlayerController alloc] initWithContentURL:mediaURL];