3

私はビデオ アプリに取り組んでいます。通常の mp4 ファイルから HLS に変更しています。変更を行う必要がある多くの理由の 1 つは、ビデオの帯域幅の使用をより詳細に制御できることです (他の多くのものをロードします)。そのため、エクスペリエンスを最適な方法で最適化する必要があります)。

そのためAVFoundation、iOS10 では、次を使用して帯域幅を制御する機能が導入されました。

AVPlayerItem *playerItem = [AVPlayerItem playerItemWithAsset:self.urlAsset];
playerItem.preferredForwardBufferDuration = 30.0;
playerItem.preferredPeakBitRate = 200000.0; // Remember this line

でアイテムの最大解像度を設定する設定も iOS11 で導入されたpreferredMaximumResolutionので、それを使用していますが、iOS10 デバイス向けのソリューションが必要です。

さて、これで制御できるようになりましたpreferredPeakBitRateが、問題があります。すべての HLS ソースが生成されたわけではないため、Wi-Fi ネットワークに接続していないときに最大解像度を 480p に設定したいとします。 、今日はそれを達成する方法がありません。選択しHLS playlistた .

私が考えていたことの 1 つは、m3u8ファイル内の情報を読み取って、少なくとも、プレーヤーが表示できるさまざまな品質のソースと、全員が必要とする帯域幅を知ることです。

これを行う1つの方法は、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
}
...
} 
4

0 に答える 0