10.

M3U8 / HLS(.m3u8)とは|Apple のストリーミング配信プロトコル解説

編集
この記事の要点
  • HLS(HTTP Live Streaming)は Apple が 2009 年に発表したストリーミング配信プロトコルで、.m3u8 はそのテキストプレイリスト
  • 動画を数秒単位の .ts(または fMP4)セグメントに分割し、HTTP(CDN)経由で順番に配信する仕組み
  • 回線状況に応じて画質を動的に切り替える適応ビットレート配信(ABR)が肝。マスタープレイリスト + 各画質のメディアプレイリストの 2 段構成
  • プレイリストの先頭は必ず #EXTM3U、各セグメント前に #EXTINF:、終端は #EXT-X-ENDLIST。UTF-8 エンコード必須
  • iOS Safari がネイティブ対応、Chrome / Firefox / Edge は hls.js などの JS ライブラリ経由。CDN(Akamai / CloudFront / Fastly)で大規模配信

概要

HLS(HTTP Live Streaming)は、Apple が 2009 年に発表したストリーミング配信プロトコルで、.m3u8 はそのテキスト形式のプレイリストファイルです。M3U8 自体は M3U(MP3 プレイヤー時代のプレイリスト形式)の UTF-8 エンコード版で、拡張子の「8」は UTF-8 を意味します。HLS では M3U の構文を拡張し、配信制御用の独自ディレクティブ(#EXT-X- で始まるタグ)を多数追加して、本格的なストリーミングプロトコルとして仕立て直しました。

HLS の基本アイデアは「動画を数秒単位の細切れセグメントに分割し、ふつうの HTTP サーバから順番に配信する」というシンプルなものです。専用のストリーミングサーバ(RTMP、RTSP)が不要で、CDN(Akamai、CloudFront、Fastly など)が普通に使え、企業ファイアウォール越しでも HTTP のため通過しやすいというメリットがあります。

もう一つの中核機能が適応ビットレート配信(Adaptive Bitrate, ABR)です。一つの動画を 360p / 720p / 1080p / 4K と複数画質でエンコードしておき、視聴者の回線速度・端末性能に応じてプレイヤーが動的に画質を切り替えます。電車で電波が悪くなれば 360p に下げ、Wi-Fi に戻れば 1080p に戻る、という挙動を支える仕組みです。

2017 年に IETF で RFC 8216 として標準化され、iOS / iPadOS / tvOS では Safari と AVPlayer がネイティブで HLS を再生します。Android / PC ブラウザでは hls.js / Shaka Player などの JavaScript ライブラリ経由で再生されるのが一般的です。

内部構造

HLS の配信は通常 2 段階のプレイリスト構成を取ります。

マスタープレイリスト(Master Playlist):各画質バリアントへのリンクを束ねるトップレベルのプレイリスト。例:

#EXTM3U
#EXT-X-STREAM-INF:BANDWIDTH=800000,RESOLUTION=640x360
360p/index.m3u8
#EXT-X-STREAM-INF:BANDWIDTH=2400000,RESOLUTION=1280x720
720p/index.m3u8
#EXT-X-STREAM-INF:BANDWIDTH=5000000,RESOLUTION=1920x1080
1080p/index.m3u8

メディアプレイリスト(Media Playlist):個別画質のセグメント一覧。例:

#EXTM3U
#EXT-X-VERSION:3
#EXT-X-TARGETDURATION:6
#EXT-X-MEDIA-SEQUENCE:0
#EXTINF:6.000,
seg0.ts
#EXTINF:6.000,
seg1.ts
#EXTINF:6.000,
seg2.ts
#EXT-X-ENDLIST

主要なタグ:

  • #EXTM3U:M3U プレイリスト宣言(必須、1 行目)
  • #EXT-X-VERSION:HLS バージョン
  • #EXT-X-TARGETDURATION:セグメントの最大長(秒)
  • #EXT-X-MEDIA-SEQUENCE:セグメント連番開始番号(ライブで重要)
  • #EXTINF:個々のセグメントの長さ
  • #EXT-X-STREAM-INF:マスタープレイリストでバリアント情報を示す
  • #EXT-X-ENDLIST:オンデマンド配信での終端マーカー(ライブでは付けない)
  • #EXT-X-KEY:AES-128 暗号化キー指定(DRM/コンテンツ保護)
  • #EXT-X-DISCONTINUITY:セグメント間の不連続(CM 挿入等)

セグメントは元々 MPEG-TS(.ts)が標準でしたが、現在は fMP4(fragmented MP4、.m4s)も使え、DASH との共通化が進んでいます。

主な用途

  • 動画配信サービス:Apple TV+、Disney+、Hulu、ABEMA、TVer など多くの OTT サービスが HLS で配信
  • ライブ配信:YouTube Live、Twitch のバックアップ、スポーツ中継、ニュース配信
  • iOS / Apple TV:HLS が公式推奨。AppStore 審査では 10 分以上の動画は HLS 配信が必須要件
  • 企業ウェビナー:Zoom ウェビナー、Microsoft Stream の動画配信
  • CDN 配信:CloudFront、Akamai、Fastly、Cloudflare Stream が HLS をネイティブサポート
  • 監視カメラ:ネットワークカメラの Web 配信
  • 音声配信:音声のみの HLS でラジオ配信、ポッドキャストの一部

関連形式との比較

vs MPEG-DASH:DASH は MPEG が ISO/IEC 23009-1 として 2012 年に標準化した競合プロトコル。XML 形式の MPD マニフェストを使う点が m3u8 との大きな違い。両者は機能的にほぼ同等で、現在は CMAF(Common Media Application Format)で同じ fMP4 セグメントを使えるよう統一が進んでいます。

vs RTMP:RTMP は Flash 時代のリアルタイムプロトコル。低遅延だが Flash 終焉で配信端では衰退、収録端(OBS → サーバ)でのみ生き残っています。HLS は配信端、RTMP は収録端という棲み分けが定着しました。

vs Progressive MP4:単一の MP4 ファイルを HTTP で配信する方式。シンプルだが画質切り替えができない。小規模配信向け。

vs Low-Latency HLS(LL-HLS):従来の HLS は遅延が 10〜30 秒あったため、Apple は 2020 年に LL-HLS を発表。部分セグメント(partial segment)と HTTP/2 push を使って 2 秒程度まで遅延を縮めます。

編集・再生ツール

セグメント生成:ffmpeg(ffmpeg -i in.mp4 -c copy -hls_time 6 -hls_playlist_type vod out.m3u8)、Bento4、Shaka Packager、AWS Elemental MediaConvert。

ライブ配信:OBS Studio + Nginx-RTMP + HLS、AWS Elemental MediaLive、Wowza Streaming Engine。

再生:iOS Safari / AVPlayer(ネイティブ)、Chrome / Firefox / Edge は hls.js または Shaka Player、Video.js、JW Player、THEOplayer などのプレイヤー経由。VLC、mpv、IINA はネイティブ対応。

検証ツール:Apple の Media Stream Validator(mediastreamvalidator コマンド)、ffprobe、hls-analyzer。

注意点

遅延:標準 HLS は構造上 10〜30 秒の遅延が発生します。スポーツ中継のリアルタイム性が求められる用途では LL-HLS や WebRTC を検討してください。

セグメント長:セグメントが長いほど効率は良いが、遅延が増え画質切り替え応答が鈍る。一般に 4〜6 秒、低遅延構成では 2 秒、LL-HLS の部分セグメントでは 0.3 秒程度。

CORS 設定:ブラウザで hls.js を使う場合、セグメント・プレイリスト両方に適切な CORS ヘッダ(Access-Control-Allow-Origin)が必要です。

UTF-8 BOM:仕様上 BOM は禁止。BOM 付きで保存するとプレイヤーが #EXTM3U を認識せず再生に失敗します。

パスの相対参照:プレイリスト内のセグメント URI はプレイリストファイルの位置を基準とする相対パス、または絶対 URI。CDN で配信する際にパス設計を間違えると 404 連発になります。

DRM:強い著作権保護には FairPlay Streaming(Apple)や Widevine(Google)+ DASH の併用が必要。AES-128 のみでは商用配信のセキュリティ要件を満たしません。

ライブとオンデマンドの区別:ライブでは #EXT-X-ENDLIST を付けず、定期的にプレイリストを更新します。オンデマンドでは #EXT-X-ENDLIST で終端を明示します。

関連リンク

編集
Post Share
子ページ

子ページはありません

同階層のページ
  1. MP3(.mp3)
  2. WAV(.wav)
  3. FLAC(.flac)
  4. AAC(.aac / .m4a)
  5. MP4(.mp4 / .m4v)
  6. MOV(.mov)
  7. WebM(.webm)
  8. MKV(.mkv)
  9. Opus(.opus)
  10. M3U8 / HLS(.m3u8)

最近更新/作成されたページ