读取HLS播放列表信息以动态更改项目的preferredBitRate

Fan*_*ini 5 avfoundation http-live-streaming ios avurlasset m3u8

我正在开发一个视频应用程序,我们正在将常规 mp4 文件更改为 HLS,我们必须进行更改的众多原因之一是我们对视频的带宽使用有更多的控制(我们加载许多其他内容)在我们的播放器中,因此我们需要以最佳方式优化体验)。

因此,AVFoundation在 iOS10 中引入了使用以下方法控制带宽的功能:

AVPlayerItem *playerItem = [AVPlayerItem playerItemWithAsset:self.urlAsset];
playerItem.preferredForwardBufferDuration = 30.0;
playerItem.preferredPeakBitRate = 200000.0; // Remember this line
Run Code Online (Sandbox Code Playgroud)

iOS11上还引入了一个配置来设置项目的最大分辨率preferredMaximumResolution,所以我们正在使用它,但我们仍然需要针对iOS10设备的解决方案。

好吧,现在我们可以控制了,这preferredPeakBitRate很好,但我们有一个问题,并非所有 HLS 源都是由我们生成的,所以,假设我们希望在未连接到 wifi 网络时将最大分辨率设置为 480p ,今天我没有办法实现这一点,并不总是我能够知道所选 480p 源需要多少带宽HLS playlist

我正在考虑的一件事是阅读文件内的信息m3u8,至少知道我的播放器可以显示哪些不同质量的源以及每个人需要多少带宽。

一种方法是将m3u8播放列表下载为纯文本,使用正则表达式读取文件并处理这些数据,好吧,我试图避免这种情况,我认为这应该不那么困难。

我无法从曲目中读取此信息,因为 a)我找不到信息,b)更改质量时会动态替换曲目,是的,每个质量级别都有 1 个曲目。

所以,我不知道如何获取这些信息,我搜索了google,stackoverflow,但找不到这些信息,有人可以帮助我吗?

这是我想做的一个例子,我有这个示例播放列表:

#EXTM3U

#EXT-X-STREAM-INF:PROGRAM-ID=1,BANDWIDTH=314000,RESOLUTION=228x128,CODECS="mp4a.40.2"
test-hls-1-16a709300abeb08713a5cada91ab864e_hls_duplex_192k.m3u8
#EXT-X-STREAM-INF:PROGRAM-ID=1,BANDWIDTH=478000,RESOLUTION=400x224,CODECS="avc1.42001e,mp4a.40.2"
test-hls-1-16a709300abeb08713a5cada91ab864e_hls_duplex_400k.m3u8
#EXT-X-STREAM-INF:PROGRAM-ID=1,BANDWIDTH=691000,RESOLUTION=480x270,CODECS="avc1.42001e,mp4a.40.2"
test-hls-1-16a709300abeb08713a5cada91ab864e_hls_duplex_600k.m3u8
#EXT-X-STREAM-INF:PROGRAM-ID=1,BANDWIDTH=1120000,RESOLUTION=640x360,CODECS="avc1.4d001f,mp4a.40.2"
test-hls-1-16a709300abeb08713a5cada91ab864e_hls_duplex_1000k.m3u8
#EXT-X-STREAM-INF:PROGRAM-ID=1,BANDWIDTH=1661000,RESOLUTION=960x540,CODECS="avc1.4d001f,mp4a.40.2"
test-hls-1-16a709300abeb08713a5cada91ab864e_hls_duplex_1500k.m3u8
Run Code Online (Sandbox Code Playgroud)

我只想在我的代码中的数组上提供这些信息,如下所示:

NSArray<ZZMetadata *> *metadataArray = self.urlAsset.bandwidthMetadata;
NSLog(@"Metadata info: %@", metadataArray);
Run Code Online (Sandbox Code Playgroud)

并打印如下内容:

<__NSArrayM 0x123456789> (
<ZZMetadata 0x234567890> {
  trackId: 1
  neededBandwidth: 314000
  resolution: 228x128
  codecs: ...
  ...
}
<ZZMetadata 0x345678901> {
  trackId: 2
  neededBandwidth: 478000
  resolution: 400x224
}
...
} 
Run Code Online (Sandbox Code Playgroud)