Ios 播放完成后,如何自动关闭AVPlayer?

Ios 播放完成后,如何自动关闭AVPlayer?,ios,objective-c,avplayer,avplayerviewcontroller,avkit,Ios,Objective C,Avplayer,Avplayerviewcontroller,Avkit,我有一个应用程序,可以使用AVPlayerViewController播放本地视频。 但当视频播放完毕后,我希望它自动关闭(就像以前的MPMoviePlayerViewController一样) 在发布这个问题后,我设法解决了这个问题,部分原因是下面的答案,部分原因是来自苹果的“指南和示例代码” 这是对我有用的代码: #import "ViewController.h" @import AVFoundation; @import AVKit; @interface ViewControlle

我有一个应用程序,可以使用AVPlayerViewController播放本地视频。 但当视频播放完毕后,我希望它自动关闭(就像以前的MPMoviePlayerViewController一样)

在发布这个问题后,我设法解决了这个问题,部分原因是下面的答案,部分原因是来自苹果的“指南和示例代码”

这是对我有用的代码:

#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
这应该起作用:

[[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
}
这应该起作用:

[[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
}
订阅AVPlayerItem的DidPlayToEndTime通知。

[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(itemDidFinishPlaying:) name:AVPlayerItemDidPlayToEndTimeNotification object:playerItem];
将AVPlayerItem传递给新玩家

 AVPlayer *player = [AVPlayer playerWithURL:videoURL]
   AVPlayerViewController *controller=[[AVPlayerViewController alloc]init];
    controller.player=player;
    [player play];
    [self presentViewController:controller animated:YES completion:nil];
此处删除球员解雇或球员添加视图

-(void)itemDidFinishPlaying:(NSNotification *) notification {
[self dismissViewControllerAnimated:YES completion:nil];
    [[NSNotificationCenter defaultCenter]removeObserver:self name:AVPlayerItemDidPlayToEndTimeNotification object:playerItem];
}
订阅AVPlayerItem的DidPlayToEndTime通知。

[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(itemDidFinishPlaying:) name:AVPlayerItemDidPlayToEndTimeNotification object:playerItem];
将AVPlayerItem传递给新玩家

 AVPlayer *player = [AVPlayer playerWithURL:videoURL]
   AVPlayerViewController *controller=[[AVPlayerViewController alloc]init];
    controller.player=player;
    [player play];
    [self presentViewController:controller animated:YES completion:nil];
此处删除球员解雇或球员添加视图

-(void)itemDidFinishPlaying:(NSNotification *) notification {
[self dismissViewControllerAnimated:YES completion:nil];
    [[NSNotificationCenter defaultCenter]removeObserver:self name:AVPlayerItemDidPlayToEndTimeNotification object:playerItem];
}
在.h文件中

@property(nonatomic, strong)AVPlayerViewController *controller;
在.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];

  }
至于解雇:

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

@property(nonatomic, strong)AVPlayerViewController *controller;
在.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];

  }
至于解雇:

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

在您的答案和示例代码的帮助下,我成功地实现了它。我在原始问题中发布了对我有用的代码。但是,当我添加更多视频并复制/粘贴代码时,我遇到了另一个问题:第一个视频按我希望的方式被删除,但当第二个视频播放完后,它跳回第一个视图控制器,而不是显示视频的第二个视图控制器(显示第二个VC一秒钟)。如果我按“完成”关闭视频,则不会发生这种情况。你知道为什么,以及如何解决它吗?在你的答案和示例代码的帮助下,我设法让它工作。我在原始问题中发布了对我有用的代码。但是,当我添加更多视频并复制/粘贴代码时,我遇到了另一个问题:第一个视频按我希望的方式被删除,但当第二个视频播放完后,它跳回第一个视图控制器,而不是显示视频的第二个视图控制器(显示第二个VC一秒钟)。如果我按“完成”关闭视频,则不会发生这种情况。你知道为什么,以及如何解决它吗?在你的答案和示例代码的帮助下,我设法让它工作。我在原始问题中发布了对我有用的代码。但是,当我添加更多视频并复制/粘贴代码时,我遇到了另一个问题:第一个视频按我希望的方式被删除,但当第二个视频播放完后,它跳回第一个视图控制器,而不是显示视频的第二个视图控制器(显示第二个VC一秒钟)。如果我按“完成”关闭视频,则不会发生这种情况。您知道为什么,以及如何解决它吗?您必须删除侦听器,如这里的示例所示。在您更新的代码中,第一个VC仍然是注册的observerWorked很棒!非常感谢。在您的答案和示例代码的帮助下,我成功地实现了它。我在原始问题中发布了对我有用的代码。但是,当我添加更多视频并复制/粘贴代码时,我遇到了另一个问题:第一个视频按我希望的方式被删除,但当第二个视频播放完后,它跳回第一个视图控制器,而不是显示视频的第二个视图控制器(显示第二个VC一秒钟)。如果我按“完成”关闭视频,则不会发生这种情况。您知道为什么,以及如何解决它吗?您必须删除侦听器,如这里的示例所示。在您更新的代码中,第一个VC仍然是注册的observerWorked很棒!非常感谢。我问题中的代码在删除一个视频时效果很好,但是,我在添加更多视频并复制/粘贴代码时遇到了一个问题:第一个视频按我希望的方式删除,但当第二个视频播放完后,它会跳回第一个视图控制器,而不是显示和播放视频的第二个VC(它显示第二个VC一秒钟)。如果我按“完成”关闭视频,则不会发生这种情况。有人对此有解决方案吗?我问题中的代码可以很好地关闭一个视频,但是,我在添加更多视频并复制/粘贴代码时遇到了一个问题:第一个视频按我希望的方式关闭,但当第二个视频播放完后,它会跳回第一个视图控制器,而不是显示和播放视频的第二个VC(它显示第二个VC一秒钟)。如果我按“完成”关闭视频,则不会发生这种情况。有人能解决这个问题吗?