

本文為英文版的機器翻譯版本，如內容有任何歧義或不一致之處，概以英文版為準。

# 將影片串流到您的 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`) 區域。若要使用預設，在美國西部 （奧勒岡） 區域中 AWS 區域 建立 Kinesis 影片串流。  
若要為 Kinesis 影片串流使用不同的區域，請將下列環境變數設定為您的區域 （例如 *us-east-1*)：  

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

1. 根據您的輸入媒體，選擇下列其中一項：

------
#### [ Sample GStreamer video ]

   此 GStreamer 管道會產生即時測試影片串流，其標準測試模式以每秒 10 個影格執行，解析度為 640x480 像素。新增浮水印，顯示目前的系統時間和日期。然後影片會編碼為 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/zh_tw/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**。

   您可以`v4l2src`搭配特定裝置識別符使用 ，而不是讓 GStreamer 自動偵測。執行以下命令：

   ```
   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 攝影機摘要。然後，我們會建構 GStreamer 管道，將該 RTSP 攝影機摘要上傳至指定的 Kinesis 影片串流。

   **在 Raspberry Pi 上設定 Gst-Rtsp-Server **

   1. 安裝必要的相依性程式庫，以建置 Gst-Rtsp-Server 專案。請確定您也已安裝軟體先決條件。在終端機中輸入以下內容：

      ```
      sudo apt-get update
      sudo apt-get install libgstrtspserver-1.0
      ```

   1. 在 Raspberry Pi 上下載 1.22 版的 GStreamer。

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

   1. 將目錄變更為 gst-rtsp-server 中的範例目錄。

      ```
      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 檢視器。例如，VPC 媒體播放器。若要使用 VLC 媒體播放器來檢視即時串流，請開啟新的終端機並輸入：

      ```
      sudo apt-get install vlc
      ```

      安裝 VLC 媒體播放器。然後輸入：

      ```
      vlc rtsp://127.0.0.1:8554/test
      ```

      VLC 視窗應該會隨即時串流彈出。如果沒有，請檢查 test-launch 可執行檔是否仍在執行，並檢查輸出是否有任何錯誤。

      驗證 RTSP 串流的另一種方法是使用 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`：請參閱 [「緩衝集區啟用失敗」錯誤](#rpi-troubleshoot-buffer) 安裝 `libcamerasrc` GStreamer 元素。
+ `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)
```

例如，如果您在未`libcamerasrc`安裝攝影機模組 2 的情況下使用下列管道 ，當 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>

如果您在啟動後不久收到匯流排錯誤 `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>

這類裝置一次`/dev/video0`只能透過一個程序存取。如果多個程序嘗試同時存取它，第二個程序會等到第一個程序完成。

**解決方法：**

建立迴路裝置，允許多個程序同時使用迴路界面。如需詳細資訊，請參閱 [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 管道時，您可以透過將一個元素的來源鍵盤連結至另一個元素的接收器鍵盤來連接元素。此連結程序允許資料從來源元素流向接收器元素，形成資料管道。

日誌中的錯誤訊息「Pad 連結失敗」表示 GStreamer 在嘗試在管道中兩個元素的Pad 之間建立連線 （連結） 時遇到問題。

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

**解決方法：**

判斷哪些元素無法互相連結。若要縮小管道範圍，請從管道中移除元素。將最右側的元素取代為 `fakesink`，並一次移除一個元素。

您可能需要調整 [capsfilter](https://gstreamer.freedesktop.org/documentation/coreelements/capsfilter.html?gi-language=c) 元素，和/或變更管道使用的元素。

常見情況是要求 `framerate`或攝影機不支援`resolution`的 。在終端機`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`中輸入 。