WWDC Quick Look 💓 By SwiftGGTeam
HLS シームレス メディア移行

HLS シームレス メディア移行

元の動画を見る

#HLS シームレスなメディア移行

ハイライト

ギャップレス HLS 再生により、複数のプレイリストを連続再生シーケンスに接続できます。プレーヤーは、エンコード パラメーターの変更、タイムスタンプの調整、バッファーの調整を自動的に処理して、エピソードの連続再生、アルバムのシームレスな再生、スムーズなシーンの切り替えを実現します。

主要内容

ストリーミング メディア アプリケーションには、ユーザーが切り替えに気付かずに複数の独立したメディア リソースを連続的に再生できるようにするという、一般的だが難しい要件があります。ポッドキャスト アプリケーションはエピソードを自動的に再生する必要があり、音楽アプリケーションはアルバム トラックがシームレスに接続される必要があり、ビデオ プラットフォームは最初からメイン フィルム、最後までシームレスである必要があります。

従来のソリューションでは、各リソースは独立した AVPlayerItem で再生されます。切り替えるときは、古いプレーヤーを破棄して新しいプレーヤーを作成する必要があるため、必然的にラグが発生します。 WWDC2021 で導入されたギャップレス HLS 再生は、複数のプレイリストを連続再生シーケンスとして扱います。プレーヤーはタイムスタンプ マッピング、バッファ調整、エンコード パラメータの適応を自動的に処理し、切り替えプロセスはユーザーに対して完全に透過的です。

詳細

シームレスな切り替えの課題

メディアを切り替えるときの途切れは、複数のレベルで発生します。

  • デコーダの再初期化: エンコーディング パラメータの変更 (SDR から HDR、1080p から 4K) にはデコーダの再構成が必要です
  • バッファリング中断: 新しいリソースの最初のセグメントを再ダウンロードしてバッファリングする必要があります
  • 不連続なタイムスタンプ: さまざまなリソースの PTS/DTS が調整されていないため、プレーヤーは手動でジャンプを処理する必要があります
  • オーディオ形式の変更: サンプリング レートとチャンネル数が変更されると、オーディオ レンダリングが中断されます。

ギャップレス HLS のコアメカニズム

ギャップレス HLS 再生は、次のメカニズムを通じて上記の問題を解決します。

プレイリスト カスケード: メイン プレイリストが渡されましたEXT-X-STREAM-INFそれぞれが独立したリソース (ポッドキャスト エピソードや曲など) に対応する複数の子プレイリストを参照します。プレイヤーはカスケード全体を連続したタイムラインとして認識します。

タイムスタンプ マッピング: プレーヤーは、後続のリソースのタイムスタンプをグローバル タイムラインに自動的にマッピングします。最初の曲の長さは 180 秒で、2 番目の曲は 180 秒から計測を開始します。ユーザーがシークすると、連続した時間が見えます。

バッファ調整: 現在のリソースを再生するとき、プレーヤーは次のリソースの最初のセグメントを事前にバックグラウンドでバッファリングします。切り替えポイントに到達すると、新しいリソースの準備が整い、待つ必要はありません。

エンコーディング パラメーターの適応: エンコーディング パラメーターが変更されると (SDR から HDR への切り替えなど)、プレーヤーはバックグラウンドで新しいデコーダー パイプラインを事前初期化し、ハンドオーバーは即座に完了します。

HLS プレイリストの構造

ギャップレス再生を実装するためのプレイリスト構造の例:

#EXTM3U
#EXT-X-TARGETDURATION:6
#EXT-X-VERSION:6
#EXT-X-PLAYLIST-TYPE:VOD
#EXT-X-INDEPENDENT-SEGMENTS

# 第一首歌曲
#EXTINF:6.000,
song1_segment1.m4s
#EXTINF:6.000,
song1_segment2.m4s
#EXTINF:3.000,
song1_segment3.m4s

# 2曲目(シームレストランジション)
#EXT-X-DISCONTINUITY
#EXTINF:6.000,
song2_segment1.m4s
#EXTINF:6.000,
song2_segment2.m4s

EXT-X-DISCONTINUITYエンコード パラメータまたはコンテンツの変更をマークしますが、プレーヤーは内部タイムスタンプ マッピングを通じて連続性を保証します。

主要なタグ

EXT-X-GAP: プレイリスト内のプレースホルダー セグメントをマークします。特定の期間のコンテンツがまだ準備されていない場合、GAP セグメントはプレースホルダーとして使用されます。プレーヤーは、ここのコンテンツが欠落していることを認識していますが、エラーは報告せず、実際のコンテンツが到着したときに置き換えます (04:15)。

#EXT-X-GAP
#EXTINF:6.000,
gap.m4s

これは、ライブ ブロードキャストのシナリオで特に役立ちます。広告コンテンツがまだ決まっていない場合、GAP がプレースホルダーとして使用され、クリエイティブの準備ができたらシームレスに置き換えられます。

コーディングの一貫性要件:

  • スイッチポイントの I フレームは位置合わせされている必要があります
  • 同じコーデック プロファイルとレベルを使用する
  • タイムスタンプは連続している必要があり、そうでない場合はプレーヤーがタイムスタンプを正しくマッピングできます。
  • オーディオのサンプリング レートとチャンネル数は一貫したままです

AVFoundation API

プレーヤーはギャップレス再生を自動的に処理します。特別な API は必要ありません。スイッチング イベントをリッスンする必要があるアプリケーションの場合:

let player = AVPlayer(playerItem: item)

// 現在の再生アイテムの変化を監視する
player.observe(\.currentItem) { player, _ in
    // 新しいサブリソースに切り替える
}

// タイムラインの変更をリッスンします (ギャップのないシーケンスのグローバル時間)
let timeObserver = player.addPeriodicTimeObserver(
    forInterval: CMTime(seconds: 1, preferredTimescale: 1),
    queue: .main
) { time in
    // 時間はグローバルタイムライン上の位置です
}

シナリオの適用

ポッドキャスト エピソード ストリーミング: ユーザーが 1 つのエピソードを聞いた後、同じ再生速度とスリープ タイマー ステータスを維持しながら、次のエピソードが自動的に再生されます。

音楽アルバムの再生: アルバム内のトラック間に隙間がなく、CD の連続再生体験と一致します。

ビデオ シーンの切り替え: ドキュメンタリーでは、長編映画から情報クリップに切り替えたり、再び元に戻したりする際の移行はスムーズで、認識されません。

ライブ チャンネル切り替え: EPG タイムラインの連続性を維持しながら、リニア TV チャンネルを切り替えます。

重要ポイント

  1. 統一されたエンコーディング パラメーター: ギャップレス シーケンスに参加しているすべてのリソースは、同じエンコーディング プロファイル (解像度ラダー、コード レート、フレーム レート、GOP サイズ、コーデック プロファイル) を使用します。パラメータに一貫性がない場合、デコーダが再初期化され、遅延が発生します。

  2. I フレーム アライメントの切り替えポイント: 各リソースが切り替え境界に I フレームを持ち、タイムスタンプが連続していることを確認します。これには、コーディング段階でセグメンテーション戦略を計画する必要があります。

  3. EXT-X-GAP を使用して動的コンテンツを処理します: ライブ ブロードキャストまたは広告シナリオでは、プレーヤー エラーを回避するためにコンテンツの準備ができていないときに GAP セグメントを使用してスペースを占有します。コンテンツが到着すると、プレイリストが更新され、プレーヤーが自動的に置き換えられます。

  4. テストするときは音声の連続性に注意してください: 人間の耳は、画像のフレーム スキップに対する目よりも音声の不連続に対してはるかに敏感です。 0.5ms の音声の途切れを検出できるため、テスト中に専門の音声分析ツールを使用する必要があります。

  5. 事前バッファリング戦略: プレーヤーは次のリソースをバックグラウンドで自動的にバッファリングしますが、アプリケーションは調整できます。preferredForwardBufferDurationバッファリングの深さを制御して、ネットワークが不安定な場合に、より長いバッファリング保護を提供します。

関連セッション

コメント

GitHub Issues · utterances