2016-08-26 15 views
0

私はAVPlayerViewControllerを使ってローカルビデオを再生するアプリを持っています。 しかし、ビデオの再生が終了したら、私はそれを(MPMoviePlayerViewControllerのように)自動的に閉じたいと思います。再生が完了したらAVPlayerを自動的に終了しますか?

この質問を投稿した後、私は以下の回答と、部分的にはAppleの「ガイドとサンプルコード」から部分的に解決することができました。

これは私のために働いたコードです:

#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

- (void)playerItemDidReachEnd:(NSNotification *)notification { [self.controller dismissViewControllerAnimated:YES completion:nil]; } 
コードをコピーして貼り付けます:最初のビデオは私が望むように解除されますが、2番目のビデオの再生が終了すると、2番目のVCではなくビデオが表示され再生される1秒間の第2のVCを示す)。 「完了」を押してビデオを閉じると、これは起こりません。 誰にでもこの解決策がありますか? –

答えて

1

これは動作するはずです:

[[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

私はあなたの答えとAppleのガイドとサンプルコードの助けを借りて、動作させることができました。私は元の質問に私のために働いたコードを掲載しました。 しかし、さらにビデオを追加してコードをコピー/ペーストしたときに別の問題が発生しました。最初のビデオは私が望むように解除されますが、2番目のビデオの再生が終了したら最初のView Controller秒が表示されます(2秒目のVCが1秒間表示されます)。 「完了」を押してビデオを閉じると、これは起こりません。 なぜ、どのように解決するのか考えていますか? –

+0

ここに示す例のように、リスナーを削除する必要があります。あなたの更新されたコードでは、最初のVCはまだ登録されているオブザーバーです –

+0

素晴らしい作業!ありがとうございました! –

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

はAVPlayerItemのDidPlayToEndTime通知を購読します。

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

新しいプレーヤーここ

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

プレーヤーが解任削除するか、プレーヤーは.hファイルでビュー

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

私はあなたの答えとAppleのガイドとサンプルコードの助けを借りて、動作させることができました。私は元の質問に私のために働いたコードを掲載しました。 しかし、さらにビデオを追加してコードをコピー/ペーストしたときに別の問題が発生しました。最初のビデオは私が望むように解除されますが、2番目のビデオの再生が終了したら最初のView Controller秒が表示されます(2秒目のVCが1秒間表示されます)。 「完了」を押してビデオを閉じると、これは起こりません。 なぜ、どのように解決するのか考えていますか? –

0

を追加するAVPlayerItemを渡し

.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]; 

    } 

そして解任について

私の質問のコードは一つのビデオ、 を却下して素晴らしい作品しかし、私はより多くの動画を追加したとき、私は問題が発生し
関連する問題