

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

# Kinesis ビデオストリームにビデオをストリーミングする
<a name="producersdk-cpp-rpi-run"></a>

サンプルアプリケーションを実行するには、次の情報が必要です。
+ 「[前提条件](producersdk-cpp-rpi-prerequisites.md)」セクションで作成したストリームの名前。
+ 「[Kinesis Video Streams に書き込むアクセス許可を持つ IAM ユーザーを作成する](producersdk-cpp-rpi-iam.md)」で作成したアカウントの認証情報 (アクセスキー ID およびシークレットアクセスキー)。
+ GStreamer は`kvssink`プラグインを見つけることができます。詳細については「[Kinesis Video Streams C\$1\$1 プロデューサー SDK をダウンロードして構築する](producersdk-cpp-rpi-download.md)」を参照してください。

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

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

   その他の認証方法については、「」を参照してください[認証情報を に提供する `kvssink`](examples-gstreamer-plugin-parameters.md#credentials-to-kvssink)。
**注記**  
C\$1\$1 プロデューサー SDK は、デフォルトで米国西部 (オレゴン) (`us-west-2`) リージョンを使用します。デフォルトを使用するには、米国西部 (オレゴン) リージョンで Kinesis ビデオストリーム AWS リージョン を作成します。  
Kinesis ビデオストリームに別のリージョンを使用するには、次の環境変数をリージョン (*us-east-1 など*) に設定します。  

   ```
   export AWS_DEFAULT_REGION=us-east-1 
   ```

1. 入力メディアに応じて、次のいずれかを選択します。

------
#### [ 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\$1C **を押します。

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

![\[日付とタイムスタンプがオーバーレイされた標準テストパターンの画像。\]](http://docs.aws.amazon.com/ja_jp/kinesisvideostreams/latest/dg/images/sample-video.png)


------
#### [ 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\$1C **を押します。

   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\$1C **を押します。

------
#### [ 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\$1C **を押します。

------
#### [ 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\$1C **を押します。

------
#### [ 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
      ```

   1. Raspberry Pi に GStreamer の 1.22 バージョンをダウンロードします。

      ```
      git clone https://gitlab.freedesktop.org/gstreamer/gstreamer.git --single-branch -b 1.22
      ```

   1. ディレクトリを gst-rtsp-server の examples ディレクトリに変更します。

      ```
      cd gstreamer
      cd subprojects
      cd gst-rtsp-server
      cd examples
      ```

   1. gcc を使用して test-launch.c を test-launch という実行可能ファイルにコンパイルします。

      ```
      gcc -o test-launch test-launch.c `pkg-config --cflags --libs gstreamer-rtsp-server-1.0`
      ```

   1. 次の引数を使用して実行可能ファイルを実行します。注: 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
      ```

   1. 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\$1C **を押します。

------

## ハードウェアの使用
<a name="producersdk-cpp-rpi-utilize"></a>

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

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

   ```
   sudo apt-get install gstreamer1.0-tools gstreamer1.0-plugins-bad
   ```

1. タイプ:

   ```
   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"
   ```

## ランタイムの問題
<a name="rpi-troubleshoot-runtime"></a>

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

### そのような要素「xxxxxxxxx」はありません
<a name="rpi-troubleshoot-missing-plugin"></a>

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

```
WARNING: erroneous pipeline: no element "videoconvert"
```

**解決策:**

欠落している要素に基づいて、適切なアクションを決定します。
+ `kvssink`: 「」を参照してください[Kinesis Video Streams C\$1\$1 プロデューサー SDK をダウンロードして構築する](producersdk-cpp-rpi-download.md)。
+ `libcamerasrc`: `libcamerasrc` GStreamer 要素をインストールする[「バッファプールのアクティベーションに失敗しました」エラー](#rpi-troubleshoot-buffer)には、「」を参照してください。
+ `omxh264enc` または `v4l2h264enc`: 

  に従って[ソフトウェアのインストールの前提条件](producersdk-cpp-rpi-software.md)、すべての GStreamer ライブラリをインストールします。これらをすべてインストールし、これらの要素が表示されない場合は、Raspberry Pi にハードウェアがないことを意味します。`x264enc` 代わりにソフトウェアエンコーダーを使用します。
+ その他: [ソフトウェアのインストールの前提条件](producersdk-cpp-rpi-software.md)に従ってすべての GStreamer ライブラリをインストールします。さまざまな GStreamer 要素がさまざまな GStreamer プラグイングループ (良い、悪い、醜い) にあるため、すべてインストールしてください。

### 「バッファプールのアクティベーションに失敗しました」エラー
<a name="rpi-troubleshoot-buffer"></a>

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

```
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` がインストールされていることを確認し、 ではなくソース要素として使用します`v4l2src`。`libcamerasrc` GStreamer 要素をインストールするには、次のように入力します。

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

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

### バスエラー
<a name="rpi-troubleshoot-bus"></a>

起動直後に 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\$1\$1 プロデューサー SDK をダウンロードして構築する](producersdk-cpp-rpi-download.md)については、「」を参照してください。

### タイムスタンプがフリーズし、パイプラインが停止する
<a name="rpi-troubleshoot-pipeline"></a>

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

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

詳細については、[GStreamer ドキュメント](https://gstreamer.freedesktop.org/documentation/x264/index.html?gi-language=c)を参照してください。

**解決策:**

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

設定例:

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

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

### 同じ`v4l2`デバイスから複数のパイプラインを同時に実行できない
<a name="rpi-troubleshoot-multiple-pipelines"></a>

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

**解決策:**

ループバックデバイスを作成し、複数のプロセスが同時にループバックインターフェイスを使用できるようにします。詳細については、[「Stack Exchange](https://raspberrypi.stackexchange.com/questions/19630/take-picam-image-while-motion-is-running/19897#19897)」を参照してください。

### 内部データストリームエラー
<a name="rpi-troubleshoot-internal-error"></a>

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

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

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

**解決策:**

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

場合によっては、[capsfilter](https://gstreamer.freedesktop.org/documentation/coreelements/capsfilter.html?gi-language=c) 要素を調整したり、パイプラインが使用する要素を変更したりする必要があります。

一般的なケースは、カメラがサポートしていない `resolution` `framerate`または を要求することです。ターミナル`gst-device-monitor-1.0`で を使用して、サポートされている `framerates`、`resolutions`、および を取得します`formats`。[ビデオスケール](https://gstreamer.freedesktop.org/documentation/videoconvertscale/videoscale.html?gi-language=c) GStreamer 要素を使用してビデオ解像度を調整し、[ビデオレート](https://gstreamer.freedesktop.org/documentation/videorate/?gi-language=c)を使用してビデオフレームレートを調整できます。

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