Computer >> Hướng Dẫn Máy Tính >  >> Lập Trình >> iOS

Cách phát hiện khi AVPlayer phát xong video trong Swift

Để biết khi nào AVPlayer phát hết video, dùng NotificationCenter quan sát AVPlayerItemDidPlayToEndTime notification.

Các bước

  1. Tạo AVPlayer với URL video local/bundle.
  2. Tạo AVPlayerLayer hiển thị video.
  3. Đăng ký observer cho notification kết thúc.
  4. Xử lý trong selector callback.
  5. 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:

Cách phát hiện khi AVPlayer phát xong video trong Swift

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

Cách phát hiện khi AVPlayer phát xong video trong Swift

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 deinit hoặc viewDidDisappear.