问题
I've been looking through the AVPlayerItem
and AVPlayer
docs and there doesn't seem to be any callbacks for when the item is finished playing. I was hoping that there would be some sort of delegate callback that we can utilize or that AVPlayerActionAtItemEnd
would provide a custom action for us to write.
How can i figure out a way to detect when AVPlayer has finished playing an item?
回答1:
It uses NSNotification
to alert when playback is finished.
Register for the notification:
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(itemDidFinishPlaying:) name:AVPlayerItemDidPlayToEndTimeNotification object:playerItem];
Method to call when done:
-(void)itemDidFinishPlaying:(NSNotification *) notification {
// Will be called when AVPlayer finishes playing playerItem
}
回答2:
Swift-i-fied (version 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)
}
}
回答3:
This is how I did it.
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(movieFinishedCallback:) name:AVPlayerItemDidPlayToEndTimeNotification object:player.currentItem];
- (void)movieFinishedCallback:(NSNotification*)aNotification
{
// [self dismissViewControllerAnimated:YES completion:Nil];
}
来源:https://stackoverflow.com/questions/23502581/how-to-detect-when-an-avplayeritem-is-finished-playing