2016-08-26 6 views
0

J'ai une application qui lit des vidéos locales en utilisant AVPlayerViewController. Mais lorsque la lecture de la vidéo est terminée, je souhaite qu'elle se ferme automatiquement (comme le faisait MPMoviePlayerViewController). Après avoir posté cette question, j'ai réussi à résoudre cela partiellement grâce aux réponses ci-dessous et en partie à partir de "Guides and Sample code" de Pommes.Comment rejeter l'AVPlayer automatiquement lorsque la lecture est terminée?

C'est le code qui a fonctionné pour moi:

#import "ViewController.h" 
@import AVFoundation; 
@import AVKit; 


@interface ViewController() 

@property(nonatomic, readonly) AVPlayerItem *currentItem; 

@end 

@implementation ViewController 

- (void)viewDidLoad { 
    [super viewDidLoad]; 
    // Do any additional setup after loading the view, typically from a nib. 
} 

- (void)didReceiveMemoryWarning { 
    [super didReceiveMemoryWarning]; 
    // Dispose of any resources that can be recreated. 
} 

-(void)playerItemDidReachEnd:(NSNotification *) notification { 
    //remove the player 
    [self dismissViewControllerAnimated:YES completion:nil]; 
} 

- (IBAction)playVideo:(id)sender { 

    // grab a local URL to our video 
    NSURL *videoURL = [[NSBundle mainBundle]URLForResource:@"bagare" withExtension:@"mp4"]; 

    // create an AVPlayer 
    AVPlayer *player = [AVPlayer playerWithURL:videoURL]; 

    // create a player view controller 
    AVPlayerViewController *controller = [[AVPlayerViewController alloc]init]; 
    controller.player = player; 
    [player play]; 
    [self presentViewController:controller animated:YES completion:nil]; 

    // show the view controller 
     controller.view.frame = self.view.frame; 

    [[NSNotificationCenter defaultCenter] addObserver:self 
    selector:@selector(playerItemDidReachEnd:) 
    name:AVPlayerItemDidPlayToEndTimeNotification 
    object:_currentItem]; 

    } 

@end 
+0

Le code de ma question fonctionne très bien avec une vidéo rejetant, Mais, je rencontré un problème quand j'ai ajouté plus de vidéos et copiez/collez le code: La première vidéo est rejetée comme je le veux, mais quand la deuxième vidéo a fini de jouer, elle revient au premier contrôleur de vue, au lieu du second VC où les vidéos sont affichées et jouées (il montre le second VC pendant une seconde). Cela ne se produit pas si je ferme les vidéos en appuyant sur "Terminé". Quelqu'un at-il une solution pour cela? –

Répondre

1

Cela devrait fonctionner:

[[NSNotificationCenter defaultCenter] addObserver:self 
    selector:@selector(videoDidFinish:) 
    name:AVPlayerItemDidPlayToEndTimeNotification 
    object:[controller.player currentItem]]; 

- (void)videoDidFinish:(id)notification 
{ 
    AVPlayerItem *p = [notification object]; 
    //do something with player if you want 

    [[NSNotificationCenter defaultCenter] removeObserver:self]; 

    //fade out/remove subview 
} 
+0

J'ai réussi à le faire fonctionner, avec l'aide de votre réponse et Apples Guides un exemple de code. J'ai posté le code qui a fonctionné pour moi dans la question originale. Cependant, j'ai rencontré un autre problème lorsque j'ai ajouté plus de vidéos et copié/collé le code: La première vidéo est rejetée comme je le veux, mais quand la seconde vidéo a fini, elle revient au contrôleur de première vue de la seconde où les vidéos sont affichées (il montre le second VC pendant une seconde). Cela ne se produit pas si je ferme les vidéos en appuyant sur "Terminé". Savez-vous pourquoi et comment résoudre ce problème? –

+0

Vous devez supprimer l'écouteur comme indiqué dans l'exemple ici. Dans votre code mis à jour, le premier VC est toujours un observateur enregistré –

+0

A travaillé super! Je vous remercie! –

4
NSURL *url=[NSURL URLWithString:@"URLLINK"]; 
AVAsset *avAsset = [AVAsset assetWithURL:url]; 
AVPlayerItem *playerItem = [[AVPlayerItem alloc]initWithAsset:avAsset]; 

Abonnez-vous à la notification DidPlayToEndTime du AVPlayerItem.

[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(itemDidFinishPlaying:) name:AVPlayerItemDidPlayToEndTimeNotification object:playerItem]; 

passer le AVPlayerItem à un nouveau joueur

AVPlayer *player = [AVPlayer playerWithURL:videoURL] 
    AVPlayerViewController *controller=[[AVPlayerViewController alloc]init]; 
    controller.player=player; 
    [player play]; 
    [self presentViewController:controller animated:YES completion:nil]; 

Ici supprimer joueur ou rejeter joueur ajouté vue

-(void)itemDidFinishPlaying:(NSNotification *) notification { 
[self dismissViewControllerAnimated:YES completion:nil]; 
    [[NSNotificationCenter defaultCenter]removeObserver:self name:AVPlayerItemDidPlayToEndTimeNotification object:playerItem]; 
} 
+0

J'ai réussi à le faire fonctionner, avec l'aide de votre réponse et Apples Guides un exemple de code. J'ai posté le code qui a fonctionné pour moi dans la question originale. Cependant, j'ai rencontré un autre problème lorsque j'ai ajouté plus de vidéos et copié/collé le code: La première vidéo est rejetée comme je le veux, mais quand la seconde vidéo a fini, elle revient au contrôleur de première vue de la seconde où les vidéos sont affichées (il montre le second VC pendant une seconde). Cela ne se produit pas si je ferme les vidéos en appuyant sur "Terminé". Savez-vous pourquoi et comment résoudre ce problème? –

0

Dans le fichier .h

@property(nonatomic, strong)AVPlayerViewController *controller; 

Dans le fichier .m:

- (IBAction)playVideo:(id)sender { 

    // grab a local URL to our video 
    NSURL *videoURL = [[NSBundle mainBundle]URLForResource:@"bagare" withExtension:@"mp4"]; 

    // create an AVPlayer 
    AVPlayer *player = [AVPlayer playerWithURL:videoURL]; 

    // create a player view controller 
    self.controller = [[AVPlayerViewController alloc]init]; 
    controller.player = player; 
    [player play]; 
    [self presentViewController:controller animated:YES completion:nil]; 

    // show the view controller 
     controller.view.frame = self.view.frame; 

    [[NSNotificationCenter defaultCenter] addObserver:self 
    selector:@selector(playerItemDidReachEnd:) 
    name:AVPlayerItemDidPlayToEndTimeNotification 
    object:_currentItem]; 

    } 

Et pour rejeter:

- (void)playerItemDidReachEnd:(NSNotification *)notification { 
    [self.controller dismissViewControllerAnimated:YES completion:nil]; 
}