如何获取 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 (将#修改为@)

相关问答

依赖报错 idea导入项目后依赖报错,解决方案:https://blog....
错误1:代码生成器依赖和mybatis依赖冲突 启动项目时报错如下...
错误1:gradle项目控制台输出为乱码 # 解决方案:https://bl...
错误还原:在查询的过程中,传入的workType为0时,该条件不起...
报错如下,gcc版本太低 ^ server.c:5346:31: 错误:‘struct...