Question

J'ai quelques vues qui accèdent au lecteur vidéo.J'ai mis le code suivant dans une méthode dans AppDelegate pour ces vues.Ils envoient le nom du fichier à jouer.Le code fonctionne bien mais je sais qu'une version est requise quelque part.Si j'ajoute la dernière ligne en tant que version ou version automatique, l'application plantera une fois que l'utilisateur appuiera sur Terminé sur le lecteur vidéo.

MPMoviePlayerController *moviePlayer = [[MPMoviePlayerController alloc] 
                 initWithContentURL:[NSURL fileURLWithPath:moviePath]];
moviePlayer.movieControlMode = MPMovieControlModeDefault;
[moviePlayer play];
//[moviePlayer release];

J'obtiens cette erreur :

objet[51051] :LIBÉRÉ(id):message videoViewController envoyé à l'objet libéré = 0x1069b30

Signal reçu du programme :"EXC_BAD_INSTRUCTION".

Comment dois-je libérer le lecteur ?

Était-ce utile?

La solution

Ce que j'ai trouvé, c'est que le MPMoviePlayerController doit recevoir le message d'arrêt avant que vous puissiez le libérer en toute sécurité.Donc je le fais dans handlePlaybackEnd - d'abord je l'arrête, puis je le libère automatiquement.L'appel de release ne semble pas très bien fonctionner :

- (void) moviePlayBackDidFinish : (NSNotification *) notification
{
  VideoPlayerController * player = notification.object;
  [player stop];
  [player autorelease];
}

Le tout devient un peu plus délicat dans la mesure où MPMoviePlayerPlaybackDidFinishNotification peut être envoyé plus d'une fois, mais appeler stop/autorlease deux fois ne vous servira à rien non plus.Vous devez donc vous en prémunir d’une manière ou d’une autre.

Enfin, il semble prendre quelques itérations de la boucle d'exécution principale jusqu'à ce que vous puissiez créer en toute sécurité une nouvelle instance de MPMoviePlayerController.Si vous le faites trop rapidement, vous obtiendrez du son mais pas de vidéo.Très amusant, hein ?

Autres conseils

Pour répondre au commentaire de 4thSpace sur la réponse ci-dessus, vous pouvez supprimer l'observateur de notification afin de ne pas le recevoir plusieurs fois :

- (void)moviePlayBackDidFinish:(NSNotification *)notification {
    MPMoviePlayerController *theMovie = [notification object];
    [[NSNotificationCenter defaultCenter] removeObserver:self
        name:MPMoviePlayerPlaybackDidFinishNotification
        object:theMovie];
    [theMovie stop];
    [theMovie release];
}

Pour l'iPhone OS 3.2, vous devez appeler [MoviePlayer Pause];Avant d'appeler [MoviePlayer Stop];

S'arrêter et relâcher ne me suffisait pas si le joueur n'arrivait pas jusqu'au bout.

Ma solution consiste à définir le moviePlayer.initialPlaybackTime = -1au moviePlayBackDidFinish: avant de le publier :

-(void)playMovie: (NSString *)urlString{ 
    movieURL = [NSURL URLWithString:urlString]; 
    moviePlayer = [[MPMoviePlayerController alloc] initWithContentURL:movieURL]; 
    moviePlayer.initialPlaybackTime = 0; 
    [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(moviePlayBackDidFinish: ) name:MPMoviePlayerPlaybackDidFinishNotification object:moviePlayer] ;

    moviePlayer.scalingMode = MPMovieScalingModeAspectFit; 
    moviePlayer.movieControlMode = MPMovieControlModeDefault;
    moviePlayer.backgroundColor = [UIColor blackColor];

    [moviePlayer play];
}

-(void)moviePlayBackDidFinish: (NSNotification*)notification{ 
    [[NSNotificationCenter defaultCenter] removeObserver:self name:MPMoviePlayerPlaybackDidFinishNotification object:moviePlayer] ; 

    moviePlayer.initialPlaybackTime = -1; 

    [moviePlayer stop]; 
    [moviePlayer release]; 
}

J'ai eu le même problème et je viens de réaliser que j'ai défini la méthode de notification avec object:nil (c'était un copier-coller).

Je recevais plusieurs notifications alors que je n'aurais dû recevoir aucune notification du tout.

Voici mon nouveau code de configuration de notification qui a tout corrigé (voir l'objet :moviePlayer) :

[[NSNotificationCenter defaultCenter] addObserver:self 
                           selector:@selector(moviePlaybackDidFinish:) 
                           name:MPMoviePlayerPlaybackDidFinishNotification 
                           object:moviePlayer]; 

J'espère que cela pourra aider.Maintenant tout mon code fonctionne correctement.

Cela semblait réduire considérablement la mémoire.Cependant, pour IOS 4.1, cela semble bien.

- (void)videoFinishedCallback:(NSNotification *)aNotification
{
    thePlayer = [aNotification object];
    [[NSNotificationCenter defaultCenter]
    removeObserver:self
    name:MPMoviePlayerPlaybackDidFinishNotification object:thePlayer];

    thePlayer.initialPlaybackTime = -1;

    #if __IPHONE_OS_VERSION_MAX_ALLOWED >= 30200
        [thePlayer pause]; 
    #endif

    [thePlayer stop];
    [thePlayer release];    
}
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top