Question

Je construis une application contenant un flux XML avec un lien vers un film, que je voudrais jouer chaque fois que l'utilisateur clique sur une image.

Pour cette fin j'utilise le MPMoviePlayerViewController. Test de l'application sur le simulateur m'a donné les résultats attendus à ce jour, cependant, quand je teste l'application sur un iPhone, le joueur joue correctement mais sans son.

Je l'ai regardé sur internet où quelques articles me dit que la performance de l'application diffère beaucoup de la performance du simulateur vous donne. Par conséquent, je fait un test « fuite » avec des instruments, qui m'a dit que chaque fois que je commencé à jouer un film, quelques octets a déposés ou ont fui. Cela pourrait-il avoir quelque chose à voir avec la chute soudaine du son? Si oui, comment pourrais-je le résoudre?

Il est ma première expérience de tester des applications sur iPhone, donc je suis assez choqué de voir à quel point l'application réalisée. Voici le code pour la movieplayer-partie.

#pragma mark Video Controls
-(void)playVideo:(id)sender{
    moviePlaying=TRUE;
    MPMoviePlayerViewController *playerViewController;
    playerViewController = [[MPMoviePlayerViewController alloc] initWithContentURL:[NSURL URLWithString:[data objectForKey:@"[att]url"]]];


    [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(moviePlayBackDidFinish:) name:MPMoviePlayerPlaybackDidFinishNotification object:[playerViewController moviePlayer]];
    [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(moviePlayBackDidExitFullscreen:) name:MPMoviePlayerDidExitFullscreenNotification object:[playerViewController moviePlayer]];
    MPMoviePlayerController *player = [[[MPMoviePlayerController alloc] init] autorelease];
    player = [playerViewController moviePlayer];

    [self.view addSubview:playerViewController.view];
    player.controlStyle = MPMovieControlStyleDefault;
    player.shouldAutoplay = YES;
    [player setFullscreen:YES animated:YES];
} 

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

    [moviePlayer.view removeFromSuperview];
    [moviePlayer release];
}
- (void)moviePlayBackDidFinish:(NSNotification*)notification {
    MPMoviePlayerViewController *moviePlayer = [notification object];
    [[NSNotificationCenter defaultCenter] removeObserver:self name:MPMoviePlayerPlaybackDidFinishNotification object:moviePlayer];
    [[NSNotificationCenter defaultCenter] removeObserver:self name:MPMoviePlayerDidExitFullscreenNotification object:moviePlayer];

    moviePlaying=FALSE;
    [moviePlayer.view removeFromSuperview];
    [moviePlayer release];
}
#pragma mark VideoControls End

J'espère que vous pouvez éclairer le problème.

Merci à l'avance,

/ Brinck10

Était-ce utile?

La solution

Vous avez eu une certaine confusion très grave. Vous ne devriez pas créer à la fois un MPMoviePlayerViewController et un MPMoviePlayerController. Utilise l'un ou l'autre. Et ces lignes ne font pas sens:

MPMoviePlayerController *player = 
    [[[MPMoviePlayerController alloc] init] autorelease];
player = [playerViewController moviePlayer];

Vous créez un MPMoviePlayerController et en lui attribuant au joueur mais jeter, remplacer votre movieplayer de MPMoviePlayerViewController existant.

chute de laisser revenir les chantiers de dix et Punt. Le moyen facile de jouer un son de film / flux / ce qui est d'utiliser MPMoviePlayerViewController. Il est un contrôleur de vue, alors que lui envoyer où vous utiliseriez une UIViewController. Est de montrer Simplest il modalement:

NSURL* m = // whatever;
MPMoviePlayerViewController* mpvc = 
    [[MPMoviePlayerViewController alloc] initWithContentURL: m];
[self presentModalViewController:mpvc animated:YES];
[mpvc release];

Cela crée le MPMoviePlayerController et son point de vue et présente tout le tralala pour vous en mode plein écran uniquement. Simple et facile. La vue modale est même rejetée pour vous lorsque l'utilisateur tape Terminé.

Utilisation MPMoviePlayerController est plus impliqué. Il est pas un UIViewController. Mais il a une vue. Votre travail, si vous voulez que l'utilisateur de voir quoi que ce soit, est de saisir ce point de vue, lui donner un cadre, et le coller dans votre interface:

NSURL* m = // whatever;
MPMoviePlayerController* mp = 
    [[MPMoviePlayerController alloc] initWithContentURL:m];
self.mpc = mp; // property with retain policy
[mp release];
self.mpc.view.frame = CGRectMake(10, 10, 300, 230);
[self.view addSubview:self.mpc.view];

Cela rend la vue film partie de votre interface. Si le film est un vrai film, il laisse l'utilisateur libre de basculer en mode plein écran ou non. Si le film est juste un son, l'utilisateur ne dispose pas d'une façon de le faire; il y a juste un bouton d'arrêt / aller et un curseur.

De toute façon il y a une part MPMoviePlayerController dans l'histoire afin que vous puissiez vous inscrire à ses notifications, dites à jouer / arrêt, etc. Mais ne confondez pas ou fusionner les deux approches. C'est probablement la cause de tous vos problèmes ici.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top