Kinesis ビデオストリームにビデオをストリーミングする - Amazon Kinesis Video Streams

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

Kinesis ビデオストリームにビデオをストリーミングする

サンプルアプリケーションを実行するには、次の情報が必要です。

  1. 認証情報とリージョンを設定します。

    export AWS_ACCESS_KEY_ID=YourAccessKey export AWS_SECRET_ACCESS_KEY=YourSecretKey export AWS_DEFAULT_REGION=us-west-2

    その他の認証方法については、「」を参照してください認証情報を に提供する kvssink

    注記

    C++ プロデューサー SDK は、デフォルトで米国西部 (オレゴン) (us-west-2) リージョンを使用します。デフォルトを使用するには、米国西部 (オレゴン) リージョンで Kinesis ビデオストリーム AWS リージョン を作成します。

    Kinesis ビデオストリームに別のリージョンを使用するには、次の環境変数をリージョン (us-east-1 など) に設定します。

    export AWS_DEFAULT_REGION=us-east-1
  2. 入力メディアに応じて、次のいずれかを選択します。

    Sample GStreamer video

    この GStreamer パイプラインは、640 x 480 ピクセルの解像度で 10 フレーム/秒で実行される標準テストパターンを持つライブテストビデオストリームを生成します。オーバーレイが追加され、現在のシステム日時が表示されます。その後、ビデオは H.264 形式にエンコードされ、キーフレームは最大 10 フレームごとに生成され、フラグメント期間 (写真のグループ (GoP) サイズとも呼ばれます) は 1 秒になります。kvssink は H.264 でエンコードされたビデオストリームを取得し、Matroska (MKV) コンテナ形式にパッケージ化して、Kinesis ビデオストリームにアップロードします。

    次のコマンドを実行してください。

    gst-launch-1.0 -v videotestsrc is-live=true \ ! video/x-raw,framerate=10/1,width=640,height=480 \ ! clockoverlay time-format="%a %B %d, %Y %I:%M:%S %p" \ ! x264enc bframes=0 key-int-max=10 \ ! h264parse \ ! kvssink stream-name="YourStreamName"

    GStreamer パイプラインを停止するには、ターミナルウィンドウを選択し、Ctrl+C を押します。

    サンプルビデオの GStreamer パイプラインは次のようになります。

    日付とタイムスタンプがオーバーレイされた標準テストパターンの画像。
    USB web cam

    次のコマンドを実行して、GStreamer で USB カメラを自動検出します。

    gst-launch-1.0 autovideosrc \ ! videoconvert \ ! video/x-raw,format=I420,width=640,height=480 \ ! x264enc bframes=0 key-int-max=45 tune=zerolatency byte-stream=true speed-preset=ultrafast \ ! h264parse \ ! video/x-h264,stream-format=avc,alignment=au,profile=baseline \ ! kvssink stream-name="YourStreamname"

    GStreamer パイプラインを停止するには、ターミナルウィンドウを選択し、Ctrl+C を押します。

    GStreamer が自動検出するのではなく、特定のデバイス識別子v4l2srcで を使用できます。次のコマンドを実行してください。

    gst-device-monitor-1.0

    出力には、いくつかのデバイスと、デバイスの使用方法に関する GStreamer パイプラインの開始が表示されます。

    Device found: name : H264 USB Camera: USB Camera class : Video/Source caps : video/x-h264, stream-format=(string)byte-stream, alignment=(string)au, width=(int)1920, height=(int)1080, pixel-aspect-ratio=(fraction)1/1, colorimetry=(string){ 2:4:7:1 }, framerate=(fraction){ 30/1, 25/1, 15/1 }; ... properties: device.path = /dev/video4 udev-probed = false device.api = v4l2 v4l2.device.driver = uvcvideo v4l2.device.card = "H264\ USB\ Camera:\ USB\ Camera" v4l2.device.bus_info = usb-3f980000.usb-1.3 v4l2.device.version = 265767 (0x00040e27) v4l2.device.capabilities = 2216689665 (0x84200001) v4l2.device.device_caps = 69206017 (0x04200001) gst-launch-1.0 v4l2src device=/dev/video4 ! ...

    GStreamer パイプラインを停止するには、ターミナルウィンドウを選択し、Ctrl+C を押します。

    Raspberry Pi camera module 1

    で Pi カメラモジュール 1 または Pi カメラモジュール 2 を使用している場合はbcm2835-v4l2、以下を使用します。

    gst-launch-1.0 v4l2src device=/dev/video0 \ ! videoconvert \ ! video/x-raw,format=I420,width=640,height=480 \ ! x264enc bframes=0 key-int-max=45 bitrate=500 tune=zerolatency \ ! h264parse ! video/x-h264,stream-format=avc,alignment=au,profile=baseline \ ! kvssink stream-name="YourStreamname"

    GStreamer パイプラインを停止するには、ターミナルウィンドウを選択し、Ctrl+C を押します。

    Raspberry Pi camera module 2 or 3

    最新のlibcameraスタックを使用している場合は、次の GStreamer パイプラインを使用します。

    gst-launch-1.0 libcamerasrc \ ! video/x-raw,width=640,height=480,framerate=30/1,format=I420 \ ! videoconvert \ ! x264enc speed-preset=ultrafast tune=zerolatency byte-stream=true key-int-max=75 \ ! video/x-h264,level='(string)4' \ ! h264parse \ ! video/x-h264,stream-format=avc,alignment=au,width=640,height=480,framerate=30/1 \ ! kvssink stream-name="YourStreamname"

    GStreamer パイプラインを停止するには、ターミナルウィンドウを選択し、Ctrl+C を押します。

    Sample RTSP camera

    この例では、Gst-Rtsp-Server を使用してデモ RTSP カメラフィードをローカルでホストします。次に、その RTSP カメラフィードを指定された Kinesis ビデオストリームにアップロードする GStreamer パイプラインを構築します。

    Raspberry Pi で Gst-Rtsp-Server を設定するには

    1. Gst-Rtsp-Server プロジェクトを構築するために必要な依存関係ライブラリをインストールします。ソフトウェアの前提条件もインストールされていることを確認してください。ターミナルに次のように入力します。

      sudo apt-get update sudo apt-get install libgstrtspserver-1.0
    2. Raspberry Pi に GStreamer の 1.22 バージョンをダウンロードします。

      git clone https://gitlab.freedesktop.org/gstreamer/gstreamer.git --single-branch -b 1.22
    3. ディレクトリを gst-rtsp-server の examples ディレクトリに変更します。

      cd gstreamer cd subprojects cd gst-rtsp-server cd examples
    4. gcc を使用して test-launch.c を test-launch という実行可能ファイルにコンパイルします。

      gcc -o test-launch test-launch.c `pkg-config --cflags --libs gstreamer-rtsp-server-1.0`
    5. 次の引数を使用して実行可能ファイルを実行します。注: GStreamer の初回ロードには時間がかかる場合があります。

      ./test-launch "videotestsrc is-live=true ! video/x-raw,height=480,width=640,framerate=10/1 ! videoconvert ! x264enc tune=zerolatency bitrate=512 key-int-max=25 bframes=0 ! h264parse ! rtph264pay ! name=pay0 pt=96"

      以下の出力が表示されます。

      stream ready at rtsp://127.0.0.1:8554/test
    6. RTSP ビデオストリームを確認します。任意の RTSP ビューワーを使用できます。たとえば、VLC メディアプレーヤーです。VLC メディアプレーヤーを使用してライブストリームを表示するには、新しいターミナルを開き、次のように入力します。

      sudo apt-get install vlc

      VLC メディアプレーヤーをインストールします。次に、次のように入力します。

      vlc rtsp://127.0.0.1:8554/test

      ライブストリームとともに VLC ウィンドウが表示されます。そうでない場合は、テスト起動実行可能ファイルがまだ実行中であることを確認し、エラーがないか出力を確認します。

      RTSP ストリームを検証するもう 1 つの方法は、gst-discoverer-1.0 ユーティリティを使用することです。タイプ:

      gst-discoverer-1.0 "rtsp://127.0.0.1:8554/test"

      予想される出力は次のようになります。

      Analyzing rtsp://127.0.0.1:8554/test Done discovering rtsp://127.0.0.1:8554/test Properties: Duration: 99:99:99.999999999 Seekable: no Live: yes unknown #0: application/x-rtp video #1: H.264 (Constrained Baseline Profile) Stream ID: 359314d7d4bba383223927d7e57d4244d0800e629c626be81c505055c62170e2/video:0:0:RTP:AVP:96 Width: 640 Height: 480 Depth: 24 Frame rate: 10/1 Pixel aspect ratio: 1/1 Interlaced: false Bitrate: 0 Max bitrate: 0

    kvssink を使用して RTSP フィードを Kinesis Video Stream に送信するには

    この GStreamer パイプラインはrtspsrc、 を使用して RTSP サーバーに接続し、RTP ビデオストリームを取得します。フレームを に渡します。これによりrtph264depay、RTP パケットから H.264 でエンコードされたビデオフレームが抽出されます。 は、ビデオフレームを 形式でh264parseグループ化kvssinkします。 kvssinkは H.264 でエンコードされたビデオストリームを取得し、Matroska (MKV) コンテナ形式にパッケージ化して、Kinesis ビデオストリームにアップロードします。

    次のコマンドを実行してください。

    gst-launch-1.0 -v rtspsrc location="rtsp://127.0.0.1:8554/test" short-header=true \ ! rtph264depay \ ! h264parse \ ! video/x-h264,format=avc,alignment=au \ ! kvssink stream-name="YourStreamName"

    GStreamer パイプラインを停止するには、ターミナルウィンドウを選択し、Ctrl+C を押します。

ハードウェアの使用

一部の Raspberry Pi モデルには、ハードウェアアクセラレーション H.264 エンコーダーが付属しています。ソフトウェアエンコーダx264encーである の代わりに使用できます。

  1. GStreamer プラグインがインストールされていることを確認します。

    sudo apt-get install gstreamer1.0-tools gstreamer1.0-plugins-bad
  2. タイプ:

    gst-inspect-1.0 | grep h264

    次の要素が使用可能かどうかを確認します。

    • omxh264enc

    • v4l2h264enc

    利用可能な場合は、それらを使用できます。これらの要素を使用したパイプラインの例を以下に示します。

    omxh264enc:

    gst-launch-1.0 v4l2src device=/dev/video0 \ ! videoconvert \ ! video/x-raw,format=I420,width=640,height=480 \ ! omxh264enc control-rate=2 target-bitrate=512000 periodicity-idr=45 inline-header=FALSE \ ! h264parse ! video/x-h264,stream-format=avc,alignment=au,profile=baseline \ ! kvssink stream-name="raspberry"

    v4l2h264enc および v4l2convert:

    gst-launch-1.0 libcamerasrc \ ! video/x-raw,width=640,height=480,framerate=30/1,format=I420 \ ! v4l2convert \ ! v4l2h264enc extra-controls="controls,repeat_sequence_header=1" \ ! video/x-h264,level='(string)4' \ ! h264parse \ ! video/x-h264,stream-format=avc,alignment=au,width=640,height=480,framerate=30/1 \ ! kvssink stream-name="test-stream"

ランタイムの問題

以下に、頻繁に発生するランタイムの問題とそのトラブルシューティング方法を示します。

そのような要素「xxxxxxxxx」はありません

次のようなエラーが表示された場合は、GStreamer プラグインがないことを意味します。

WARNING: erroneous pipeline: no element "videoconvert"

解決策:

欠落している要素に基づいて、適切なアクションを決定します。

「バッファプールのアクティベーションに失敗しました」エラー

次のようなエラーが表示された場合は、使用されているパイプラインが を使用していることを意味しますがv4l2srclibcamerasrc代わりに を使用する必要があります。

ERROR bufferpool gstbufferpool.c:572:gst_buffer_pool_set_active:source:pool0:src start failed WARN v4l2src gstv4l2src.c:976:gst_v4l2src_decide_allocation: error: Failed to allocate required memory. WARN v4l2src gstv4l2src.c:976:gst_v4l2src_decide_allocation: error: Buffer pool activation failed WARN basesrc gstbasesrc.c:3352:gst_base_src_prepare_allocation: Subclass failed to decide allocation Error received from element source: Failed to allocate required memory. WARN basesrc gstbasesrc.c:3132:gst_base_src_loop: error: Internal data stream error. Debugging information: ../sys/v4l2/gstv4l2src.c(976): gst_v4l2src_decide_allocation (): /GstPipeline:live-kinesis-pipeline/GstV4l2Src:source: Buffer pool activation failed WARN basesrc gstbasesrc.c:3132:gst_base_src_loop: error: streaming stopped, reason not-negotiated (-4)

たとえば、次のパイプラインをカメラモジュール 2 にlibcamerasrcインストールせずに使用している場合、GStreamer が使用する要素を自動検出しようとすると、このエラーが発生することがあります。

gst-launch-1.0 autovideosrc ! videoconvert ! autovideosink

解決策:

libcamerasrc がインストールされていることを確認し、 ではなくソース要素として使用しますv4l2srclibcamerasrc GStreamer 要素をインストールするには、次のように入力します。

sudo apt-get update sudo apt-get install gstreamer1.0-libcamera

libcamerasrc をインストールすると、 autovideosrc要素を使用している場合、GStreamer は libcamerasrcの代わりに正しいソースを使用するように自動的に切り替える必要がありますv4l2src

バスエラー

起動直後に Bus エラーが発生した場合 kvssink (通常は、 の HTTP 呼び出しPutMediaが完了した前後)、Raspberry Pi はアライメントされていないメモリアクセスをサポートしていないことを意味します。ログは次のようになります。

INFO Camera camera.cpp:1197 configuring streams: (0) 640x480-YUV420 INFO RPI pisp.cpp:1450 Sensor: /base/axi/pcie@120000/rp1/i2c@88000/imx708@1a - Selected sensor format: 1536x864-SBGGR10_1X10 - Selected CFE format: 1536x864-PC1B [INFO ] kinesisVideoStreamFormatChanged(): Stream format changed. [DEBUG] setRequestHeader(): Appending header to request: user-agent -> AWS-SDK-KVS-CPP-CLIENT/3.4.2/1.5.3 GCC/12.2.0 Linux/6.6.51+rpt-rpi-v8 aarch64 CPPSDK [DEBUG] setRequestHeader(): Appending header to request: x-amzn-stream-name -> demo-stream [DEBUG] setRequestHeader(): Appending header to request: x-amzn-producer-start-timestamp -> 1732012345.678 [DEBUG] setRequestHeader(): Appending header to request: x-amzn-fragment-acknowledgment-required -> 1 [DEBUG] setRequestHeader(): Appending header to request: x-amzn-fragment-timecode-type -> ABSOLUTE [DEBUG] setRequestHeader(): Appending header to request: transfer-encoding -> chunked [DEBUG] setRequestHeader(): Appending header to request: connection -> keep-alive [INFO ] putStreamResultEvent(): Put stream result event. New upload handle 0 [WARN ] notifyDataAvailable(): [demo-stream] Failed to un-pause curl with error: 43. Curl object 0xe2f6f418 Bus error

Kinesis Video Streams PIC は、アライメントされていないメモリアクセスを使用してメモリ使用量を最適化します。これは、すべてのデバイスでサポートされているわけではありません。

解決策:

アラインされたメモリアクセスモードで SDK を使用するには、 をコンパイルONするときに ALIGNED_MEMORY_MODEL CMake フラグを明示的に に設定する必要があります。これはkvssink、デフォルトが であるためですOFF。詳細な手順Kinesis Video Streams C++ プロデューサー SDK をダウンロードして構築するについては、「」を参照してください。

タイムスタンプがフリーズし、パイプラインが停止する

GStreamer パイプラインx264encで を使用する場合、パイプラインのタイムラインが数秒以内に大幅にまたは完全に停止することがあります。

これは、x264encデフォルト設定によってエンコードレイテンシーが高くなり、デフォルトの入力バッファの容量を超える可能性があるためです。その結果、入力バッファがいっぱいになり、アップストリーム要素がブロックされ、パイプラインが停止します。

詳細については、GStreamer ドキュメントを参照してください。

解決策:

調整オプションx264encを使用して zerolatency を設定します。これにより、リアルタイムのシナリオに合わせて を最適化することでエンコーディングのレイテンシーが大幅に短縮され、フレームの処理と出力がより迅速になります。

設定例:

... ! x264enc tune=zerolatency byte-stream=true speed-preset=ultrafast bframes=0 key-int-max=60 ! ...
注記

このソリューションはパイプラインの停止を効果的に防止しますが、エンコーディングの効率と品質に影響を与える可能性があります。低レイテンシーと高品質の両方を必要とするシナリオでは、ハードウェア最適化の使用や H.264 を直接出力するウェブカメラの検索など、このエンコーディングステップをスキップする代替アプローチを検討してください。

詳細については、「ハードウェアの使用」を参照してください。

同じv4l2デバイスから複数のパイプラインを同時に実行できない

などのデバイスには、一度に 1 つのプロセス/dev/video0でのみアクセスできます。複数のプロセスが同時にアクセスしようとすると、2 番目のプロセスは最初のプロセスが完了するまで待機します。

解決策:

ループバックデバイスを作成し、複数のプロセスが同時にループバックインターフェイスを使用できるようにします。詳細については、「Stack Exchange」を参照してください。

内部データストリームエラー

GStreamer パイプラインを作成するときは、ある要素のソースパッドを別の要素のシンクパッドにリンクして要素を接続します。このリンクプロセスにより、ソース要素からシンク要素へのデータフローが可能になり、データパイプラインが形成されます。

ログのエラーメッセージ「Pad link failed」は、パイプライン内の 2 つの要素のパッド間の接続 (リンク) を確立しようとしたときに GStreamer で問題が発生したことを示します。

Pad link failed Error received from element udpsrc0: Internal data stream error.

解決策:

どの要素が相互にリンクできないかを判断します。パイプラインの範囲を絞り込むには、パイプラインから要素を削除します。右端の要素を に置き換えfakesink、要素を一度に 1 つずつ削除します。

場合によっては、capsfilter 要素を調整したり、パイプラインが使用する要素を変更したりする必要があります。

一般的なケースでは、カメラがサポートしていない resolution framerateまたは を要求しています。ターミナルgst-device-monitor-1.0で を使用して、サポートされている frameratesresolutions、および を取得しますformatsビデオスケール GStreamer 要素を使用してビデオ解像度を調整し、ビデオレートを使用してビデオフレームレートを調整できます。

個々の GStreamer 要素でサポートされている形式を確認するには、ターミナルgst-inspect-1.0 element-nameに と入力します。