Как обнаружить AVPlayer фактически начал играть в быстром
Здравствуйте, я установил минимальное значение UISlider
равным 0,00. Тогда я устанавливаю максимальное значение таким образом.
self.viewPlayer.layer.addSublayer(playerLayer)
let duration : CMTime = avPlayer.avPlayer.currentItem!.asset.duration
let seconds : Float64 = CMTimeGetSeconds(duration)
sliderBar.maximumValue=Float(seconds)
sliderBar!.isContinuous = false
sliderBar!.tintColor = UIColor.green
Но я получаю это исключение
*** Terminating app due to uncaught exception 'NSInternalInconsistencyException', reason: 'Attempting to set a slider minimumValue (0.000000) to be larger than the maximumValue (nan)'
enter code here
Я знаю, что после prepareForPlay()
для реальной игры требуется некоторое время, чтобы действительно воспроизвести видео. Итак, как я могу определить, когда игрок действительно начал воспроизводить видео?
Пожалуйста, помогите мне.
Благодаря
Ответы
Ответ 1
С прошивкой 10 вы можете наблюдать timeControlStatus
свойство AVPlayer. Это может быть .playing
.
Проверьте код:
private func setupAVPlayer() {
avPlayer.addObserver(self, forKeyPath: "status", options: [.old, .new], context: nil)
if #available(iOS 10.0, *) {
avPlayer.addObserver(self, forKeyPath: "timeControlStatus", options: [.old, .new], context: nil)
} else {
avPlayer.addObserver(self, forKeyPath: "rate", options: [.old, .new], context: nil)
}
}
override func observeValue(forKeyPath keyPath: String?, of object: Any?, change: [NSKeyValueChangeKey : Any]?, context: UnsafeMutableRawPointer?) {
if object as AnyObject? === avPlayer {
if keyPath == "status" {
if avPlayer.status == .readyToPlay {
avPlayer.play()
}
} else if keyPath == "timeControlStatus" {
if #available(iOS 10.0, *) {
if avPlayer.timeControlStatus == .playing {
videoCell?.muteButton.isHidden = false
} else {
videoCell?.muteButton.isHidden = true
}
}
} else if keyPath == "rate" {
if avPlayer.rate > 0 {
videoCell?.muteButton.isHidden = false
} else {
videoCell?.muteButton.isHidden = true
}
}
}
}
Ответ 2
Вы можете добавить наблюдателя на объект вашего AVPlayer, как этот
player.addObserver(self, forKeyPath: "status", options: NSKeyValueObservingOptions.new, context: nil)
и вы можете проверить изменение статуса с помощью своего AVPlayer, как это
func observeValueForKeyPath(keyPath: String?, ofObject object: AnyObject?, change: [String : AnyObject]?, context: UnsafeMutableRawPointer) {
if keyPath == "status" {
print(player.status)
}
}
Ответ 3
Вот что я действительно знал, когда видео началось (а не когда оно только готово для запуска).
Swift 4
player = AVPlayer(url: URL(fileURLWithPath: path))
player.addObserver(self, forKeyPath: "rate", options: NSKeyValueObservingOptions.new, context: nil)
override func observeValue(forKeyPath keyPath: String?, of object: Any?, change: [NSKeyValueChangeKey : Any]?, context: UnsafeMutableRawPointer?) {
if keyPath == "rate" {
if player.rate > 0 {
print("video started")
}
}
}
Ответ 4
От Apple docs:
You can observe an AVPlayerLayer object’s readyForDisplay property to be notified when the layer has user-visible content. In particular, you might insert the player layer into the layer tree only when there is something for the user to look at and then perform a transition from
Ответ 5
Объявить AVPlayer Global
var streamPlayer = AVPlayer()
func playStreamAudio( for audioUrl:String)
{
guard streamPlayer.timeControlStatus != .playing else {
streamPlayer.pause()
return
}
let url = audioUrl //"http://192.168.71.11:7891/rec.wav"
let playerItem = AVPlayerItem(url: URL(string:url)!)
streamPlayer = AVPlayer(playerItem:playerItem)
streamPlayer.rate = 1.0;
streamPlayer.volume = 1.0
streamPlayer.play()
}
Ответ 6
layerObserver = newLayer.observe(\AVPlayerLayer.isReadyForDisplay, options: .new) { [weak self] _, change in
if change.newValue == true {
self?.viewModel?.videoLayerReadyToDisplay()
}
}
Когда приложение получает это событие, это означает, что вы можете скрыть миниатюру (например) и начать показ видео.
Ответ 7
Другой, более простой подход - это что-то вроде:
if videoPlayer.rate != 0 && videoPlayer.error == nil {
print("video player is playing.................")
} else {
print("video player is NOT playing.")
}
Очевидно, где videoPlayer имеет тип AVPlayer.