Để biết khi nào AVPlayer phát hết video, dùng NotificationCenter quan sát AVPlayerItemDidPlayToEndTime notification.
Các bước
- Tạo
AVPlayervới URL video local/bundle. - Tạo
AVPlayerLayerhiển thị video. - Đăng ký observer cho notification kết thúc.
- Xử lý trong selector callback.
- Quan trọng: Hủy observer khi deinit để tránh memory leak/crash.
Code hoàn chỉnh
import AVKit
import AVFoundation
class VideoViewController: UIViewController {
var player: AVPlayer!
var playerLayer: AVPlayerLayer!
override func viewDidAppear(_ animated: Bool) {
super.viewDidAppear(animated)
setupPlayer()
}
func setupPlayer() {
guard let path = Bundle.main.path(forResource: "video", ofType: "mp4") else { return }
let url = URL(fileURLWithPath: path)
player = AVPlayer(url: url)
playerLayer = AVPlayerLayer(player: player)
playerLayer.frame = view.bounds
playerLayer.videoGravity = .resizeAspect
view.layer.addSublayer(playerLayer)
// Đăng ký notification khi video kết thúc
NotificationCenter.default.addObserver(self,
selector: #selector(videoDidEnd(_:)),
name: .AVPlayerItemDidPlayToEndTime,
object: player.currentItem)
player.play()
}
@objc func videoDidEnd(_ notification: Notification) {
print("Video đã phát xong")
// Xử lý: loop lại, chuyển video tiếp, dismiss, show UI...
// player.seek(to: .zero); player.play() // Loop
}
deinit {
// BẮT BUỘC: Hủy observer
NotificationCenter.default.removeObserver(self)
}
}
Kết quả
Video phát trên màn hình:

Console in ra khi video kết thúc:

Lưu ý
- Observer object là
player.currentItem(AVPlayerItem), không phải player. - Dùng
name: .AVPlayerItemDidPlayToEndTime(Swift 4.2+ syntax). - Nếu dùng
AVQueuePlayer(playlist), notification vẫn phát cho từng item. - Luôn remove observer trong
deinithoặcviewDidDisappear.