2010-02-02 6 views
3

Dans mon application, j'ai des films en cours de lecture. J'ai vérifié les informations pour les films et ils semblent être dans ce MPMoviePlayerController devrait être capable de gérer (bitrate, etc.)MPMoviePlayerController - impossible de lire les films dans mon application sur <3GS (3GS est très bien)

Ils sont en streaming à partir d'une URL, et il sera lisible sur un 3GS, rien de plus bas. J'ai essayé de recueillir l'erreur des notifications dans MPMoviePlayerController pour MPMoviePlayerContentPreloadDidFinishNotification et MPMoviePlayerPlaybackDidFinishNotification mais j'obtiens une chaîne d'erreur inutile pour la clé userInfo dans la notification, cela ne me dit rien mais le fait que le film n'a pas pu être joué.

L'URL Je teste avec est: http://movies.apple.com/movies/independent/lawabidingcitizen/lawabidingcitizen_h.480.mov

Sur un 3G ou 2G iPhone le MPMoviePlayerController apparaît et tente brièvement de charger le film mais se fane au contrôleur de vue d'où il vient.

Quelqu'un at-il une idée pourquoi je ne peux pas diffuser et lire l'URL ci-dessus uniquement sur un 3GS? Je suis sûr que c'est un problème de mémoire, mais j'ai essayé sur un iPhone 2G avec 50 Mo de mémoire libre et ça ne marche toujours pas.

J'utilise le morceau de code propre exemple d'application d'Apple pour des films en streaming pour lancer le film:

MPMoviePlayerController *mp = [[MPMoviePlayerController alloc] initWithContentURL:[NSURL URLWithString:@"http://movies.apple.com/movies/independent/lawabidingcitizen/lawabidingcitizen_h.480.mov"]; 
if (mp) { 
    self.moviePlayer = mp; 
    [mp release]; 
    [self.moviePlayer play]; 
} 

Merci

Répondre

1

Je pense que la partie de libération est de vous donner du mal, j'utilise ce code et fonctionne bien:

moviePlayer = [[MPMoviePlayerController alloc] initWithContentURL:fileURL]; 

    //// //// //// //// //// //// //// //// //// //// //// //// //// //// //// /////
    // ONLY FOR IOS 3.2 or later 
    if (kCFCoreFoundationVersionNumber >= kCFCoreFoundationVersionNumber_iPhoneOS_3_2) { 

     // May help to reduce latency 
     [moviePlayer prepareToPlay]; 

     /// //// //// //// //// //// //// //// //// //// //// //// //// /////
     // Set the correct frame for Movie Controller. 
     moviePlayer.view.frame = self.view.frame; 

     /// //// //// //// //// //// //// //// //// //// //// //// //// /////
     // Autorezing the view, allows him to adjust with the orientation. 
     moviePlayer.view.autoresizingMask = UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleHeight; 
     moviePlayer.view.autoresizesSubviews = YES; 

     /// //// //// //// //// //// //// //// //// //// //// //// //// /////
     // Add to screen. 
     [self.view addSubview:moviePlayer.view]; 
    } 

    //// //// //// ///// //// //// ///// //// //// ///// //// //// ///// //// /////
    // Older than 3.2 
    else { 
     // Play Movie. 
     [moviePlayer play]; 

     // Register to receive a notification when the movie has finished playing. 
     [[NSNotificationCenter defaultCenter] addObserver:self 
               selector:@selector(moviePlayBackDidFinish:) 
                name:MPMoviePlayerPlaybackDidFinishNotification 
                object:nil]; 
    } 

Ce code est préparé pour tous les iOS. Si vous ne supportez que < 3.2, utilisez la bonne pièce.

Vous devez mettre en œuvre une méthode moviePlayBackDidFinish: pour recevoir une notification lorsque la ligne d'arrivée de film à jouer, comme suit:

//// //// //// ///// //// //// ///// //// //// ///// //// //// ///// //// /////
// Notification called when the movie finished playing. This Call is only for iOS 3.2 
- (void) moviePlayBackDidFinish:(NSNotification*)notification { 
    // Unregister. 
    [[NSNotificationCenter defaultCenter] removeObserver:self 
                name:MPMoviePlayerPlaybackDidFinishNotification 
                object:nil]; 

    // Your finish code here. 
} 

Vous devez déclarer le moviePlayer dans votre UIViewController @interface et dealloc dans votre méthode dealloc:.