私はビデオ アプリに取り組んでいます。通常の 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
}
...
}