问题描述
为了衡量我的 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 (将#修改为@)