Считывание информации о списке воспроизведения 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
}
...
} 

0 ответов

Другие вопросы по тегам