ライブストリーミングの設定ガイドライン

Fastly はパブリックまたはプライベートクラウドのストレージなどにアーカイブまたは録画された HTTP ストリーミング用コンテンツをライブで配信することができます。ライブストリーミングの配信を行う場合は、以下のガイドラインに沿った VCL の設定をおすすめしています。不明な点については カスタマーサポートがお手伝いいたします。

シールドの有効化

オリジンサーバーに対し特定のシールド POP を指定しシールドを有効化 することで、Fastly ネットワーク内でのライブストリーミングの可用性をより高める事ができます。注目度の高いイベントなどのためにプライマリ、セカンダリのオリジンを設定している場合は、地理的に近いシールド POP をそれぞれのオリジンに設定して下さい。

動画マニフェストファイルとセグメントキャッシュの TTL 設定

HLS などでは、新しいセグメントが使用可能になるとビデオのマニフェストファイルが定期的に更新されます。マニフェストファイルの TTL は、ビデオセグメントの長さの半分以下 (例えば 5 秒のビデオセグメントの場合は通常 1 - 2 秒) に設定することをお勧めします。長時間の DVR やライブストリームから VOD へ変換する場合は、セグメントの TTL をシールド POP で長く、エッジ POP ではメモリから確実に配信されるよう短く (つまり3600秒以下) に設定します。

以下のVCL コードのサンプルを、動画マニフェストとセグメントに異なる TTL を設定する際の参考にしてください。このコードは VCL スニペットを使用してサービスに追加することも可能です。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
sub vcl_fetch {
#FASTLY fetch

  # Set 1s ttls for video manifest and 3600s ttls for segments of HTTP Streaming formats.
  # Microsoft Smooth Streaming format manifest and segments do not have file extensions.
  # Look for the keywords "Manifest" and "QualityLevel" to identify manifest and segment requests.
  if (req.url.ext ~ "m3u8|mpd" || req.url.path ~ "Manifest") {
    set beresp.ttl = 1s;
    return (deliver);
  }
  else {
    if (req.url.ext ~ "aac|dash|m4s|mp4|ts" || req.url.path ~ "QualityLevel") {
      set beresp.ttl = 3600s;
      return (deliver);
    }
  }

  return (deliver);
}

MIME タイプに応じてビデオマニフェストとセグメントを識別することも可能です。

エラーに対する TTL は短く設定

Fastly は、Cache-Controlオリジンからのヘッダーに基づきキャッシュ可能なオブジェクトの TTL を設定Cache-Controlするようにデフォルト設定されています。しかし、200や206以外の HTTP ステータスコードレスポンスに対しては、オリジンサーバーから ヘッダーは送信されるとは限りません。そのため Fastly は、オリジンに大量のリクエストが送信されることを防ぐために、デフォルトの TTL (通常 3600 秒) が設定されている僅かなステータスコードレスポンスのみをキャッシュします。キャッシュ対象外のステータスコードは、 beresp.cacheableフラグを true設定することでキャッシュさせることができます。

ライブストリームの場合は、ビデオセグメントが数秒ごとに追加されます。ライブストリームトランスコーダーの一般的な設定では、5秒毎にビデオセグメントを生成し、ビデオセグメントが使用可能になり次第マニフェストファイルが更新されるようになっています。ただし、ビデオプレイヤーがまだ使用可能でないセグメントへアクセスを行い、500や503といったエラーレスポンスが返却されることがしばしば発生します。このような場合は、ステータスコードレスポンスをキャッシュ可能にし、短い TTL を設定することで、オリジンに回復する時間 (1秒程度) を与えることができます。

以下の VCL コードのサンプルを設定の参考にしてください。このコードは VCL スニペットを使用して追加することが可能です。

1
2
3
4
5
6
7
8
9
10
11
12
sub vcl_fetch {
#FASTLY fetch

  # Set 1s ttl if origin response HTTP status code is anything other than 200 and 206
  if (!http_status_matches(beresp.status, "200,206")) {
    set beresp.ttl = 1s;
    set beresp.cacheable = true;
    return (deliver);
  }

  return (deliver);
}

ストリーミングミスの設定

ストリーミングミスを設定することで、Fastly サーバーがオリジンからコンテンツを取得する必要がある場合のクライアント (ビデオプレイヤー) でのストリームのダウンロード待ち時間を減らすことができます。ストリーミングミスは「チャンク」や「セグメント」と呼ばれるビデオとオーディオオブジェクトにのみ有効化すべきです。

ストリーミングミスを設定に以下の VCL コードのサンプルをご活用ください。このコードは VCL スニペットを使用してサービスに追加することも可能です。

1
2
3
4
5
6
7
8
9
10
11
12
sub vcl_fetch {
#FASTLY fetch

  # Enable Streaming Miss only for video or audio objects.
  # Below conditions checks for video or audio file extensions commonly used in
  # HTTP Streaming formats.
  if (req.url.ext ~ "aac|dash|m4s|mp4|ts") {
    set beresp.do_stream = true;
  }

  return (deliver);
}

自動 Gzip 圧縮の設定

マニフェストファイルの拡張子またはコンテンツタイプに基づいてマニフェストファイルの自動 Gzip 圧縮を設定する際、以下の表を参考にしてください。

HTTP ストリーミング形式 ファイル拡張子 content-type
Apple HLS m3u8 application/x-mpegurl、application/vnd.apple.mpegurl
MPEG-DASH mpd application/dash+xml
Adobe HDS f4m, bootstrap application/f4m (マニフェスト用)、application/octet-stream (bootstrap 用)
Microsoft HSS 該当なし application/vnd.ms-sstr+xml

CORS ヘッダーの設定

別ドメインでビデオやオーディオの再生を行う場合は、CORS ヘッダーを設定します。

高度な TCP の最適化

キャッシュサーバーとクライアント間の TCP 通信の最適化を行うことで、レスポンスタイムを向上し、ビデオの再生開始までの時間 (つまり最初のフレームまでの時間) や再バッファ率を下げることができます。ユーザーエクスペリエンスの向上のために、以下の TCP 設定をご検討ください (任意)。

client.socket.cwnd のデフォルト値の変更

TCP ソケットの初期輻射 (初期 CWND) を30に設定します。デフォルトは10です。 これを行うためには、VCL スニペットを使用して以下の VCL を追加します。

1
2
3
4
5
6
7
8
9
10
sub vcl_deliver {
#FASTLY deliver

  # increase init cwnd for only client requests
  if (!req.http.Fastly-FF && client.requests == 1) {
    set client.socket.cwnd = 30;
  }

  return(deliver);
}

試験的な BBR TCP 輻輳制御アルゴリズムの有効化

BBR TCP 輻輳制御アルゴリズムを有効化します。デフォルトで使用されている、レイテンシベースではなくパケットロスに基づくCUBIC TCP 輻輳制御アルゴリズムとは異なり、BBR は一時的なパケットロス時にも遅延をコントロールしながら帯域を最大化できるように設計されています。

BBR を適用するには、VCL スニペットを利用して以下のコードを追加して下さい。

1
2
3
4
5
6
7
8
9
10
sub vcl_deliver {
#FASTLY deliver

  # set congestion algorithm for client requests
  if (!req.http.Fastly-FF && client.requests == 1) {
    set client.socket.congestion_algorithm = "bbr";
  }

  return(deliver);
}

オリジンタイムアウトの設定

新しいライブ・ストリーミング・セグメントのタイムリーなダウンロードを可能にするため、適切なオリジンタイムアウト設定を行いましょう。例えば、ライブストリームのセグメントファイルが5秒の場合は、Origin Connect 値は1秒、First byte と Between bytes timeout は2秒に設定します。通常、これらの値は Fastly がクライアントのリクエストに適切なレスポンスを返却する前に、別のオリジン (設定されている場合) に対してリトライが行えるように設定します。

フェイルオーバー (フォールバック) オリジンの設定

エンコーダーの障害やリソースの高負荷などの問題に備えて、フェイルオーバーオリジンの設定をご検討ください。

リアルタイムログ配信の設定

ライブストリーム配信でのトラブルシューティングやデバッグに備えて、リアルタイムログストリーミングを設定し、vcl_log にて以下のような TCP 接続、キャッシュ、その他の処理時間に関する指標を記録することをお勧めします。 例えば、以下を含めることをご検討ください。

これらの指標は、ABR プレイバック中にビデオプレイヤーが品質レベルを切り替えた原因や、スループットの分析などに役に立ちます。

サロゲートキーによるパージの活用

Fastly の サロゲートキー機能を利用することで、ライブストリームにおけるすべてのセグメントファイルやマニフェストファイルを一度の API コールで Fastly ネットワーク上からパージすることができます。

ライブから VOD へのスムーズな変換

エンコーダーは通常、ライブストリームしたビデオを VOD 用に変換する際、別の動画マニフェストを生成します。VOD 用のマニフェストファイルがライブ用のマニフェストファイルと同じ URL を利用する場合、ライブ用のマニフェストファイルをパージするか、キャッシュが無効化される (通常短い TTL が設定されているため) まで待つ必要があります。ライブビデオが mp4 でアーカイブに保管される場合は、Fastly の OTFP サービス を利用して配信することをご検討下さい。

Back to Top