如何找到 AVPlayer 当前比特率
How to find AVPlayer current bitrate
我正在尝试获取 AVPlayer 播放视频流的比特率。我尝试使用 AVPlayerItemAccessLogEvent
的 observed bit rate
属性,但它给出了非常高的 value.After 进一步探索 Observed-bit-rate
属性 我明白这个 属性 显示 download rate of a segment
的值。我需要知道播放器播放流的比特率。
下图显示了实时流的观察比特率与指示比特率。
请就此问题提出您的建议。
我尝试了以下 link 但没有成功:
.
MPMoviePlayerController MovieAccessLogEvent - Inflated observedBitrate.
关于 observedBitrate
你是对的。那显示下载速度。
indicatedBitrate
应该告诉您播放当前流所需的广告比特率。我相信该值来自 HLS 主清单。当播放没有多种比特率变体且只有一种比特率变体可用的流时,indicatedBitrate
的值将为 -1
.
如果您总是处理具有主清单的流,那么 indicatedBitrate
是最佳选择。
如果您正在处理没有主清单的流,那么估计比特率的一种方法是获取最后一个 AVPlayerItemAccessLogEvent
条目,并使用以下方法计算它:
numberOfBitsTransferred = (numberOfBytesTransferred * 8)
numberOfBitsTransferred / segmentsDownloadedDuration
根据经验,每次播放器切换比特率时,都会post一个新的访问日志条目。最新的访问日志条目将包含有关最近选择的流的数据。
我遵循了 Anurag 的回答,它给了我想要的解决方案,但是我注意到使用 AVPlayerItem 的访问日志事件的 averageAudioBitrate
或 averageVideoBitrate
属性 可以获得相同的值,具体取决于你感兴趣的是什么。
这是我在 Swift 5
中的设置方式
NotificationCenter.default.addObserver(forName: .AVPlayerItemNewAccessLogEntry,
object: playerItem,
queue: nil) { [weak self] notification in
if let event = self?.playerItem?.accessLog()?.events.last {
let bitsTransferred = Double(event.numberOfBytesTransferred * 8)
let bitrate = bitsTransferred / Double(event.segmentsDownloadedDuration)
print("Calculated Bit Rate: \(bitrate)")
// This gives the same value as Anurag's answer
print("Average Bit Rate: \(event.averageAudioBitrate)")
}
}
我还想补充一点,让这个通知被触发对于直播来说远非可靠。
我正在尝试获取 AVPlayer 播放视频流的比特率。我尝试使用 AVPlayerItemAccessLogEvent
的 observed bit rate
属性,但它给出了非常高的 value.After 进一步探索 Observed-bit-rate
属性 我明白这个 属性 显示 download rate of a segment
的值。我需要知道播放器播放流的比特率。
下图显示了实时流的观察比特率与指示比特率。
请就此问题提出您的建议。
我尝试了以下 link 但没有成功:
.
MPMoviePlayerController MovieAccessLogEvent - Inflated observedBitrate.
关于 observedBitrate
你是对的。那显示下载速度。
indicatedBitrate
应该告诉您播放当前流所需的广告比特率。我相信该值来自 HLS 主清单。当播放没有多种比特率变体且只有一种比特率变体可用的流时,indicatedBitrate
的值将为 -1
.
如果您总是处理具有主清单的流,那么 indicatedBitrate
是最佳选择。
如果您正在处理没有主清单的流,那么估计比特率的一种方法是获取最后一个 AVPlayerItemAccessLogEvent
条目,并使用以下方法计算它:
numberOfBitsTransferred = (numberOfBytesTransferred * 8)
numberOfBitsTransferred / segmentsDownloadedDuration
根据经验,每次播放器切换比特率时,都会post一个新的访问日志条目。最新的访问日志条目将包含有关最近选择的流的数据。
我遵循了 Anurag 的回答,它给了我想要的解决方案,但是我注意到使用 AVPlayerItem 的访问日志事件的 averageAudioBitrate
或 averageVideoBitrate
属性 可以获得相同的值,具体取决于你感兴趣的是什么。
这是我在 Swift 5
中的设置方式NotificationCenter.default.addObserver(forName: .AVPlayerItemNewAccessLogEntry,
object: playerItem,
queue: nil) { [weak self] notification in
if let event = self?.playerItem?.accessLog()?.events.last {
let bitsTransferred = Double(event.numberOfBytesTransferred * 8)
let bitrate = bitsTransferred / Double(event.segmentsDownloadedDuration)
print("Calculated Bit Rate: \(bitrate)")
// This gives the same value as Anurag's answer
print("Average Bit Rate: \(event.averageAudioBitrate)")
}
}
我还想补充一点,让这个通知被触发对于直播来说远非可靠。