Low-Latency HLSを有効化する

以下の翻訳 developer.apple.com

概要

HTTP Live Streaming (HLS) プロトコルは、ライブおよびオンデマンドのコンテンツストリームを世界中の視聴者に配信します。HLSはこれまで、レイテンシーよりもストリームの信頼性を重視してきました。低遅延HLSは、プロトコルを拡張し、スケーラビリティを維持しながら低遅延のビデオストリーミングを可能にします。新しい低遅延モードでは、公共ネットワーク上でのビデオの遅延が、標準的なテレビ放送の範囲内にまで低減されます。

バックエンドの制作ツールやコンテンツ配信システムは、低遅延ストリームの再生を可能にするために、新しいルールを実装する必要があります。ローレイテンシーHLSは、これらの分野で新たな機能を提供します。

  • Partial Segmentsの生成
  • PlaylistのDelta Updates
  • プレイリストの再読み込みのブロック
  • Preload hints とメディアダウンロードのブロック
  • Rendition Reports

HLSの仕様では、draft-pantos-hls-rfc8216bis revision 7以降でLow-Latency extensionsが定義されています。

Partial Media Segmentsを生成する

低遅延HLSは、メディアプレイリストのライブエッジでメディアを配信するためのパラレルチャンネルを提供し、メディアをCMAFチャンクのようなより小さなファイルに多数分割します。これらの小さいファイルをHLSのパーシャルセグメントと呼びます。各パーシャルセグメントの再生時間は短いので、親セグメントよりもずっと早くパッケージ化して公開し、メディアプレイリストに追加することができます。通常のメディアセグメントは1つ6秒ですが、パーシャルセグメントの例では200ミリ秒です。最初の部分セグメントは、前のセグメントがパブリッシュされてからわずか200ミリ秒後にパブリッシュされ、続いて29個の同一セグメントがパブリッシュされ、最後に30個の部分セグメントを連結したものと同じメディアを含む通常の長さの6秒のメディアセグメントがパブリッシュされます。プレイリストの肥大化を抑制するため、サーバーは、ライブエッジからターゲットデュレーションが3つ以上経過したパーシャルセグメントをメディアプレイリストから削除します。

パーシャルセグメントをメディアプレイリストに追加するには、新しいEXT-X-PARTタグを使用します。親セグメントの境界には、他のメディアセグメントタグ(EXT-X-DISCONTINUITYなど)を配置できます。

パーシャルセグメントは、HLS仕様(3.1~3.5項)で規定されているSupported Media Segment Formatsのいずれかでなければなりません。

PlaylistのDelta Updatesを提供する

低遅延HLSでは、クライアントがプレイリストを頻繁に転送します。クライアントは、この転送コストを削減するために、プレイリストのデルタアップデートを要求し、サーバーはそれを提供することができます。これらのアップデートは、クライアントが既に持っているプレイリストのかなりの部分を、新しいEXT-X-SKIPタグで置き換えます。

パーシャルセグメントの詳細については、HLSの仕様書の6.2.5.1項を参照してください。

Block Playlist Reload

新しいメディアセグメントとパーシャルセグメントの効率的なクライアントへの通知をサポートするために、低遅延HLSはプレイリストのリロードリクエストをブロックする機能を導入しました。クライアントがメディアプレイリストの更新を要求するためにHTTP GETを発行する際、クライアントは配信指示子と呼ばれる特別なクエリパラメータを追加して、プレイリストの応答に将来のセグメントを含めることを指定できます。サーバーは、そのセグメントを含むプレイリストのバージョンが利用可能になるまで、リクエストを保留します(ブロック)。プレイリストのリロードをブロックすると、プレイリストのポーリングが不要になります。

プレイリストのリロードをブロックする機能の詳細は、HLS仕様書の6.2.5.2項を参照してください。

Preload Hints and Blocking of Media Downloads

低遅延のストリームをグローバルに配信する場合、不要なラウンドトリップをなくすことが重要です。サーバーは、新しいタグであるEXT-X-PRELOAD-HINTを使用して、パーシャルセグメントやメディア初期化セクションの予定をクライアントに通知します。クライアントは、ヒントとなるリソースに対して事前にGETリクエストを発行することができ、サーバーは、メディアが利用可能になるとすぐにリクエストに応答します。

プリロードヒントの詳細については、HLS仕様書の6.2.6項を参照してください。

Provide Rendition Reports

低遅延で再生する場合、ビットレート適応を行うためには、クライアントは最小限のラウンドトリップでレンディションを切り替えられる必要があります。これをサポートするために、サーバーはマスタープレイリスト内の他のレンディションに関するレンディションレポートを各メディアプレイリストに追加します。EXT-X-RENDITION-REPORTタグは、レンディションレポートを伝送し、そのレンディションのメディアプレイリストに含まれる最後のメディアシーケンス番号やパートなどの情報を提供します。

Rendition Report の詳細については、HLS 仕様書の 4.4.5.1.4 項を参照してください。

Add Low-Latency HLS Delivery Directives

HLSでは、プレイリストのGETリクエストのURLに追加できる特別なクエリパラメータであるDelivery Directivesが定義されています。これらの配信指示子には以下のものがあります。

  • _HLS_msn=<M>

メディアシーケンス番号が "M "以降のメディアセグメントがプレイリストに含まれるまで、サーバがリクエストを保留することを示します。_HLS_msnの詳細については、HLS仕様書の6.2.5.2項を参照してください。

  • _HLS_part=<N>

HLS_msnとの組み合わせで、プレイリストにメディアシーケンス番号M以降のパーシャルセグメントNが含まれるまで、サーバーがリクエストを保留することを示す。1つのセグメントの最初のPartial SegmentはHLS_part=0、2つ目はHLS_part=1、というようになります。また、HLS_partパラメータには、_HLS_msnパラメータが必要です。

  • _HLS_skip=YES|v2

プレイリストのデルタアップデートを要求します。プレイリストの前の部分がEXT-X-SKIPタグで置き換えられます。HLS_skipの詳細については、HLS仕様書の6.2.5.1項を参照してください。

New Media Playlist Tags for Low-Latency HLS

Low-Latency HLSに対応するため、以下のPlaylistタグが追加されました。

EXT-X-SERVER-CONTROL

EXT-X-SERVER-CONTROLタグは、サーバが「プレイリストの再読み込みの禁止」や「プレイリストの差分更新」などの機能をサポートしていることを示すためのものです。EXT-X-SERVER-CONTROLタグの詳細については、HLS仕様書の4.4.3.8項を参照してください。

EXT-X-PART-INF

EXT-X-PART-INFは、プレイリスト内のHLSパーシャルセグメントに関する情報を提供します。EXT-X-PART-INFタグの詳細については、HLS仕様書の4.4.3.7項を参照してください。

EXT-X-PART

EXT-X-PARTは、プレイリスト内のパーシャルセグメントを識別します。EXT-X-PARTタグの詳細については、HLS仕様書の4.4.4.9項を参照してください。

EXT-X-PRELOAD-HINT

EXT-X-PRELOAD-HINTタグは、プレゼンテーションの今後の部分を再生するために、リソースまたはリソースのバイト範囲が必要であることを示唆します。 ヒントとなったPartial Segmentが、最終的にEXT-X-PARTタグとしてプレイリストに表示される際には、以前のPartial Segmentとは異なる可能性があることに注意してください。不連続性シーケンス番号、メディア初期化セクション、暗号化構成などが異なる可能性があります。つまり、Partial Segmentの前には、前のParent Segmentの終わりを示すEXTINFタグと、EXT-X-DISCONTINUITY、EXT-X-MAP、EXT-X-KEYのいずれかのタグを付けることができます。

サーバーは、広告からの早期回収など、計画されたセグメンテーションが変更された場合には、以前にヒントとなったPartial Segmentを公開しないこともできます。

EXT-X-PARTタグの詳細については、HLS仕様書の4.4.5.1.3項を参照してください。

EXT-X-RENDITION-REPORT

EXT-X-RENDITION-REPORTは、関連するレンディションについて、それを含むプレイリストと同じくらい最新の情報を伝えます。EXT-X-RENDITION-REPORTタグの詳細については、HLS仕様書の4.4.5.1.4項を参照してください。

EXT-X-SKIP

サーバがプレイリストデルタアップデートを発行する際には、スキップバウンダリより前のメディアセグメン トとそれに関連するタグを EXT-X-SKIP タグで置き換えます。EXT-X-SKIPタグの詳細については、HLS仕様書のセクション4.4.5.1.2および6.2.5.1を参照してください。

Low-Latency Server Configuration Profileへの対応

メディアのタイムリーな配信をサポートするために、低遅延HLSでは、通常のHLSで必要とされる以上の特定のトランスポート機能が必要となります。これらの要件は、低遅延サーバー構成プロファイルで定義されています。低遅延HLSの構文は、既存のHLSとの下位互換性があるため、クライアントは、サーバが必要な構成の一部をサポートしていないことが判明した場合、通常の遅延HLSの再生にフォールバックします。HLS仕様では、Appendix Bで低遅延サーバ構成プロファイルを定義しています。

Expect Delivery from CDN Tune-In

低遅延HLSのプレーヤーは、CDNやその他のHTTPキャッシュを介した低遅延ストリームの配信を期待する必要があります。低遅延で再生を開始するためには、クライアントはまず、メディアプレイリストの適度な最新版を取得する必要があります。HLS仕様の付録Cには、HTTPキャッシュを通じて提供される最新のメディアプレイリストを取得するための効率的な方法が記載されています。

Example: Low-Latency HLS Playlist

#EXTM3U
# This Playlist is a response to: GET https://example.com/2M/waitForMSN.php?_HLS_msn=273&_HLS_part=2
#EXT-X-TARGETDURATION:4
#EXT-X-VERSION:6
#EXT-X-SERVER-CONTROL:CAN-BLOCK-RELOAD=YES,PART-HOLD-BACK=1.0,CAN-SKIP-UNTIL=12.0
#EXT-X-PART-INF:PART-TARGET=0.33334
#EXT-X-MEDIA-SEQUENCE:266
#EXT-X-PROGRAM-DATE-TIME:2019-02-14T02:13:36.106Z
#EXT-X-MAP:URI="init.mp4"
#EXTINF:4.00008,
fileSequence266.mp4
#EXTINF:4.00008,
fileSequence267.mp4
#EXTINF:4.00008,
fileSequence268.mp4
#EXTINF:4.00008,
fileSequence269.mp4
#EXTINF:4.00008,
fileSequence270.mp4
#EXT-X-PART:DURATION=0.33334,URI="filePart271.0.mp4"
#EXT-X-PART:DURATION=0.33334,URI="filePart271.1.mp4"
#EXT-X-PART:DURATION=0.33334,URI="filePart271.2.mp4"
#EXT-X-PART:DURATION=0.33334,URI="filePart271.3.mp4"
#EXT-X-PART:DURATION=0.33334,URI="filePart271.4.mp4",INDEPENDENT=YES
#EXT-X-PART:DURATION=0.33334,URI="filePart271.5.mp4"
#EXT-X-PART:DURATION=0.33334,URI="filePart271.6.mp4"
#EXT-X-PART:DURATION=0.33334,URI="filePart271.7.mp4"
#EXT-X-PART:DURATION=0.33334,URI="filePart271.8.mp4",INDEPENDENT=YES
#EXT-X-PART:DURATION=0.33334,URI="filePart271.9.mp4"
#EXT-X-PART:DURATION=0.33334,URI="filePart271.10.mp4"
#EXT-X-PART:DURATION=0.33334,URI="filePart271.11.mp4"
#EXTINF:4.00008,
fileSequence271.mp4
#EXT-X-PROGRAM-DATE-TIME:2019-02-14T02:14:00.106Z
#EXT-X-PART:DURATION=0.33334,URI="filePart272.a.mp4"
#EXT-X-PART:DURATION=0.33334,URI="filePart272.b.mp4"
#EXT-X-PART:DURATION=0.33334,URI="filePart272.c.mp4"
#EXT-X-PART:DURATION=0.33334,URI="filePart272.d.mp4"
#EXT-X-PART:DURATION=0.33334,URI="filePart272.e.mp4"
#EXT-X-PART:DURATION=0.33334,URI="filePart272.f.mp4",INDEPENDENT=YES
#EXT-X-PART:DURATION=0.33334,URI="filePart272.g.mp4"
#EXT-X-PART:DURATION=0.33334,URI="filePart272.h.mp4"
#EXT-X-PART:DURATION=0.33334,URI="filePart272.i.mp4"
#EXT-X-PART:DURATION=0.33334,URI="filePart272.j.mp4"
#EXT-X-PART:DURATION=0.33334,URI="filePart272.k.mp4"
#EXT-X-PART:DURATION=0.33334,URI="filePart272.l.mp4"
#EXTINF:4.00008,
fileSequence272.mp4
#EXT-X-PART:DURATION=0.33334,URI="filePart273.0.mp4",INDEPENDENT=YES
#EXT-X-PART:DURATION=0.33334,URI="filePart273.1.mp4"
#EXT-X-PART:DURATION=0.33334,URI="filePart273.2.mp4"
#EXT-X-PRELOAD-HINT:TYPE=PART,URI="filePart273.3.mp4"


#EXT-X-RENDITION-REPORT:URI="../1M/waitForMSN.php",LAST-MSN=273,LAST-PART=2
#EXT-X-RENDITION-REPORT:URI="../4M/waitForMSN.php",LAST-MSN=273,LAST-PART=1

Example: Playlist Delta Update

#EXTM3U
# Following the example above, this Playlist is a response to: GET https://example.com/2M/waitForMSN.php?_HLS_msn=273&_HLS_part=3 &_HLS_skip=YES
#EXT-X-TARGETDURATION:4
#EXT-X-VERSION:9
#EXT-X-SERVER-CONTROL:CAN-BLOCK-RELOAD=YES,PART-HOLD-BACK=1.0,CAN-SKIP-UNTIL=12.0
#EXT-X-PART-INF:PART-TARGET=0.33334
#EXT-X-MEDIA-SEQUENCE:266
#EXT-X-SKIP:SKIPPED-SEGMENTS=3
#EXTINF:4.00008,
fileSequence269.mp4
#EXTINF:4.00008,
fileSequence270.mp4
#EXT-X-PART:DURATION=0.33334,URI="filePart271.0.mp4"
#EXT-X-PART:DURATION=0.33334,URI="filePart271.1.mp4"
#EXT-X-PART:DURATION=0.33334,URI="filePart271.2.mp4"
#EXT-X-PART:DURATION=0.33334,URI="filePart271.3.mp4"
#EXT-X-PART:DURATION=0.33334,URI="filePart271.4.mp4",INDEPENDENT=YES
#EXT-X-PART:DURATION=0.33334,URI="filePart271.5.mp4"
#EXT-X-PART:DURATION=0.33334,URI="filePart271.6.mp4"
#EXT-X-PART:DURATION=0.33334,URI="filePart271.7.mp4"
#EXT-X-PART:DURATION=0.33334,URI="filePart271.8.mp4",INDEPENDENT=YES
#EXT-X-PART:DURATION=0.33334,URI="filePart271.9.mp4"
#EXT-X-PART:DURATION=0.33334,URI="filePart271.10.mp4"
#EXT-X-PART:DURATION=0.33334,URI="filePart271.11.mp4"
#EXTINF:4.00008,
fileSequence271.mp4
#EXT-X-PROGRAM-DATE-TIME:2019-02-14T02:14:00.106Z
#EXT-X-PART:DURATION=0.33334,URI="filePart272.a.mp4"
#EXT-X-PART:DURATION=0.33334,URI="filePart272.b.mp4"
#EXT-X-PART:DURATION=0.33334,URI="filePart272.c.mp4"
#EXT-X-PART:DURATION=0.33334,URI="filePart272.d.mp4"
#EXT-X-PART:DURATION=0.33334,URI="filePart272.e.mp4"
#EXT-X-PART:DURATION=0.33334,URI="filePart272.f.mp4",INDEPENDENT=YES
#EXT-X-PART:DURATION=0.33334,URI="filePart272.g.mp4"
#EXT-X-PART:DURATION=0.33334,URI="filePart272.h.mp4"
#EXT-X-PART:DURATION=0.33334,URI="filePart272.i.mp4"
#EXT-X-PART:DURATION=0.33334,URI="filePart272.j.mp4"
#EXT-X-PART:DURATION=0.33334,URI="filePart272.k.mp4"
#EXT-X-PART:DURATION=0.33334,URI="filePart272.l.mp4"
#EXTINF:4.00008,
fileSequence272.mp4
#EXT-X-PART:DURATION=0.33334,URI="filePart273.0.mp4",INDEPENDENT=YES
#EXT-X-PART:DURATION=0.33334,URI="filePart273.1.mp4"
#EXT-X-PART:DURATION=0.33334,URI="filePart273.2.mp4"
#EXT-X-PART:DURATION=0.33334,URI="filePart273.3.mp4"
#EXT-X-PRELOAD-HINT:TYPE=PART,URI="filePart273.4.mp4"


#EXT-X-RENDITION-REPORT:URI="../1M/waitForMSN.php",LAST-MSN=273,LAST-PART=3
#EXT-X-RENDITION-REPORT:URI="../4M/waitForMSN.php",LAST-MSN=273,LAST-PART=3

Example: Byterange-addressed Parts

# In these examples only the end of the Playlist is shown.
# This is Playlist update 1
#EXTINF:4.08,
fs270.mp4
#EXT-X-PART:DURATION=1.02,URI="fs271.mp4",BYTERANGE="20000@0"
#EXT-X-PART:DURATION=1.02,URI="fs271.mp4",BYTERANGE="23000@20000"
#EXT-X-PART:DURATION=1.02,URI="fs271.mp4",BYTERANGE="18000@43000"
#EXT-X-PRELOAD-HINT:TYPE=PART,URI="fs271.mp4",BYTERANGE-START=61000


# This is Playlist update 2
#EXTINF:4.08,
fs270.mp4
#EXT-X-PART:DURATION=1.02,URI="fs271.mp4",BYTERANGE="20000@0"
#EXT-X-PART:DURATION=1.02,URI="fs271.mp4",BYTERANGE="23000@20000"
#EXT-X-PART:DURATION=1.02,URI="fs271.mp4",BYTERANGE="18000@43000"
#EXT-X-PART:DURATION=1.02,URI="fs271.mp4",BYTERANGE="19000@61000"
#EXTINF:4.08,
fs271.mp4
#EXT-X-PRELOAD-HINT:TYPE=PART,URI="fs272.mp4",BYTERANGE-START=0


# This is Playlist update 3
#EXTINF:4.08,
fs270.mp4
#EXT-X-PART:DURATION=1.02,URI="fs271.mp4",BYTERANGE="20000@0"
#EXT-X-PART:DURATION=1.02,URI="fs271.mp4",BYTERANGE="23000@20000"
#EXT-X-PART:DURATION=1.02,URI="fs271.mp4",BYTERANGE="18000@43000"
#EXT-X-PART:DURATION=1.02,URI="fs271.mp4",BYTERANGE="19000@61000"
#EXTINF:4.08,
fs271.mp4
#EXT-X-PART:DURATION=1.02,URI="fs272.mp4",BYTERANGE="21000@0"
#EXT-X-PRELOAD-HINT:TYPE=PART,URI="fs272.mp4",BYTERANGE-START=21000

Revision History

Ref

datatracker.ietf.org