检测 AvPlayer 何时切换比特率

Detect when AvPlayer switch bit rate

在我的应用程序中,我使用 AVPlayer 通过 HLS 协议读取一些流(m3u8 文件)。我需要知道在流媒体会话期间,客户端切换比特率的次数。

让我们假设客户端的带宽正在增加。因此客户端将切换到更高比特率的段。 AVPlayer 可以检测到这个开关吗?

谢谢。

我最近遇到了类似的问题。该解决方案感觉有点老套,但据我所知它有效。首先,我为新的访问日志通知设置了一个观察者:

[[NSNotificationCenter defaultCenter] addObserver:self
                                         selector:@selector(handleAVPlayerAccess:)
                                             name:AVPlayerItemNewAccessLogEntryNotification
                                           object:nil];

调用这个函数。它可能可以优化,但这里是基本思想:

- (void)handleAVPlayerAccess:(NSNotification *)notif {
    AVPlayerItemAccessLog *accessLog = [((AVPlayerItem *)notif.object) accessLog];
    AVPlayerItemAccessLogEvent *lastEvent = accessLog.events.lastObject;
    float lastEventNumber = lastEvent.indicatedBitrate;
    if (lastEventNumber != self.lastBitRate) {
        //Here is where you can increment a variable to keep track of the number of times you switch your bit rate.
        NSLog(@"Switch indicatedBitrate from: %f to: %f", self.lastBitRate, lastEventNumber);
        self.lastBitRate = lastEventNumber;
    }
}

每次访问日志有新条目时,它都会检查最近条目(播放器项目的访问日志中的 lastObject)中最后指示的比特率。它将此指示的比特率与存储上次更改的比特率的 属性 进行比较。

BoardProgrammer 的解决方案非常有效!就我而言,我需要指示的比特率来检测内容质量何时从标清切换到高清。这是 Swift 3 版本。

// Add observer.
NotificationCenter.default.addObserver(self,
                                           selector: #selector(handleAVPlayerAccess),

                                           name: NSNotification.Name.AVPlayerItemNewAccessLogEntry,
                                           object: nil)

// Handle notification.
func handleAVPlayerAccess(notification: Notification) {

    guard let playerItem = notification.object as? AVPlayerItem,
        let lastEvent = playerItem.accessLog()?.events.last else {
        return
    }

    let indicatedBitrate = lastEvent.indicatedBitrate

    // Use bitrate to determine bandwidth decrease or increase.
}