Swift 检测AVPlayer视频开始-停止事件

Swift 检测AVPlayer视频开始-停止事件,swift,avfoundation,avplayer,avqueueplayer,avkit,Swift,Avfoundation,Avplayer,Avqueueplayer,Avkit,下面是一段很好的简单的avplayer代码,在队列中播放一小部分视频。我的问题。实际上,我想在队列中的视频之间暂停。可能吗 我确实注意到了两次火灾;状态和通知一样只触发一次 import UIKit import AVKit import AVFoundation class ViewController: UIViewController { @IBOutlet weak var VideoView: UIView! var player:AVQueuePlayer = AVQueuePl

下面是一段很好的简单的avplayer代码,在队列中播放一小部分视频。我的问题。实际上,我想在队列中的视频之间暂停。可能吗

我确实注意到了两次火灾;状态和通知一样只触发一次

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")
}

}
导入UIKit
进口AVKit
进口AVF基金会
类ViewController:UIViewController{
@IBVAR视频视图:UIView!
var-player:AVQueuePlayer=AVQueuePlayer()
@iAction func NextSlide(发送方:AnyObject){
player.play()
}
重写func viewDidLoad(){
func NextSlide(发送方:AnyObject){
}
super.viewDidLoad()
//加载视图后,通常从nib执行任何其他设置。
让ArrayOfPath:[字符串]=[”http://192.100.1.1:8080/dino1.mov","http://192.100.1.1:8080/dino1.mov","http://192.100.1.1:8080/dino1.mov"]
变量快照=[AVPlayerItem]()
对于阵列路径中的项目{
设URL2ADOP=NSURL(字符串:项)
让avAsset=avurlaste(URL:url2adopt!)
放炮=AVPlayerItem(资产:avAsset)
快照。追加(快照)
}
player=AVQueuePlayer(项目:快照)
let playerLayer=AVPlayerLayer(玩家:玩家)
playerLayer.frame=VideoView.layer.bounds
VideoView.layer.addSublayer(播放器层)
addObserver(self,forKeyPath:“status”,选项:NSKeyValueObservingOptions。新建,上下文:nil)
addObserver(self,forKeyPath:“rate”,选项:NSKeyValueObservingOptions。新建,上下文:nil)
NSNotificationCenter.defaultCenter().addObserver(self,选择器:“itemDidFinishPlaying:”,名称:AVPlayerItemDidPlayToEndTimeNotification,对象:player.currentItem)
player.play()
}
重写函数didReceiveMemoryWarning(){
超级。我收到了记忆警告()
//处置所有可以重新创建的资源。
}
//捕获对状态的更改
重写func observeValueForKeyPath(键路径:String?,对象对象的类型:AnyObject?,更改:[String:AnyObject]?,上下文:UnsafeMutablePointer){
如果(关键路径=“速率”){
打印(播放速率)
}
如果(键路径==“状态”){
打印(玩家状态)
}
}
func itemDidFinishPlaying(通知:NSNotification){
打印(“完成”)
}
}
添加此行:

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

现在,每当当前播放的队列项目发生更改时,您都会收到通知。

“我实际上想在队列上的视频之间暂停。”那么,您为什么要使用AVQueuePlayer呢?只要播放一段视频,它就会停止。然后手动将另一个视频排队。强制AVQueuePlayer在视频结束时暂停会丢掉拥有AVQueuePlayer的全部意义,不是吗?效果非常好!谢谢大家!@matt由于
AVQueuePlayer
的目的是按顺序播放每个视频,我如何检查最后一个项目(视频)是否已播放完毕,并在此通知中从其视图中退出播放器?这将如何检测停止事件?