2014-05-06 15 views
16

Ho esaminato i documenti AVPlayerItem e AVPlayer e non sembra esserci alcuna richiamata per quando l'elemento è finito. Speravo che ci fosse una sorta di callback delegato che possiamo utilizzare o che AVPlayerActionAtItemEnd fornirebbe un'azione personalizzata per noi scrivere.Come rilevare quando un AVPlayerItem ha finito di giocare?

Come è possibile trovare un modo per rilevare quando AVPlayer ha terminato di riprodurre un elemento?

risposta

38

Usa NSNotification per avvisare quando la riproduzione è finita.

Registro per la notifica:

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

metodo da chiamare quando fatto:

-(void)itemDidFinishPlaying:(NSNotification *) notification { 
    // Will be called when AVPlayer finishes playing playerItem 
} 
+0

è possibile utilizzare '[AVPlayer CurrentItem]' se si utilizza AVPlayerViewController – abhi1992

5

Swift-i-cato (versione 3)

class MyVideoPlayingViewController: AVPlayerViewController { 

    override func viewDidLoad() { 
     // Do any additional setup after loading the view. 
     super.viewDidLoad() 

     let videoURL = URL(fileURLWithPath: Bundle.main.path(forResource: "MyVideo", 
                    ofType: "mp4")!) 
     player = AVPlayer(url: videoURL) 

     NotificationCenter.default.addObserver(self, 
              selector: #selector(MyVideoPlayingViewController.animationDidFinish(_:)), 
              name: .AVPlayerItemDidPlayToEndTime, 
              object: player?.currentItem) 
    } 

    override func viewDidAppear(_ animated: Bool) { 
     super.viewDidAppear(animated) 
     player?.play() 
    } 

    func animationDidFinish(_ notification: NSNotification) { 
     print("Animation did finish") 
    } 

    deinit { 
     NotificationCenter.default.removeObserver(self) 
    } 

} 
+0

Buona risposta ma essere sicuri di invocare removeObserver (_: Nome: oggetto :) prima di osservatore o qualsiasi oggetto specificato nel addObserver: selettore: Nome: oggetto : è deallocato. – pierre23

0

Questo è il modo che ho fatto esso.

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


- (void)movieFinishedCallback:(NSNotification*)aNotification 
{ 
    // [self dismissViewControllerAnimated:YES completion:Nil]; 
} 
Problemi correlati