如何解决如何获取 AVPlayer 的初始缓冲区大小
为了衡量我的 App 中视频播放的服务质量,我需要测量内容实际开始播放时 AVPlayer 的初始缓冲区大小。
为此,我在播放的第一毫秒添加了一个一次性周期性时间观察器,并从那里检查最后一个 AVPlayerItemAccessLogEvent 的属性 segmentDownloadedDuration。
遗憾的是,我通过这种方法获得的值与我在服务器端看到的值不匹配。
服务器端,如果我将最初请求的段数乘以段持续时间,与我的客户端应用程序的报告相比,我得到最多 6 秒的不匹配值。
有没有更好的方法来获取这些数据?有什么我们可能遗漏或做错的事情吗?
您可以在下面找到客户端方法的示例:
import UIKit
import AVFoundation
class PlaygroundViewController: UIViewController {
override func viewDidLoad() {
super.viewDidLoad()
let videoURL = URL(string: "https://devstreaming-cdn.apple.com/videos/streaming/examples/img_bipbop_adv_example_ts/master.m3u8")!
// Setup Player Layer
playerLayer = AVPlayerLayer(player: player)
playerLayer.frame = view.bounds
view.layer.addSublayer(playerLayer)
// Setup Player Item
let asset = AVAsset(url: videoURL)
playerItem = AVPlayerItem(asset: asset)
// Setup AVPlayer
player = AVPlayer(playerItem: playerItem)
// Setup one time observer
var contentStartedobserver: Any?
contentStartedobserver = player?.addPeriodicTimeObserver(forInterval: CMTimeMake(value: 1,timescale: 1000),queue: dispatchQueue.main,using: {
[weak self] _ in
print("Content Started Playing")
guard let accessLog = self?.playerItem.accessLog() else { return }
guard let lastEvent = accessLog.events.last else { return }
print(">> Buffered Duration:")
print(lastEvent.segmentsDownloadedDuration)
// Ok,we are done. Remove the observer
self?.player?.removeTimeObserver(contentStartedobserver)
})
// Play
playerLayer.player = player
player.play()
}
// MARK: - Private
private var playerLayer: AVPlayerLayer!
private var player: AVPlayer!
private var playerItem: AVPlayerItem!
}
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。