Считывание информации о списке воспроизведения HLS для динамического изменения prefferedBitRate элемента
Я работаю над видео-приложением, мы меняем обычные 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 генерируются нами, поэтому, скажем, мы хотим установить максимальное разрешение 480p, когда вы не подключены к сети Wi-Fi, сегодня у меня нет способа чтобы добиться этого, не всегда я смогу узнать, какой пропускной способности нужен источник 480p для выбранного HLS playlist
,
Одна вещь, о которой я думал, это прочитать информацию внутри m3u8
файл, чтобы, по крайней мере, знать, какие источники качества могут показать мой проигрыватель и сколько пропускной способности нужно каждому.
Один из способов сделать это - загрузить m3u8
плейлист в виде простого текста, используйте регулярные выражения для чтения файла и обработки этих данных, ну, я пытаюсь избежать этого, я думаю, что это должно быть гораздо проще.
Я не могу прочитать эту информацию из треков, потому что а) я не могу найти информацию, б) треки динамически заменяются при изменении качества, да, 1 трек для каждого уровня качества.
Итак, я не знаю, как я могу получить эту информацию, я искал в Google, stackru и не могу найти эту информацию, кто-нибудь может мне помочь?
Вот пример того, что я хочу сделать, у меня есть этот пример плейлиста:
#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
}
...
}