检测AVPlayer视频开始和停止事件

3

这里有一段很好的简单的AVPlayer代码,可以播放一个小视频集合。我的问题是:我想在我的队列中的视频之间暂停一下,这是否可能?

我注意到rate会触发两次;状态和通知只会触发一次。

import UIKit
import AVKit
import AVFoundation

class ViewController: UIViewController {
    
    @IBOutlet weak var VideoView: UIView!
    var player:AVQueuePlayer = AVQueuePlayer()
    
    @IBAction func NextSlide(sender: AnyObject) {
        player.play()
    }
    
    override func viewDidLoad() {
        func NextSlide(sender: AnyObject) {
        }
        super.viewDidLoad()
        // Do any additional setup after loading the view, typically from a nib.
        
        let arrayOfPaths: [String] = ["http://192.100.1.1:8080/dino1.mov","http://192.100.1.1:8080/dino1.mov","http://192.100.1.1:8080/dino1.mov"]
        
        var shots = [AVPlayerItem]()
        
        for item in arrayOfPaths {
            let url2adopt = NSURL(string: item)
            let avAsset = AVURLAsset(URL: url2adopt!)
            let shot = AVPlayerItem(asset: avAsset)
            shots.append(shot)
        }
        
        player = AVQueuePlayer(items: shots)
        let playerLayer = AVPlayerLayer(player: player)
        playerLayer.frame = VideoView.layer.bounds
        VideoView.layer.addSublayer(playerLayer)
        player.addObserver(self, forKeyPath: "status", options: NSKeyValueObservingOptions.New, context: nil)
        player.addObserver(self, forKeyPath: "rate", options: NSKeyValueObservingOptions.New, context: nil)
        NSNotificationCenter.defaultCenter().addObserver(self, selector: "itemDidFinishPlaying:", name: AVPlayerItemDidPlayToEndTimeNotification, object: player.currentItem)
        
        player.play()
    }
    
    override func didReceiveMemoryWarning() {
        super.didReceiveMemoryWarning()
        // Dispose of any resources that can be recreated.
    }
    
    // catch changes to status
    override func observeValueForKeyPath(keyPath: String?, ofObject object: AnyObject?, change: [String : AnyObject]?, context: UnsafeMutablePointer<Void>) {
        if (keyPath == "rate") {
            print(player.rate)
        }
        if (keyPath == "status") {
            print(player.status)
        }
    }
    
    func itemDidFinishPlaying(notification:NSNotification) {
        print("finished")
    }
    
}

1
我其实想在我的视频队列中间暂停。那你为什么还要使用AVQueuePlayer?只需播放一个视频,然后它会停止。然后你手动排队播放下一个视频。强制AVQueuePlayer在一个视频结束时暂停会使得使用AVQueuePlayer失去意义,不是吗? - matt
1个回答

5

添加这一行:

player.addObserver(
    self, forKeyPath:"currentItem", options:.Initial, context:nil)

现在每当播放队列中当前项目发生变化时,您将收到通知。


完美运行!谢谢! - user3069232
@matt 由于 AVQueuePlayer 的目的是按顺序播放每个视频,我该如何检查最后一个项目(视频)是否已完成播放,并在此通知中从其视图中解除播放器? - Pangu
1
这将如何检测停止事件? - hariszaman

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接