Обнаружение событий начала и остановки видео AVPlayer

Вот хороший простой фрагмент кода 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")
}

}

person user3069232    schedule 17.01.2016    source источник
comment
Я действительно хочу сделать паузу между видео в моей очереди. Тогда почему вы вообще используете AVQueuePlayer? Просто воспроизведите видео, и оно остановится. Затем вы вручную ставите в очередь другое видео на его место. Принуждение AVQueuePlayer к паузе в конце видео отбрасывает весь смысл наличия AVQueuePlayer, не так ли?   -  person matt    schedule 17.01.2016


Ответы (1)


Добавьте эту строку:

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

Теперь вы будете получать уведомления каждый раз, когда происходит изменение воспроизводимого в данный момент элемента очереди.

person matt    schedule 17.01.2016
comment
Работает отлично! Благодарю вас! - person user3069232; 17.01.2016
comment
@matt, поскольку целью AVQueuePlayer является последовательное воспроизведение каждого видео, как я могу проверить, что последний элемент (видео) закончил воспроизведение, и закрыть проигрыватель из его представления в этом уведомлении? - person Pangu; 10.03.2016
comment
как это обнаружит событие остановки? - person hariszaman; 01.04.2016