2018-01-27

HLSの遅延をどう解消すべきか

近年、ライブ配信にHTTP Live Streaming(HLS)を使うサービスが増えてきました。


HLSの遅延をどう解消すべきか

近年、ライブ配信にHTTP Live Streaming(HLS)を使うサービスが増えてきました。

HLSは米Apple社が提案したストリーミングフォーマットで、現在はRFC 8216として標準化されています。

HLSはm3u8形式のインデックスファイル(プレイリスト)にメディアセグメントファイル(TSファイル)が記載されており、クライアント側はインデックスファイルに記載されている間隔(EXTINF)ごとにメディアセグメントファイルを再生するという至って単純な仕組みです。

以下は代表的なHLSのプレイリストの例です。

#EXTM3U
#EXT-X-VERSION:3
#EXT-X-MEDIA-SEQUENCE:1
#EXT-X-TARGETDURATION:6
#EXTINF:3.000000,
1.ts
#EXTINF:3.000000,
2.ts
#EXTINF:3.000000,
3.ts

この例では、最大間隔(EXT-X-TARGETDURATION)が6秒と指定されており、メディアセグメントファイルは3秒ごとに更新されていきます。

メディアによっては3秒以上になる場合もあるため、EXTINFは必ず同じ間隔になるとは限りません。そのため、EXT-X-TARGETDURATIONで最大値を指定します。

EXT-X-MEDIA-SEQUENCEは現在何番目のインデックスファイルかを示しています。


HLSが遅延する理由

HLSが遅延する最大の原因は再生バッファによるものです。

メディアソースからエンコードされたメディアセグメントファイルは再生バッファとしてインデックスファイルに次々と追加されていきます。

クライアントは一番上から再生を行いますが、メディアセグメントファイルの再生間隔によって、遅延はどんどん大きくなっていきます。

これを解消するには1つのインデックスファイルに載せるメディアセグメントファイルの数を減らすという方法やEXTINFを短くするという手段があります。

Appleによると、インデックスファイルには3つのメディアセグメントファイルを置くことが推奨されています。

また、EXTINFは短くしようと思えばいくらでも出来ますが、その代わりクライアント側の負荷が高くなるため、トレードオフになります。

より詳しいことはWowzaの人が記事にしているので読むことをオススメします。

https://www.wowza.com/blog/hls-latency-sucks-but-heres-how-to-fix-it

CMAF

Common Media Application Format | MPEG
_Timed Text and Other Visual Overlays in ISO Base Media File Format_mpeg.chiariglione.org

MPEGが現在提唱しているストリーミングフォーマットの新規格としてCMAF(Common Media Application Format)というものがあります。

これは、メディアセグメントファイルをさらにCMAF-Chunkに分割し、クライアント側にはHTTP Transfer Encoding: Chunkedとして配信することにより、小さなチャンクで分割された1つのメディアセグメントファイルを受信してからすぐにデコード・再生するため、遅延が小さくなります。

実際にはAkamaiやYouTube Liveの超低遅延モードで使われているようです。

これを使うことにより現在のHLSよりもより遅延を少なくすることが可能になります。

ただしAppleがサポートするかどうかはわからないので、今後に期待したいと思います。