我正在开发一个视频应用程序,我们正在将常规 mp4 文件更改为 HLS,我们必须进行更改的众多原因之一是我们对视频的带宽使用有了更多的控制(我们加载了很多其他的东西在我们的播放器中,因此我们需要以最佳方式优化体验)。
因此,AVFoundation
在 iOS10 中引入了使用以下方式控制带宽的能力:
AVPlayerItem *playerItem = [AVPlayerItem playerItemWithAsset:self.urlAsset];
playerItem.preferredForwardBufferDuration = 30.0;
playerItem.preferredPeakBitRate = 200000.0; // Remember this line
iOS11上也引入了一个配置,用 来设置item的最大分辨率preferredMaximumResolution
,所以我们正在使用它,但是我们仍然需要一个针对iOS10设备的解决方案。
好吧,现在我们可以控制了,preferredPeakBitRate
这很好,但是我们有一个问题,并非所有 HLS 源都是由我们生成的,所以假设我们要在未连接到 wifi 网络时设置最大分辨率为 480p ,今天我没有办法实现这一点,我并不总是能够知道所选的 480p 源需要多少带宽HLS playlist
。
我正在考虑的一件事是阅读m3u8
文件中的信息,至少知道我的播放器可以显示哪些不同质量的来源以及每个人需要多少带宽。
一种方法是,将m3u8
播放列表作为纯文本下载,使用正则表达式读取文件并处理这些数据,好吧,我试图避免这种情况,我认为这应该不那么困难。
我无法从曲目中读取此信息,因为 a) 我找不到信息,b) 更改质量时动态替换曲目,是的,每个质量级别都有 1 个曲目。
所以,我不知道我怎么能得到这个信息,我搜索了谷歌,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
我只想在我的代码中的数组上提供这些信息,如下所示:
NSArray<ZZMetadata *> *metadataArray = self.urlAsset.bandwidthMetadata;
NSLog(@"Metadata info: %@", metadataArray);
并打印如下内容:
<__NSArrayM 0x123456789> (
<ZZMetadata 0x234567890> {
trackId: 1
neededBandwidth: 314000
resolution: 228x128
codecs: ...
...
}
<ZZMetadata 0x345678901> {
trackId: 2
neededBandwidth: 478000
resolution: 400x224
}
...
}