检测 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.
}
在我的应用程序中,我使用 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.
}