如何查找AVPlayer当前比特率

时间:2015-09-04 21:29:12

标签: ios7 avplayer bitrate avplayeritem

我正在尝试获取AVPlayer正在播放视频流的比特率。我尝试使用observed bit rate的{​​{1}}属性,但它提供了非常高的价值。在AVPlayerItemAccessLogEvent属性进一步探索后,我了解到此属性显示Observed-bit-rate的值。我需要知道玩家正在播放流的比特率。

下图显示了LIVE流的观察位与指示比特率。 enter image description here

请就此问题提出建议。

我尝试了以下链接,但没有运气:

https://stackoverflow.com/a/14845997/1730345

MPMoviePlayerController MovieAccessLogEvent - Inflated observedBitrate

2 个答案:

答案 0 :(得分:6)

你对observedBitrate是正确的。这显示了下载速度。

indicatedBitrate应告诉您播放当前流所需的广告比特率。我相信价值来自HLS主清单。在播放没有多种比特率变体的流时,只有一个比特率变体可用,indicatedBitrate的值将为-1

如果您总是处理具有主清单的流,那么indicatedBitrate是最佳选择。

如果您正在处理没有主清单的流,那么估算比特率的一种方法是获取最后一个AVPlayerItemAccessLogEvent条目,并使用以下方法计算:

numberOfBitsTransferred = (numberOfBytesTransferred * 8)
numberOfBitsTransferred / segmentsDownloadedDuration

根据经验,每次播放器切换比特率时,它都会发布一个新的访问日志条目。最新的访问日志条目将包含有关最近选择的流的数据。

答案 1 :(得分:0)

我遵循了 Anurag 的回答,它为我提供了所需的解决方案,但是我注意到使用 AVPlayerItem 的访问日志事件的 averageAudioBitrateaverageVideoBitrate 属性可以获得相同的值,具体取决于您的兴趣。

这是我在 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)")
        }
}

我还想补充一点,在直播中触发此通知远非可靠。