Kinesis Video Streams のトラブルシューティング - Amazon Kinesis Video Streams

「翻訳は機械翻訳により提供されています。提供された翻訳内容と英語版の間で齟齬、不一致または矛盾がある場合、英語版が優先します。」

Kinesis Video Streams のトラブルシューティング

次の情報を使用して、Amazon Kinesis Video Streams で発生する一般的な問題をトラブルシューティングします。

一般的な問題のトラブルシューティング

このセクションでは、Kinesis Video Streams を操作するときに発生する可能性がある一般的な問題について説明します。

レイテンシーが高すぎる

レイテンシーは、Kinesis Video Streams サービスに送信されるフラグメント継続時間が原因で発生する場合があります。プロデューサーとサービスの間のレイテンシーを減らす方法の 1 つとして、より短いフラグメント継続時間を作成するようにメディアパイプラインを設定します。

各フラグメントに送信されるフレームの数を減らし、各フラグメントの時間を減らすには、kinesis_video_gstreamer_sample_app.cpp の次の値を減らします。

g_object_set(G_OBJECT (data.encoder), "bframes", 0, "key-int-max", 45, "bitrate", 512, NULL);
注記

Mozilla Firefox ブラウザではビデオレンダリングを内部実装しているため、レイテンシーが高くなります。

API の問題のトラブルシューティング

このセクションでは、Kinesis Video Streams を操作するときに発生する可能性がある API の問題について説明します。

エラー:「未知のオプション」

GetMediaGetMediaForFragmentList は、次のエラーで失敗する場合があります。

Unknown options: <filename>.mkv

このエラーは、AWS CLI​ で output​ タイプを json​ に設定した場合に発生します。AWS CLI​ をデフォルトの出力タイプ (none) で再設定します。AWS CLI の設定については、AWS CLI Command Referenceの「設定」を参照してください。

エラー: "承認するサービス/オペレーション名を特定できませんでした"

GetMedia は、次のエラーで失敗する場合があります。

Unable to determine service/operation name to be authorized

このエラーが発生する可能性があるのは、エンドポイントが適切に指定されていない場合です。エンドポイントを取得するときに、呼び出す API に応じて、必ず次のパラメータを GetDataEndpoint の呼び出しに含めます。

--api-name GET_MEDIA --api-name PUT_MEDIA --api-name GET_MEDIA_FOR_FRAGMENT_LIST --api-name LIST_FRAGMENTS

エラー: "ストリームにフレームを配置できませんでした"

PutMedia は、次のエラーで失敗する場合があります。

Failed to put a frame in the stream

このエラーが発生する可能性があるのは、サービスで接続またはアクセス許可が利用できない場合です。AWS CLI で以下を実行し、ストリーム情報を取得できることを確認します。

aws kinesisvideo describe-stream --stream-name StreamName --endpoint https://ServiceEndpoint.kinesisvideo.region.amazonaws.com

呼び出しが失敗した場合、詳細については「AWS CLI エラーのトラブルシューティング」を参照してください。

エラー: "最終 AckEvent が受信される前に、サービスによって接続が終了されました"

PutMedia は、次のエラーで失敗する場合があります。

com.amazonaws.SdkClientException: Service closed connection before final AckEvent was received

このエラーが発生する可能性があるのは、PushbackInputStream が不適切に実装されている場合です。unread() メソッドが正しく実装されていることを確認します。

エラー: 「STATUS_STORE_OUT_OF_MEMORY」

PutMedia は、次のエラーで失敗する場合があります。

The content store is out of memory.

コンテンツストアに十分なサイズが割り当てられていない場合、このエラーが発生します。コンテンツストアのサイズを増やすには、StorageInfo.storageSize の値を増やします。詳細については、「StorageInfo」を参照してください。

HLS の問題のトラブルシューティング

このセクションでは、Kinesis Video Streams で HTTP Live Streaming (HLS) を使用するときに発生する可能性がある問題について説明します。

HLS ストリーミングセッション URL の取得は成功するが、ビデオプレーヤーで再生が失敗する

この状況が発生するのは、HLS ストリーミングセッション URL は GetHLSStreamingSessionURL を使用して正常に取得できるが、この URL をビデオプレーヤーに指定したときに動画が再生されない場合です。

この状況のトラブルシューティングを行うには、以下を試します。

  • Kinesis Video Streams コンソールで動画ストリームが再生されるかどうかを確認します。コンソールに表示されたエラーを検討します。

  • フラグメント継続時間が 1 秒未満の場合は、1 秒に増やします。フラグメント継続時間が短すぎると、動画フラグメントに対するリクエスト回数が多すぎて、サービスでプレーヤーがスロットイングされることがあります。

  • 各 HLS ストリーミングセッション URL を 1 つのプレーヤーでのみ使用していることを確認します。1 つの HLS ストリーミングセッション URL を複数のプレーヤーで使用している場合、サービスが受け取るリクエストが多すぎて、プレーヤーがスロットリングされることがあります。

  • HLS ストリーミングセッションに指定するすべてのオプションがプレーヤーでサポートされていることを確認します。以下のパラメータでさまざまな値の組み合わせを試します。

    • ContainerFormat

    • PlaybackMode

    • FragmentSelectorType

    • DiscontinuityMode

    • MaxMediaPlaylistFragmentResults

    通常、一部のメディアプレーヤー (HTML5 やモバイルプレイヤーなど) は、fMP4 コンテナ形式の HLS のみをサポートします。その他のメディアプレーヤー (Flash やカスタムプレーヤーなど) は MPEG TS コンテナ形式の HLS のみをサポートする場合があります。トラブルシューティングを開始するには、最初に ContainerFormat パラメータを試してみることをお勧めします。

  • 各フラグメントに一貫した数のトラックがあることを確認します。ストリーム内のフラグメントが、オーディオおよびビデオトラックの両方がある場合と、ビデオトラックのみがある場合とで変わらないことを確認します。また、エンコーダー設定 (解像度、フレームレートなど) が、各トラックのフラグメント間で変わらないことも確認します。

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

この状況が発生するのは、動画をキャプチャした時点から動画プレーヤーで再生した時点までのレイテンシーが高すぎる場合です。

動画は HLS を介してフラグメント単位で再生されます。そのため、レイテンシーをフラグメント継続時間未満にすることはできません。レイテンシーには、データのバッファリングと転送の所要時間も含まれます。ソリューションで 1 秒未満のレイテンシーが必要な場合は、代わりに GetMedia API を使用することを検討してください。

以下のパラメータを調整してレイテンシー全体を短縮できますが、それに伴って画質が低下したり、再バッファリング率が高くなったりする場合があります。

  • フラグメント継続時間: フラグメント継続時間は、ストリームの区分間における動画の量であり、動画エンコーダーで生成されるキーフレームの頻度で制御されます。推奨される値は 1 秒です。フラグメント継続時間が短いほど、動画データをサービスに転送する前にフラグメントが完了するまで待機する時間が少なくなります。また、フラグメントが短いほど、サービスでの処理が高速になります。ただし、フラグメント継続時間が短すぎると、プレーヤーでコンテンツが不足するため、停止してコンテンツをバッファリングしなければならない確率が高くなります。フラグメント継続時間が 500 ミリ秒未満の場合、プロデューサーで作成されるリクエストが多すぎて、サービスでスロットリングされることがあります。

  • ビットレート: 動画ストリームのビットレートが低いほど、読み取り、書き込み、および転送にかかる時間は短くなります。ただし、通常、動画ストリームのビットレートが低いほど、画質は低下します。

  • メディアプレイリストのフラグメント数: レイテンシーの影響を受けやすいプレーヤーは、メディアプレイリストから最新のフラグメントだけをロードします。ほとんどのプレーヤーは、逆に最も古いフラグメントから開始します。プレイリスト内のフラグメント数を減らすことで、古いフラグメントと新しいフラグメントとの分離時間が短縮されます。プレイリストのサイズが小さいほど、プレイリストへの新しいフラグメントの追加が遅れたり、プレーヤーでの更新されたプレイリストの取得が遅れたりした場合に、フラグメントが再生中にスキップされる可能性が高くなります。フラグメント数は 3〜5 個とし、プレイリストから最新のフラグメントのみをロードするように設定したプレーヤーを使用することをお勧めします。

  • プレーヤーのバッファサイズ: ほとんどの動画プレーヤーでは最小バッファ期間 (通常はデフォルトの 10 秒) を設定できます。最も低いレイテンシーの場合、この値は 0 秒に設定できます。ただし、この場合、フラグメントの生成が遅れると、プレーヤーには遅延を吸収するバッファがないため、プレーヤーは再バッファリングすることになります。

  • プレーヤーの「キャッチアップ」: 通常、動画プレーヤーは、バッファが満杯になった場合 (遅延したフラグメントのためにフラグメントのバックログを再生する場合など)、自動的に動画バッファの先頭まで再生をキャッチアップさせることはありません。カスタムプレーヤーでは、これを避けるためにフレームをドロップするか、再生スピードを速くして (1.1 倍など)、バッファの先頭までキャッチアップできます。プレーヤーのキャッチアップに伴って、再生が途切れたり、速度が増したりします。また、バッファサイズが短いと、再バッファリングの回数が増える場合があります。

Java の問題のトラブルシューティング

このセクションでは、Kinesis Video Streams を操作するときに発生する一般的な Java の問題のトラブルシューティング方法について説明します。

Java ログの有効化

Java サンプルおよびライブラリの問題をトラブルシューティングするには、デバッグログを有効にして確認すると便利です。デバッグログを有効にするには、次の操作を行います。

  1. log4jpom.xml ノードの dependencies ファイルに追加します。

    <dependency> <groupId>log4j</groupId> <artifactId>log4j</artifactId> <version>1.2.17</version> </dependency>
  2. target/classes ディレクトリで、次の内容で log4j.properties というファイルを作成します。

    # Root logger option log4j.rootLogger=DEBUG, stdout # Redirect log messages to console log4j.appender.stdout=org.apache.log4j.ConsoleAppender log4j.appender.stdout.Target=System.out log4j.appender.stdout.layout=org.apache.log4j.PatternLayout log4j.appender.stdout.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss} %-5p %c{1}:%L - %m%n log4j.logger.org.apache.http.wire=DEBUG

デバッグログが、IDE コンソールに出力されます。

プロデューサーライブラリの問題のトラブルシューティング

このセクションでは、プロデューサーライブラリ を使用するときに発生する可能性がある問題について説明します。

問題点

プロデューサー SDK をコンパイルできない

パスに必要なライブラリがあることを確認します。これを確認するには、次のコマンドを使用します。

$ env | grep LD_LIBRARY_PATH LD_LIBRARY_PATH=/home/local/awslabs/amazon-kinesis-video-streams-producer-sdk-cpp/kinesis-video-native-build/downloads/local/lib

ビデオストリームはコンソールには表示されません。

コンソールで動画ストリームを表示するには、H.264 を使用して AvCC 形式でエンコードする必要があります。ストリームが表示されない場合は、以下の点を確認してください。

  • 元のストリームが Annex-B 形式である場合、NAL 適応フラグNAL_ADAPTATION_ANNEXB_NALS | NAL_ADAPTATION_ANNEXB_CPD_NALS に設定されている。これは StreamDefinition コンストラクタのデフォルト値です。

  • コーデックのプライベートデータを正しく提供しています。H.264 では、これはシーケンスパラメータセット (SPS) とピクチャパラメータセット (PPS) です。メディアソースに応じて、このデータはメディアソースから個別に取得されるか、フレームにエンコードされています。

    多くの基本ストリームの形式は次のとおりです。ここで、Ab は Annex-B の開始コード (001 または 0001) です。

    Ab(Sps)Ab(Pps)Ab(I-frame)Ab(P/B-frame) Ab(P/B-frame)…. Ab(Sps)Ab(Pps)Ab(I-frame)Ab(P/B-frame) Ab(P/B-frame)

    CPD (Codec Private Data) は、H.264 ではストリーム内の SPS および PPS であり、AvCC 形式に適応させることができます。メディアパイプラインから個別に CPD が提供される場合を除き、アプリケーションは最初の Idr フレーム (SPS/PPS が含まれている) を探してフレームから CPD を抽出し、2 つの NALU [Ab(Sps)Ab(Pps)] を抽出して StreamDefinition で CPD に設定できます。

エラー: GStreamer デモアプリケーションを使用したデータのストリーミング時の "リクエストに含まれているセキュリティトークンが無効です"

このエラーが発生した場合は、認証情報に問題があります。以下について確認してください。

  • 一時的なセキュリティ認証情報を使用している場合は、セッショントークンを指定する必要があります。

  • 一時的な認証情報が失効していないことを確認します。

  • 適切な権限が設定されていることを確認します。

  • macOS では、Keychain にキャッシュされた認証情報がないことを確認します。

エラー: 「Kinesis Video クライアントにフレームを送信できませんでした」

このエラーが発生した場合、タイムスタンプはソースストリームに正しく設定されません。次の操作を試してください。

  • この問題を解決する最新の SDK サンプルを使用してください。

  • 高品質のストリームをより高いビットレートに設定し、カメラがソースストリーム内のジッタをサポートする場合は、そのジッタを修正します。

GStreamer アプリケーションが、OS X で "ストリーミングが中止されました。ネゴシエーションされていないという理由です" というメッセージで停止する

OS X では、ストリーミングが停止し、次のメッセージが表示される場合があります。

Debugging information: gstbasesrc.c(2939): void gst_base_src_loop(GstPad *) (): /GstPipeline:test-pipeline/GstAutoVideoSrc:source/GstAVFVideoSrc:source-actual-src-avfvide: streaming stopped, reason not-negotiated (-4)

この回避策として、kinesis_video_gstreamer_sample_app.cppgst_caps_new_simple の呼び出しからフレームレートパラメータを削除します。

GstCaps *h264_caps = gst_caps_new_simple("video/x-h264", "profile", G_TYPE_STRING, "baseline", "stream-format", G_TYPE_STRING, "avc", "alignment", G_TYPE_STRING, "au", "width", GST_TYPE_INT_RANGE, 320, 1920, "height", GST_TYPE_INT_RANGE, 240, 1080, "framerate", GST_TYPE_FRACTION_RANGE, 0, 1, 30, 1, NULL);

エラー: Raspberry Pi の GStreamer デモで Kinesis ビデオクライアントを作成するときの "ヒープを割り当てできませんでした"

GStreamer サンプルアプリケーションは、512 MB の RAM を割り当てようとしますが、これがシステムで使用できない場合があります。KinesisVideoProducer.cpp で次の値を減らすことによって、この割り当てを減らすことができます。

device_info.storageInfo.storageSize = 512 * 1024 * 1024;

エラー: Raspberry Pi での GStreamer デモの実行時の "無効な命令"

GStreamer デモを実行するときに、次のエラーが発生した場合は、正しいバージョンのデバイスに対してアプリケーションをコンパイルしたことを確認します(たとえば、Raspberry Pi 2 で実行しているときに、Raspberry Pi 3 に対してコンパイルしていないことを確認します)。

INFO - Initializing curl. Illegal instruction

カメラで Raspberry Pi のロードに失敗する

カメラがロード済みかどうか確認するには、次のコマンドを実行します。

$ ls /dev/video*

何も見つからない場合は、次のコマンドを実行します。

$ vcgencmd get_camera

出力は次の例のようになります:

supported=1 detected=1

ドライバでカメラが検出されない場合は、次のコマンドを実行します。

  1. 物理的なカメラの設定を確認し、適切に接続されていることを確認します。

  2. 以下を実行してファームウェアをアップグレードします。

    $ sudo rpi-update
  3. デバイスを再起動します。

  4. 以下を実行してドライバをロードします。

    $ sudo modprobe bcm2835-v4l2
  5. カメラが検出されたことを確認します。

    $ ls /dev/video*

カメラが macOS High Sierra で見つからない

macOS High Sierra で複数のカメラが利用できる場合、デモアプリケーションはカメラを見つけることができません。

macOS High Sierra でコンパイルするときに、jni.h ファイルが見つかりません

このエラーを解決するには、Xcode のインストールを最新バージョンに更新してください。

GStreamer デモアプリケーションを実行中の Curl エラー

エラーを解決するには、GStreamer デモアプリケーションを実行するとき、この証明書ファイル/etc/ssl/cert.pem にコピーします。

Raspberry Pi での実行時のタイムスタンプ/範囲アサーション

実行時にタイムスタンプの範囲アサーションが発生した場合は、ファームウェアを更新し、デバイスを再起動します。

$ sudo rpi-update $ sudo reboot

Raspberry Pi の gst_value_set_fraction_range_full でのアサーション

uv4l サービスが実行中の場合は、次のアサーションが表示されます。

gst_util_fraction_compare (numerator_start, denominator_start, numerator_end, denominator_end) < 0' failed

これが発生した場合は、uv4l サービスを停止し、アプリケーションを再起動します。

Android での STATUS_MKV_INVALID_ANNEXB_NALU_IN_FRAME_DATA(0x3200000d) エラー

メディア・ストリームの NAL 適応フラグ が間違っている場合、次のエラーが表示されます。​

putKinesisVideoFrame(): Failed to put a frame with status code 0x3200000d

このエラーが発生した場合は、メディアの .withNalAdaptationFlags フラグを正しく入力します (例 : NAL_ADAPTATION_ANNEXB_CPD_NALS)。このフラグを Android プロデューサーライブラリ​ の次の行に入力します。

https://github.com/awslabs/aws-sdk-android-samples/blob/master/AmazonKinesisVideoDemoApp/src/main/java/com/amazonaws/kinesisvideo/demoapp/fragment/StreamConfigurationFragment.java#L169

最大フラグメント継続時間に達しました

このエラーは、ストリーム内のメディアフラグメントが最大フラグメント継続期間の制限を超えると発生します。デフォルトでは、Kinesis Video Streams のストリームの最大フラグメント期間は 10 秒に設定されています。

この問題を解決するには、以下の手順を実行します。

  • ウェブカメラ/USB カメラを使用している場合は、次のいずれかの操作を行います。

    • キーフレームベースのフラグメンテーションを使用している場合は、10 秒以内にキーフレームを提供するようにエンコーダを設定します。

    • キーフレームベースのフラグメンテーションを使用していない場合は、ステップ 2: コードを作成してテストする でストリームを定義するときに、最大フラグメント期間の制限を 10 秒未満の値に設定します。

    • GStreamer パイプラインでソフトウェアエンコーダ (x264 など) を使用している場合は、key-int-max 属性を 10 秒以内の値に設定できます (たとえば、fps を 30 に設定してkey-int-max を 60 に設定し、キーフレームを 2 秒ごとに有効にします)。

  • RPI カメラを使用している場合は、keyframe-interval 属性を 10 秒未満に設定してください。

  • IP (RTSP) カメラを使用している場合は、GOP サイズを 60 に設定してください。

IoT 認証の使用中に "無効なモノの名前が渡されました (Invalid thing name passed)" エラーが発生

認証に IoT 認証情報を使用している場合にこのエラー (HTTP Error 403: Response: {"message":"Invalid thing name passed"}) を回避するには、stream-name の値 (kvssink 要素の必須パラメータ) を iot-thingname の値と同一にしてください。詳細については、GStreamer 要素パラメータリファレンスを参照してください。

Stream Parser ライブラリの問題のトラブルシューティング

このセクションでは、ストリームパーサーライブラリ を使用するときに発生する可能性がある問題について説明します。

ストリームから 1 つのフレームにアクセスできない

コンシューマーアプリケーションでストリーミングソースから 1 つのフレームにアクセスするには、ストリームに正しいコーデックプライベートデータが含まれていることを確認する必要があります。ストリームのデータの形式の詳細については、「データモデル」を参照してください。

コーデックプライベートデータを使用してフレームにアクセスする方法については、GitHub ウェブサイトで KinesisVideoRendererExampleTest.java テストファイルを参照してください。

フラグメントのデコードエラー

フラグメントが H.264 フォーマットで適切にエンコードされておらず、ブラウザがサポートしているレベルである場合、コンソールでストリームを再生するときに次のエラーが表示されることがあります。

Fragment Decoding Error There was an error decoding the video data. Verify that the stream contains valid H.264 content

このような場合は、次の点を確認してください。

  • フレームの解像度が、コーデックのプライベートデータで指定された解像度に一致している。

  • エンコードされたフレームの H.264 プロファイルとレベルが、コーデックのプライベートデータで指定されたプロファイルとレベルに一致している。

  • ブラウザがプロファイル/レベルの組み合わせをサポートしている。現在のほとんどのブラウザは、すべてのプロファイルとレベルの組み合わせをサポートしています。

  • タイムスタンプは正確で正しい順序であり、重複するタイムスタンプは作成されない。

  • お使いのアプリケーションが H.264 形式を使用してフレームデータをエンコードしている。