【问题标题】:Detecting AVPlayer video start stop events检测 AVPlayer 视频开始停止事件
【发布时间】:2016-04-22 18:35:32
【问题描述】:

这是一段非常简单的 avplayer 代码,用于播放队列中的一小部分视频。我的问题。我实际上想在队列中的视频之间暂停。有可能吗?

我确实注意到 rate 会触发两次; status 和 notification 一样只触发一次。

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

}

【问题讨论】:

  • “我实际上想在队列中的视频之间暂停。”那你为什么要使用 AVQueuePlayer 呢?只需播放视频,它就会停止。然后,您手动将另一个视频排队。强制 AVQueuePlayer 在视频结束时暂停会抛弃拥有 AVQueuePlayer 的全部意义,不是吗?

标签: swift avfoundation avplayer avqueueplayer avkit


【解决方案1】:

添加这一行:

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

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

【讨论】:

  • 完美运行!谢谢!
  • @matt 因为AVQueuePlayer 的目的是按顺序播放每个视频,我如何检查最后一个项目(视频)是否已完成播放并在此通知中从其视图中关闭播放器?
  • 这将如何检测停止事件?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-12-20
  • 2018-04-30
相关资源
最近更新 更多