第一帧后互联网连接速度较慢的 AVPLAYER 无法正常工作



我的问题是,当连接非常差时,激活指示器开始动画,直到显示视频中的第一帧,然后消失,认为是视频正在播放,但视频停止播放卡在加载的第一帧,直到加载整个视频然后恢复播放,如何在视频卡在帧和缓冲时显示活动指示器,然后播放到下一个加载的帧?

  • 笔记:

    • 互联网连接关闭时它正在工作,视频播放直到显示加载的帧和活动指示器,然后当打开视频时,我们恢复播放并且活动指示器被隐藏

    • 当存在正常的互联网连接时,它正在工作

    • 使用覆盖键路径的观察值删除和显示指示器 "currentItem.loadedTimeRanges"/"currentItem.playbackBufferEmpty">

我做了一个包含 avplayer 的 UIview 类

import UIKit
import AVKit
import AVFoundation
class videoplaying: UIView {
override static var layerClass: AnyClass {
return AVPlayerLayer.self;
}
var playerlayer: AVPlayerLayer{
return layer as! AVPlayerLayer;
}
var player: AVPlayer?{
get{
return playerlayer.player
}
set {
playerlayer.player = newValue
}
}
var playetitem: AVPlayerItem?

}

我在UIcollectioncell中为这个类分配了一个uivew(使用故事板( Avplayer在UIcollectionCell中按播放时开始播放并添加观察

@IBAction func play(_ sender: Any) {
activityindicator.isHidden = false
activityindicator.startAnimating()
self.butttoonheight.isHidden = true
self.postimage.isHidden = true
let url2 = URL(string: "https://clips.vorwaerts-gmbh.de/big_buck_bunny.mp4")
let avplayer = AVPlayer(url: url2! )
let playeritem = AVPlayerItem(url: url2!)
//videoss is class of type uiview
videoss.playetitem = playeritem
videoss.playerlayer.player = avplayer
videoss.player?.play()
videoss.player?.addObserver(self, forKeyPath: "currentItem.loadedTimeRanges", options: .new, context: nil)
videoss.player?.addObserver(self, forKeyPath: "rate", options: .new
, context: nil)
videoss.player?.addObserver(self, forKeyPath: "currentItem.playbackBufferEmpty", options: .new, context: nil)
playying.isHidden = false
}
//observing when video is playing

//playpause button to play or pause video while bad network is present video is stuck on first frame and playorpause is not changing while pressed
@IBAction func playorpause(_ sender: Any) {
if videoss.player?.timeControlStatus == AVPlayerTimeControlStatus.paused{
videoss.player?.play()
playying.setImage(UIImage(named: "pas50"), for: .normal)
}
if videoss.player?.timeControlStatus == AVPlayerTimeControlStatus.playing{
videoss.player?.pause()
playying.setImage(UIImage(named: "p24"), for: .normal)
}
}
override public func observeValue(forKeyPath keyPath: String?, of object: Any?, change: [NSKeyValueChangeKey : Any]?, context: UnsafeMutableRawPointer?) {
if keyPath == "rate"{
print(videoss.player?.rate)
if  videoss.player?.rate == 0.0 {
print("dawdaopwdaopwdipo")
}
}
if keyPath == "currentItem.loadedTimeRanges"{
print("its is working")
activityindicator.stopAnimating()
activityindicator.isHidden = true
}
if keyPath == "currentItem.playbackBufferEmpty"
{
activityindicator.startAnimating()
activityindicator.isHidden = false
print("pkawdawdawd")
}
}

我通过添加一个运行0.3秒的计时器解决了这个问题,evrry 0.3秒它检查视频的当前时间,如果当前时间等于上一次,则显示视频未播放活动指示器,如果不是视频,则隐藏播放活动指示器,还需要检查用户是否暂停视频,一个优点是您还可以在同一功能中获得当前时间。 我尝试的也是看到视频的速率,但是在慢速互联网上,速率总是给出正在播放的速率,但事实并非如此,这没有帮助

最新更新