gpt4 book ai didi

ios - HLS 直播流视频在首次加载时无法播放

转载 作者:行者123 更新时间:2023-11-29 05:53:27 30 4
gpt4 key购买 nike

我正在尝试在 iOS 中进行直播,因此遵循以下步骤 -

  1. 初始化播放器

    player                 = AVPlayer()
    player.rate = 1.0
    player.actionAtItemEnd = AVPlayerActionAtItemEnd.none
  2. 设置播放器层

    playerLayer                 = AVPlayerLayer(player: player)
    playerLayer.frame = self.bounds
    playerLayer.backgroundColor = UIColor.clear.cgColor
    playerLayer.videoGravity = AVLayerVideoGravity.resizeAspectFill

    if let sublayers = self.layer.sublayers {

    for layer in sublayers {
    layer.removeFromSuperlayer()
    }
    }

    self.layer.addSublayer(playerLayer)
  3. 设置播放器项目

    let avAsset = AVURLAsset(url: streamingUrl)
    playerItem = AVPlayerItem(asset: avAsset)
  4. 替换播放器中的当前Item并播放

    self.player?.replaceCurrentItem(with: self.playerItem)
    self.player?.play()

如果我在流式传输开始后加载播放器,我的视频播放效果非常好,但如果我在从后端开始实时流式传输之前加载播放器,然后在一段时间后开始流式传输,则它不会播放视频。

我尝试向playerItem的status属性添加一个观察者,但这在上面提到的条件下也不会改变,只有当我在流媒体开始后加载播放器并且一切正常时才会改变。所以我的问题是为什么我没有收到playerItem 的状态更改?我错过了什么吗?请帮忙。提前致谢。

最佳答案

根据您的情况,使用 AVAsset(url: URL).isPlayable 检查 url 是否可播放,然后才能播放

if avAsset.isPlayable {
playerItem = AVPlayerItem(asset: avAsset)
...
}

为了更好的方法,使用观察者

class ViewController: UIViewController {

private var observerContext = 0
private let player = AVPlayer()
private var readyForPlayback = false

private var playerItem: AVPlayerItem? {
willSet {
playerItem?.removeObserver(self, forKeyPath: #keyPath(AVPlayerItem.status), context: &observerContext)
}

didSet {
playerItem?.addObserver(self, forKeyPath: #keyPath(AVPlayerItem.status), options: [.initial, .new], context: &observerContext)
}
}

private var asset: AVAsset? {
willSet {
readyForPlayback = false
asset?.removeObserver(self, forKeyPath: #keyPath(AVURLAsset.isPlayable), context: &observerContext)
}

didSet {
guard asset == nil else {
asset!.addObserver(self, forKeyPath: #keyPath(AVURLAsset.isPlayable), options: [.initial, .new], context: &observerContext)
return
}

playerItem = nil
player.replaceCurrentItem(with: nil)
}
}

// MARK: KVO
override func observeValue(forKeyPath keyPath: String?, of object: Any?, change: [NSKeyValueChangeKey : Any]?, context: UnsafeMutableRawPointer?) {
guard context == &observerContext else {
super.observeValue(forKeyPath: keyPath, of: object, change: change, context: context)
return
}

guard let keyPath = keyPath else { return }

switch keyPath {
case #keyPath(AVURLAsset.isPlayable):
guard asset?.isPlayable == true else { return }
playerItem = AVPlayerItem(asset: asset!)
player.replaceCurrentItem(with: playerItem)
case #keyPath(AVPlayerItem.status):
guard let status = playerItem?.status else { return }

if status == .readyToPlay {
guard !readyForPlayback else { return }
readyForPlayback = true
player.play()
} else if status == .failed {
readyForPlayback = false
if let error = playerItem?.error {
print("Error: \(error)")
}
}
default:
super.observeValue(forKeyPath: keyPath, of: object, change: change, context: context)
}
}
}

使用

self.asset = AVAsset

停止播放

self.asset = nil

关于ios - HLS 直播流视频在首次加载时无法播放,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55438937/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com