我正在开发视频应用,我们正在将常规mp4文件转换为HLS,我们必须做出更改的众多原因之一是我们对视频的带宽使用有更多的控制权(我们在我们的播放器中加载了很多其他内容,因此我们需要以最佳方式优化体验。
因此,AVFoundation
在iOS10中引入了使用以下方法控制带宽的能力:
AVPlayerItem *playerItem = [AVPlayerItem playerItemWithAsset:self.urlAsset];
playerItem.preferredForwardBufferDuration = 30.0;
playerItem.preferredPeakBitRate = 200000.0; // Remember this line
在iOS11上还引入了一个配置,用preferredMaximumResolution
设置项目的最大分辨率,所以我们正在使用它,但我们仍然需要iOS10设备的解决方案。
好吧,现在我们可以控制preferredPeakBitRate
很好了,但我们遇到了问题,并非所有的HLS来源都是由我们生成的,所以,让我们说我们想要当你没有连接到wifi网络时,设置最大分辨率为480p,今天我没有办法实现这一点,并不总是能够知道需要多少带宽。所选HLS playlist
的480p源。
我想到的一件事是阅读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
我只想在代码中的数组中提供这些信息,如下所示:
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
}
...
}