Amazon Web Services ブログ

Amazon Kinesis Video Streams でレイテンシを削減する方法 – Part 2

この記事は How to reduce latency with Amazon Kinesis Video Streams – Part 2  の日本語訳です。

Amazon Kinesis Video Streams (KVS) で管理されるメディアのレイテンシを低減する方法についての Part 2 では、最適なレイテンシ設定のために KVS、メディアプロデューサー、メディアプレーヤーを設定するテクニックを説明します。その後、Amazon Kinesis Video Streams Web Viewer を紹介し、KVS で様々な実験を行い、様々な条件下で期待できるレイテンシの数値を検証します。

Part 1 では、ストリーミングメディアの基礎、KVS の操作、一般的なデザインパターン、KVS で管理するストリーミングメディアのレイテンシの主な要因について説明しました。

KVS ライブメディアのレイテンシ削減

KVS のストリーミングメディアのレイテンシを削減する最も効果的な手段は以下の通りです。

  • KVS が提供する HLS プレイリストの設定をライブメディア用に最適化する
  • KVS メディアプロデューサが設定するフラグメントの長さを短くする
  • メディアプレーヤーでサポートされている場合
    • メディアプレーヤーによるフラグメントバッファリングをプログラムによって削減する
    • メディアのライブエッジに常に追従できるよう、再生速度を x1 より少し上に設定する(例: x1.05 / x1.1)

低遅延のためにバッファとフラグメントの設定を調整することは、特にネットワークが不安定なときに、しばしばビデオの品質や再バッファリングとトレードオフになることに注意してください。適用した設定は、予想されるネットワーク条件の範囲内で徹底的にテストすることをお勧めします。

  • さまざまなネットワーク条件下で、低遅延で堅牢なライブビデオ品質を実現する方法
    • HLS メディアプレイリストに 5~10 個のフラグメントを指定する
    • フラグメント長を 1 秒にする
  • 遅延を徹底的にチューニングする場合 (ネットワークの品質および/またはメディアプレーヤーがサポートする場合)
    • HLS メディアプレイリストで 3 つのフラグメントを指定する
    • フラグメント長を 0.5 秒にする
    • ネットワーク品質に応じて、メディアプレーヤーのバッファーをプログラムにより 2~3 個のフラグメントに制限する
    • メディアの再生速度を x1 より少し上 (x1.05 / x1.1) に設定して、フラグメントがドロップした場合でもメディアのライブエッジに追従できるようにする (再バッファリングがより頻繁に発生する可能性があります)

参考: プロデューサーとプレーヤー間のレイテンシが高すぎる

KVS HLS プレイリストの設定をライブメディア用に最適化する

KVS Archived Media API は、以下の(簡略化した)シーケンスに示すように、HLS メディアプレイリストを要求し、メディアフラグメントにアクセスするための GetHLSStreamingSessionURL リクエストをサポートします。

図 1 – KVS リクエスト (HLS) プレイリスト URL 処理フロー

アプリケーションが KVS に HLS プレイリスト URL をリクエストする際、低遅延ストリーミングメディアに最適化するための様々な設定が利用可能です。以下の例は、KVS の GetHLSStreamingSessionURL API にリクエストを行い、リクエストされたストリームと設定に対応する HLS メディアプレイリストの URL を返すシンプルな python スクリプトです。

import boto3

KVS_STREAM_NAME = '[ENTER_KVS_STREAM_NAME]'
REGION = '[ENTER_AWS_REGION]'

#=====================================================
# Create the AWS Kinesis Video client
kvs = boto3.client("kinesisvideo", region_name=REGION)

#=====================================================
# Get the KVS endpoint for this stream
endpoint = kvs.get_data_endpoint(
APIName="GET_HLS_STREAMING_SESSION_URL",
StreamName=KVS_STREAM_NAME)['DataEndpoint']

print(f'\nKVS ENDPOINT: {endpoint}')

#=====================================================
# Get the KVS Archive media client
kvam = boto3.client("kinesis-video-archived-media", endpoint_url=endpoint, region_name=REGION)

# Get LIVE HLS URL
hls_playback_url = kvam.get_hls_streaming_session_url(
StreamName=KVS_STREAM_NAME,
PlaybackMode="LIVE",
MaxMediaPlaylistFragmentResults=3,
Expires=43200)['HLSStreamingSessionURL']

print(f'\nLIVE HLS_STREAMING_SESSION_URL: {hls_playback_url}\n')

このスクリプトの出力は、KVS ストリーム HLS マスタープレイリスト (.m3u8) ファイルの URL です。この URL は、Safari などのサポートするブラウザーにリンクとして直接渡したり、VLC などのデスクトップメディアプレーヤーに渡したりして、選択したパラメータで KVS メディアストリームを再生することができます。HLS URL は、KVS メディアへの時間制限付きアクセスを提供する SessionToken と共に返されるため、この URL の管理方法には注意が必要です。

上記のコードでは、特に 2 つのパラメータを考慮する必要があります。

  1. PlaybackModeLIVE に設定すると、HLS メディアプレイリストは、最新のフラグメントが利用可能になる度に、継続的に更新されます。この場合、通常、メディアプレーヤーにライブ通知が表示され、プレーヤーによっては、低遅延メディアに適した事前設定済みのフラグメントバッファ設定が選択されます。
  2. MaxMediaPlaylistFragmentResults: HLS メディアプレイリストに返されるフラグメントの最大数です。これを制限することで、メディアプレーヤーによるフラグメントバッファリングを制限し、レイテンシを低減することもできます。PlaybackModeLIVE である場合、この値まで最新のフラグメントが返されます。PlaybackModeON_DEMAND の場合、利用可能な最も古いフラグメントが、この最大数まで返されます。

したがって、遅延を短縮するには、KVS HLS プレイリスト URL を要求する際の PlaybackModeLIVE に設定し、低遅延かつ堅牢なメディアを実現するためには MaxMediaPlaylistFragmentResults を最低 3 に設定することが推奨されます。

KVS メディアプロデューサが設定するフラグメント長を削減する

メディアストリームのフラグメント長は、プロデューサーの初期バッファリングとフラグメント化時間、およびメディアプレーヤーのバッファリング時間を左右するため、レイテンシに影響を与えます。フラグメント長は KVS プロデューサーで設定され、KVS サービスを通じて保存されます。そして、プロデューサーが作成したフラグメント長が、メディアプレーヤーやコンシューマーで受信され、バッファリングされることになるわけです。以下は、KVS へのシンプルな GStreamer メディアパイプラインを使用したフラグメント長の設定方法の例です。

GStreamer KVS Pluginを使用する場合

以下の GStreamer パイプラインは、MacOS デバイス上でライブスクリーンキャプチャを実行し(avfvideosrc プラグイン)、生のビデオを H.264 フレームにエンコードし(vtenc_h264_hw プラグイン)、エンコードされたストリームをKVS に取り込む KvsSink プラグインに渡しています。この例では、カメラからの要求フレームレートとエンコーダのキーフレームインターバルがともに 20 FPS であるため、1 秒のフラグメントが生成されます。

gst-launch-1.0 avfvideosrc capture-screen=true \
! videoconvert \
! videoscale \
! video/x-raw,width=1280,height=720,framerate=20/1 \
! vtenc_h264_hw allow-frame-reordering=FALSE realtime=TRUE max-keyframe-interval=20 \
! h264parse \
! video/x-h264,stream-format=avc,alignment=au,profile=baseline \
! kvssink stream-name=$STREAM_NAME aws-region=$REGION access-key=$ACCESS_KEY secret-key=$SECRET_KEY retention-period=$RETENTION_HRS

フラグメント長を 0.5 秒に減らすには、max-keyframe-interval の値を調整して、キーフレーム間隔を 10 に調整します。キーフレーム間隔が 10 でフレームレートが 20 fps の場合、kvssink エレメントによって 0.5 秒のフラグメントが生成されます。この例では、カメラでサポートされていれば framerate 値を調整してフレームレートを 40 fps に上げることも有効ですが、メディアストリームのネットワーク帯域幅と KVS 利用コストに大きな影響を与えることになります。

KVS Producer ライブラリを使用する場合

KVS Producer ライブラリを使用する場合、開発者は、KVS に取り込まれるキーフレーム間隔とフレームレートを調整するためのプログラム的手段を使用して、フラグメントあたりのフレーム数とフラグメント長に対応します。

メディアプレーヤーのフラグメントバッファリングをプログラムで削減する

KVS メディアを消費するためのカスタムウェブアプリケーションやモバイルアプリケーションを開発する場合、一般的なメディアプレーヤーライブラリは、バッファリングするフラグメント数などの設定をプログラムで調整することをサポートしています。KVS を統合したウェブアプリケーションの例として、Amazon Kinesis Video Streams Web Viewer があります。これは AWS が提供するコードサンプルで、自分の AWS アカウントでホストして KVS メディアのテストと再生を行うことができます。

KVS Web Viewer デモアプリケーション:

図 2 – KVS Web Viewer アプリケーションのスクリーンショット

KVS Web Viewer は、HLS.js ライブラリを呼び出す react-player を使用して、KVS から配信されるような HLS ベースのメディアを再生します。KVS Web Viewer は、hlsConfigs.js ファイルで利用可能なすべてのプログラム設定を提供します。特に、hlsConfig.js のパラメータ liveSyncDurationCount と liveMaxLatencyDurationCount は、低遅延に最適化するためにデフォルト値より削減されています。

このサンプルを使用すると、HLS とバッファの設定をシンプルな設定ファイルで提供する KVS コンシューマウェブアプリケーションを、お使いの環境でテストおよび開発用にデプロイすることができます。

メディア再生速度を x1 よりもわずかに上に設定する

メディアプレーヤーは、しばしばストリーミングメディアのライブエッジよりも遅れ、ビデオの遅延を発生させます。これは、メディアのプロデューサとコンシューマ間のタイミングのずれや、メディアの再バッファリングやネットワークの不安定さによるロス時間が原因です。この影響は累積されるため、再生セッションの長さに比例し、メディアがライブ再生モードで実行される時間が長ければ長いほど、影響が大きくなります。したがって、これは、セキュリティカメラなどのように、メディアソースがライブモニタに恒久的に表示される場合に特に影響します。

メディアプレーヤーがライブエッジから遅れることによる遅延を低減する 1 つのテクニックは、メディア再生速度を x1 よりわずかに上に設定することです(メディアプレーヤーのサポートにより、x1.05 / 1.1など)。これにより、メディアプレーヤーは常にライブエッジを追い越そうとする「Catch-Up」モードとなります。これにより、メディアプレーヤーはライブエッジにできるだけ近づきますが、場合によっては、メディアが現在のフラグメントを追い越して、メディアプレーヤーが途切れ途切れになることがあります。このため、この手法を使用するのは、長時間稼働するメディアソースや常時監視するメディアソースに限られることをお勧めします。

KVS Web Viewer は、1.05 倍速と 1.1 倍速の両方の再生速度をサポートしていますので、お使いの環境で再生速度を上げるテクニックをテストするための手段としてご利用ください。

KVSのレイテンシの値の検証

このセクションでは、説明した KVS HLS 設定、フラグメント長で、グローバルネットワーク上で、カスタム KVS Web Viewer と Safari ウェブブラウザで KVS ストリームを直接表示した場合とで比較し、これらの特定の条件で達成できるレイテンシの値を検証していきます。

テストのセットアップ

このテストでは、上記の GStreamer パイプラインを使用して、MacOS デバイスから KVS にライブ画面を取り込みます。Mac の画面にはミリ秒精度のストップウォッチが表示され、同じ KVS ストリームが比較のために別のモニターで再生されます。このテストは、オーストラリアのメルボルンから AWS シドニーリージョンを使用して、900 km の物理的距離、つまり往復 1800 km で実行されています。

図 3 – KVSレイテンシテストのセットアップと距離

KVS を堅牢なビデオ品質のための推奨設定で利用した場合: 

HLS PlaybackMode: Live
HLS MaxMediaPlaylistFragmentResults: 7
フラグメント長: 1 秒

図 4 – 堅牢なビデオ品質の場合の KVS のレイテンシテストの結果

KVS Web Viewer を使用し、レイテンシを最適化したバッファ構成、堅牢なビデオ品質を実現する 1 秒のフラグメント長の推奨 KVS HLS 設定の場合、レイテンシは 1.95 秒と測定されました

同じテストを、Safari ウェブブラウザで直接 KVS HLS プレイリストの URL を再生して実行した場合、4.072 秒が測定されました。この違いは、Safari ブラウザがバッファリングするフラグメントの数を制御できないことと、ブラウザは通常、低遅延よりもメディア品質を優先するビデオオンデマンド用に調整されていることに起因しています。

そして、北部バージニアのリージョンで KVS Web Viewer のテストを再度行いましたが、オーストラリアのメルボルンから往復 30,000 km を超える距離を移動し、3.32 秒の遅延を計測しました。これは、距離がメディアの遅延に与える影響について、おおよその規模を表しています。これは、AWS Global Accelerator のようなサービスを利用することで、さらに短縮できる可能性があります。

KVSのレイテンシ最適化設定を使用した場合: 

HLS PlaybackMode: Live
HLS MaxMediaPlaylistFragmentResults: 5
フラグメント長: 0.5 秒

図 5 – レイテンシ最適化設定の場合の KVS レイテンシテスト結果

図 5 – レイテンシ最適化設定の場合の KVS レイテンシテスト結果

フラグメントの長さを 0.5 秒にすることで、エンドツーエンドのレイテンシは 1.412 秒になりました。これは、KVS Web Viewer を使用しており、バッファリングされるフラグメントの数をプログラムで設定できるため、メディアプレーヤーのバッファ設定に影響を与える MaxMediaPlaylistFragmentResults の値が主要因ではないことを示しています。

同じテストを Safari ウェブブラウザから直接 KVS メディアを再生した場合、遅延は 3.55 秒となりました

まとめ

Amazon Kinesis Video Streams で管理されるメディアのエンドツーエンドのレイテンシを低減する方法に関するこのシリーズでは、Part 1 で、ストリーミングメディアの基礎、KVS の操作と一般的なデザインパターン、最後に KVS のストリーミングメディアのレイテンシの主要因を学習しました。

Part 2 では、ストリーミングメディアの遅延を低減するための手段として、フラグメント長、メディアプレーヤーのバッファサイズ、および KVS API から HLS URL をリクエストする際に最適な HLS プレイリスト設定を選択する方法について学習しました。

続いて、Amazon KVS Web Viewer を使用して、堅牢なビデオ品質とレイテンシに最適化されたメディアストリームの推奨設定をテストしました。また、KVS Web Viewer と Safari ウェブブラウザで同じメディアストリームを直接表示した場合の比較も行いました。これらの結果では、地理的に近い AWS リージョンと遠い AWS リージョンで比較し、距離がメディアのレイテンシに与える影響も検証しています。

このテストを通じて、KVS が管理するメディアのレイテンシが、さまざまなネットワーク条件下で堅牢なビデオ品質を実現する設定を用いて 1.95 秒、レイテンシを最適化する設定を適用した場合は 1.412 秒になることを示すことができました。

著者について

Dean Colcott は、Amazon Web Services (AWS) のシニア IoT and Robotics スペシャリストソリューションアーキテクト で、Amazon Kinesis Video Streams の SME を務めています。分散アプリケーションとフルスタック開発、ビデオとメディア、ビデオ分析とコンピュータビジョン、産業用 IoT とエンタープライズデータプラットフォームに深い専門性を持っています。IoT、産業用データ、ビデオ、物理的資産が生成するデータから、企業データ戦略との関連性、価値、洞察を得ることにフォーカスしています。

この記事はソリューションアーキテクトの三平が翻訳しました。