

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

# 在 Raspberry Pi 上使用 C\$1\$1 生產者 SDK
<a name="producersdk-cpp-rpi"></a>

Raspberry Pi 是一款小型且便宜的電腦，可用來教授和學習基本電腦程式設計技能。本教學課程說明如何在 Raspberry Pi 裝置上設定和使用 Amazon Kinesis Video Streams C\$1\$1 生產者 SDK。此步驟同時包含如何使用 GStreamer 示範應用程式驗證安裝。

**Topics**
+ [先決條件](producersdk-cpp-rpi-prerequisites.md)
+ [建立具有寫入 Kinesis Video Streams 許可的 IAM 使用者](producersdk-cpp-rpi-iam.md)
+ [將 Raspberry Pi 加入 Wi-Fi 網路](producersdk-cpp-rpi-wifi.md)
+ [遠端連線至 Raspberry Pi](producersdk-cpp-rpi-connect.md)
+ [設定 Raspberry Pi 攝影機](producersdk-cpp-rpi-camera.md)
+ [安裝軟體先決條件](producersdk-cpp-rpi-software.md)
+ [下載並建置 Kinesis Video Streams C\$1\$1 生產者 SDK](producersdk-cpp-rpi-download.md)
+ [將影片串流到您的 Kinesis 影片串流](producersdk-cpp-rpi-run.md)
+ [從 Kinesis 影片串流播放媒體](producersdk-cpp-rpi-playback.md)
+ [針對適用於 Raspberry Pi 的 C\$1\$1 生產者 SDK 的建置問題進行故障診斷](troubleshoot-rpi.md)

# 先決條件
<a name="producersdk-cpp-rpi-prerequisites"></a>

在 Raspberry Pi 上設定 C\$1\$1 生產者開發套件之前，請確定您有下列先決條件：
+ 使用以下組態的 Raspberry Pi 裝置：
  + 機板版本：3 Model B 或更新版本。
  + 連接的[攝影機模組](https://www.raspberrypi.com/documentation/accessories/camera.html)或連接的 USB 攝影機 （網路攝影機）。
  + 容量至少 8 GB 的 SD 卡。
  + 已安裝 Raspbian 作業系統 (4.9 核心版或更新版本)。您可以從 Raspberry Pi [網站下載最新的 Raspberry Pi](https://www.raspberrypi.com/software/) OS （先前稱為 Raspbian) 映像。遵循 Raspberry Pi 指示[將下載的映像安裝在 SD 卡上](https://www.raspberrypi.com/documentation/computers/getting-started.html#install-an-operating-system)。
+  AWS 帳戶 具有 Kinesis 影片串流的 。如需更多資訊，請參閱 [Kinesis 視訊串流入門](https://docs.aws.amazon.com/kinesisvideostreams/latest/dg/getting-started.html)。

# 建立具有寫入 Kinesis Video Streams 許可的 IAM 使用者
<a name="producersdk-cpp-rpi-iam"></a>

如果您尚未這麼做，請設定具有寫入 Kinesis 影片串流許可的 AWS Identity and Access Management (IAM) 使用者。

這些程序旨在協助您快速開始使用 AWS 存取金鑰對。裝置可以使用 X.509 憑證來連線 AWS IoT。[使用 控制對 Kinesis Video Streams 資源的存取 AWS IoT](how-iot.md) 如需如何設定裝置以使用憑證型身分驗證的詳細資訊，請參閱 。

1. 登入 AWS 管理主控台 ，並在 https：//[https://console.aws.amazon.com/iam/](https://console.aws.amazon.com/iam/) 開啟 IAM 主控台。

1. 在左側的導覽功能表中，選擇 **Users (使用者)**。

1. 若要建立新使用者，請選擇 **Add user (新增使用者)**。

1. 提供使用者的​描述性**使用者名稱**​，例如 **kinesis-video-raspberry-pi-producer**​。

1. 在 **Access type (存取類型)** 下，選擇 **Programmatic access (程式設計存取)**。

1. 選擇**下一步：許可**。

1. 在 **Set permissions for kinesis-video-raspberry-pi-producer (設定 kinesis-video-raspberry-pi-producer 許可)** 下，選擇 **Attach existing policies directly (直接貼附現有的政策)**。

1. 選擇**建立政策**。**Create policy (建立政策)** 頁面在 web 瀏覽器的新索引標籤中開啟。

1. 選擇 **JSON** 標籤。

1. 將下列 JSON 政策複製並貼入文字區域。此政策提供使用者建立資料並將其寫入 Kinesis 影片串流的許可。

------
#### [ JSON ]

****  

   ```
   {
     "Version":"2012-10-17",		 	 	 
     "Statement": [{
       "Effect": "Allow",
         "Action": [
         "kinesisvideo:DescribeStream",
         "kinesisvideo:CreateStream",
         "kinesisvideo:GetDataEndpoint",
         "kinesisvideo:PutMedia"
       ],
       "Resource": [
         "*"
       ]
     }]
   }
   ```

------

1. 選擇**檢閱政策**。

1. 為您的政策提供一個**名稱**，例如 **kinesis-video-stream-write-policy**。

1. 選擇**建立政策**。

1. 在瀏覽器中，返回 **Add user (新增使用者)** 索引標籤，然後選擇 **Refresh (重新整理)**。

1. 在搜尋方塊中，輸入您建立之政策的名稱。

1. 在清單中，選取新政策旁邊的核取方塊。

1. 選擇 **Next:Review (下一步：檢閱)**。

1. 選擇 **Create user** (建立使用者)。

1. 主控台會顯示新使用者的 **Access key ID (存取金鑰 ID)**。請選擇 **Show (顯示)**，以顯示 **Secret access key (私密存取金鑰)**。記錄這些值；設定應用程式時需要它們。

# 將 Raspberry Pi 加入 Wi-Fi 網路
<a name="producersdk-cpp-rpi-wifi"></a>

如果您使用連接的螢幕和鍵盤，請前往 [設定 Raspberry Pi 攝影機](producersdk-cpp-rpi-camera.md)。

這些指示旨在協助您在*無頭*模式下執行時設定 Raspberry Pi，也就是沒有連接的鍵盤、監視器或網路纜線。請依照下列指示設定 Raspberry Pi，以自動嘗試連線到指定的網路，讓您的主機機器能夠 SSH 連入其中。

1. 在您的電腦上，建立名為 `wpa_supplicant.conf` 的檔案。

1. 複製下列文字並將其貼入 `wpa_supplicant.conf` 檔案：

   ```
   country=US
   ctrl_interface=DIR=/var/run/wpa_supplicant GROUP=netdev
   update_config=1
   
   network={
   ssid="Your Wi-Fi SSID"
   scan_ssid=1
   key_mgmt=WPA-PSK
   psk="Your Wi-Fi Password"
   }
   ```

   將 `ssid` 和 `psk` 值更換為 Wi-Fi 網路的資訊。

1. 將 `wpa_supplicant.conf` 檔案複製到 SD 卡。必須複製到 `boot` 磁碟區的根使用者。

1. 將 SD 卡插入 Raspberry Pi 並開機。它會加入您的 Wi-Fi 網路，且 SSH 已啟用。

# 遠端連線至 Raspberry Pi
<a name="producersdk-cpp-rpi-connect"></a>

如果您使用連接的螢幕和鍵盤，請前往 [設定 Raspberry Pi 攝影機](producersdk-cpp-rpi-camera.md)。

這些指示旨在協助您在*無周邊*模式下執行時設定 Raspberry Pi，也就是不使用連接的鍵盤、監視器或網路纜線。請依照下列指示，在網路上找到您的 Raspberry Pi，並從主機機器將 SSH 放入其中。

1. 在遠端連接 Raspberry Pi 裝置之前，請執行以下其中一項操作以判斷其 IP 地址：
   + 如果您可以存取網路的 Wi-Fi 路由器，請查看連接的 Wi-Fi 裝置。尋找名為 `Raspberry Pi` 的裝置，以找到您裝置的 IP 地址。
   + 如果您無法存取網路的 Wi-Fi 路由器，可以使用其他軟體來尋找網路上的裝置。[Fing](https://www.fing.com/) 是一款常見的應用程式，同時適用於 Android 和 iOS 裝置。您可以使用此應用程式的免費版本，在網路上尋找裝置的 IP 地址。

1. 當您知道 Raspberry Pi 裝置的 IP 地址之後，就可以使用任何終端應用程式進行連接。
   + 在 macOS 或 Linux 上，請使用 `ssh`：

     ```
     ssh pi@<IP address>
     ```
   + 在 Windows 上，請使用 [PuTTY](https://www.chiark.greenend.org.uk/~sgtatham/putty/latest.html)，其為適用於 Windows 的免費 SSH 用戶端。

   新安裝的 Raspbian 中，使用者名稱為 **pi**，密碼為 **raspberry**。建議您[變更預設密碼](https://www.raspberrypi.com/documentation/computers/configuration.html#change-user-password-nonint)。

# 設定 Raspberry Pi 攝影機
<a name="producersdk-cpp-rpi-camera"></a>

請依照下列步驟設定 [Raspberry Pi 攝影機模組](https://www.raspberrypi.com/documentation/accessories/camera.html)，將影片從裝置傳送至 Kinesis 影片串流。

**注意**  
如果您使用的是 USB 網路攝影機，請跳至 [安裝軟體先決條件](producersdk-cpp-rpi-software.md)。

------
#### [ Camera module 1 ]

請依照這些指示更新模組檔案、啟用相機界面，以及驗證相機的功能。更新模組檔案會告知 Raspberry Pi 在開機時要載入哪些核心模組。預設不會載入攝影機驅動程式，以便在未使用攝影機的 Raspberry Pi 裝置上節省系統資源。

1.  開啟編輯器以變更模組檔案。開啟終端機，並使用下列命令，使用`nano`編輯器編輯檔案：

   ```
   sudo nano /etc/modules
   ```

1. 如果檔案結尾沒有下列內容，請將它加入：

   ```
   bcm2835-v4l2
   ```

1. 儲存檔案，然後退出編輯器。若要使用`nano`編輯器儲存和結束，請使用 Ctrl\$1X。

1. 重新啟動 Raspberry Pi：

   ```
   sudo reboot
   ```

1. 裝置重新啟動時，如果您是遠端連接，請透過終端應用程式再次連接。

1. Open `raspi-config`:

   ```
   sudo raspi-config
   ```

1. 選擇**介面選項**、**舊版攝影機**。在 Raspbian 作業系統的較舊版本中，此功能表選項可能位於**介面選項****相機**下。

   如果沒有啟用攝影機則將其啟用，並在出現提示訊息時重新啟動。

1. 輸入下列命令，驗證攝影機是否正常運作：

   ```
   raspistill -v -o test.jpg
   ```

   如果您的攝影機設定正確，此命令會從攝影機擷取影像，將其儲存至名為 的檔案`test.jpg`，並顯示資訊性訊息。

------
#### [ Camera module 2 or 3 ]

如果您使用的是攝影機模組 2，您可以使用 `bcm2835-v4l2`（舊版） 或 `libcamera`（現代）。不過，建議使用 `libcamera`堆疊以獲得更好的支援和功能。請依照下列步驟，確認 在您的系統上`libcamera`是up-to-date。

1. [libcamera](https://www.raspberrypi.com/documentation/computers/camera_software.html#libcamera) 應該預先安裝在 Raspberry Pi 上。檢查是否有任何更新，並更新至最新版本，以取得錯誤修正和安全性更新。開啟終端機並輸入下列命令：

   ```
   sudo apt-get update
   sudo apt-get upgrade
   ```

1. 重新啟動您的系統，讓更新生效。

   ```
   sudo reboot
   ```

1. 測試您的攝影機。此應用程式會啟動攝影機預覽串流，並在螢幕上顯示。

   ```
   libcamera-hello
   ```

   如果相機模組發生問題，請參閱 [Raspberry Pi 文件](https://raspberrypi.com/documentation/computers/camera_software.html#troubleshooting)進行故障診斷。

------

# 安裝軟體先決條件
<a name="producersdk-cpp-rpi-software"></a>

C\$1\$1 生產者 SDK 需要您在 Raspberry Pi 上安裝下列軟體先決條件。

1. 更新套件清單並安裝建置 SDK 所需的程式庫。開啟終端機並輸入下列命令：

   ```
   sudo apt-get update
   sudo apt-get install -y \
     automake \
     build-essential \
     cmake \
     git \
     gstreamer1.0-plugins-base-apps \
     gstreamer1.0-plugins-bad \
     gstreamer1.0-plugins-good \
     gstreamer1.0-plugins-ugly \
     gstreamer1.0-tools \
     gstreamer1.0-omx-generic \
     libcurl4-openssl-dev \
     libgstreamer1.0-dev \
     libgstreamer-plugins-base1.0-dev \
     liblog4cplus-dev \
     libssl-dev \
     pkg-config
   ```

1. 如果您使用的是 `libcamera`堆疊，也請安裝 `libcamerasrc` GStreamer 外掛程式。預設不會安裝此 GStreamer 外掛程式。

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

1. 將以下 PEM 檔案複製到 `/etc/ssl/cert.pem`：

   ```
   sudo curl https://www.amazontrust.com/repository/AmazonRootCA1.pem -o /etc/ssl/AmazonRootCA1.pem
   sudo chmod 644 /etc/ssl/AmazonRootCA1.pem
   ```

# 下載並建置 Kinesis Video Streams C\$1\$1 生產者 SDK
<a name="producersdk-cpp-rpi-download"></a>

請依照下列程序下載並建置 [Kinesis Video Streams C\$1\$1 生產者 SDK](https://github.com/awslabs/amazon-kinesis-video-streams-producer-sdk-cpp)。請確定您已安裝軟體先決條件；如需這些步驟[安裝軟體先決條件](producersdk-cpp-rpi-software.md)，請參閱 。

1. 導覽至下載目錄。開啟終端機並變更為您偏好的下載目錄。

   例如：

   ```
   cd ~/Downloads
   ```

1. 複製 SDK 儲存庫。使用 `git clone`命令從 GitHub 儲存庫下載 SDK。類型：

   ```
   git clone https://github.com/awslabs/amazon-kinesis-video-streams-producer-sdk-cpp.git --single-branch -b master kvs-producer-sdk-cpp
   ```

   此命令只會複製單一分支 (`master`分支），以減少下載大小和時間。它也會將下載的內容放入目前目錄中名為 `kvs-producer-sdk-cpp`的資料夾。

1. 驗證下載。複製程序完成後，請列出`kvs-producer-sdk-cpp`資料夾的內容，以確認已下載 SDK。

   ```
   ls kvs-producer-sdk-cpp
   ```

1. 準備建置目錄。類型：

   ```
   mkdir -p kvs-producer-sdk-cpp/build
   cd kvs-producer-sdk-cpp/build
   ```

1. 設定建置。執行下列`cmake`命令，以使用特定選項設定建置環境：

   ```
   cmake .. -DBUILD_GSTREAMER_PLUGIN=ON -DBUILD_DEPENDENCIES=OFF -DALIGNED_MEMORY_MODEL=ON
   ```

   [CMake](https://cmake.org/cmake/help/latest/manual/cmake.1.html) 使用以下選項來產生適當的 `Makefiles`：
   + 使用專案資料夾 (`..`) 做為來源目錄。
   + 使用目前的目錄 (`.`) (`build/`) 進行建置輸出。
   + `-DBUILD_GSTREAMER_PLUGIN=ON` 可建置 GStreamer 外掛程式 kvssink。
   + `-DBUILD_DEPENDENCIES=OFF` 停用從來源建置外部相依性。專案會尋找並使用上一個步驟中安裝的外部相依性。
   + `-DALIGNED_MEMORY_MODEL=ON` 會停用未對齊的記憶體模型。某些 Raspberry Pi 裝置不支援未對齊的記憶體存取。
**注意**  
如需 CMake 引數的完整清單，請參閱 [下載並設定 C\$1\$1 生產者程式庫程式碼](producersdk-cpp-download.md)。

1. 建置專案。設定組建後，請使用 `make`命令，使用 `Makefile`產生的 編譯 `cmake`。

   ```
   make -j$(nproc)
   ```

   的 `-j` 引數`make`允許它平行執行多個編譯任務。若要減少建置時間，請使用 `nproc`命令動態計算 Raspberry Pi 上的 CPU 核心數量。

1. 確認 `libgstkvssink.so` 存在。

   列出目前目錄中的檔案。

   **提示：**

   ```
   ls
   ```

   **回應：**

   ```
   CMakeCache.txt       dependency                          kvs_gstreamer_sample
   CMakeFiles           kvs_gstreamer_audio_video_sample    kvssink_gstreamer_sample
   Makefile             kvs_gstreamer_file_uploader_sample  libKinesisVideoProducer.so
   cmake_install.cmake  kvs_gstreamer_multistream_sample    libgstkvssink.so
   ```

1. 確認 GStreamer 可以載入 `kvssink`。

   將`GST_PLUGIN_PATH`環境變數設定為包含 的目錄`libgstkvssink.so`。

   ```
   export GST_PLUGIN_PATH=`pwd`
   ```

   讓 GStreamer 載入`kvssink`：

   ```
   gst-inspect-1.0 kvssink
   ```

   您應該會看到一些有關 的文件`kvssink`。使用方向鍵導覽並按 `q` 退出。

1. (**選用**) 更新 shell 的啟動指令碼，以包含設定`GST_PLUGIN_PATH`環境變數。這可確保`GST_PLUGIN_PATH`在新的終端機工作階段期間正確設定。在 Raspberry Pi 裝置上，殼層的啟動指令碼為 `~/.bashrc`。

   執行下列命令，將命令附加到 shell 啟動指令碼的結尾。

   ```
   echo "export GST_PLUGIN_PATH=~/Downloads/kvs-producer-sdk-cpp/build" >> ~/.bashrc
   ```

   輸入以下內容以執行 shell 的啟動指令碼，或關閉目前的 shell 並開啟新的 shell。

   ```
   source ~/.bashrc
   ```

   確認 `GST_PLUGIN_PATH` 已設定，您可以載入 `kvssink`。

   ```
   echo $GST_PLUGIN_PATH
   ```

   ```
   gst-inspect-1.0 kvssink
   ```

# 將影片串流到您的 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`中輸入 。

# 從 Kinesis 影片串流播放媒體
<a name="producersdk-cpp-rpi-playback"></a>

開啟 [Kinesis Video Streams 主控台](https://console.aws.amazon.com//kinesisvideo/home/)，並為您建立的串流選取**串流名稱**。

從 Raspberry Pi 傳送的視訊串流，會出現在主控台。

**注意**  
可能需要幾秒鐘的時間，影片才會出現在主控台中。

串流播放後，您可以在 主控台中實驗下列功能：
+ 在 **Video preview** (視訊預覽) 區段中，請使用導覽控制，以倒轉或向前快轉串流。
+ 在**串流資訊**區段中，檢閱串流的轉碼器、解析度和位元速率。Raspberry Pi 上的解析度和位元速率值會刻意設為低，以將本教學課程的頻寬使用量降至最低。

  若要檢視為串流建立的 Amazon CloudWatch 指標，請選取在 ** CloudWatch 中檢視串流指標**。
+ 在 **Data retention period** (資料保留期間) 下，請注意視訊串流的保留期間為 1 天。您可以編輯此值，將其設定為 **No data retention** (無資料保留)，或將值設定為從一天到數年。
+ 在**伺服器端加密**下，請注意您的資料正在使用由 AWS Key Management Service () 維護的金鑰進行靜態加密AWS KMS。

## 播放問題
<a name="rpi-troubleshoot-playback"></a>

以下是一些經常遇到的播放問題，以及如何進行故障診斷。

### 沒有媒體，但日誌中有 PERSISTED Acks
<a name="rpi-troubleshoot-no-media"></a>

如果您在日誌中看到 PERSISTED Acks，Kinesis Video Streams 已成功擷取並存放 上傳的媒體`kvssink`。從 Kinesis Video Streams 收到的 Acks 如下所示。在 JSON 中，查看`"EventType"`金鑰的值。

```
{"EventType":"RECEIVED","FragmentTimecode":252200,"FragmentNumber":"12345678901234567890123456724587702494771079511"}
{"EventType":"BUFFERING","FragmentTimecode":252467,"FragmentNumber":"12345678901234567890123456781729223736853277017"}
{"EventType":"RECEIVED","FragmentTimecode":252467,"FragmentNumber":"12345678901234567890123456781729223736853277017"}
{"EventType":"BUFFERING","FragmentTimecode":253000,"FragmentNumber":"12345678901234567890123456738870744847093249408"}
{"EventType":"PERSISTED","FragmentTimecode":252200,"FragmentNumber":"12345678901234567890123456724587702494771079511"}
{"EventType":"PERSISTED","FragmentTimecode":252467,"FragmentNumber":"1234567890123456789012345671729223736853277017"}
```

**解決方法：**

在 Kinesis Video Streams 主控台中等待一兩分鐘，然後使用向右雙箭頭。如果沒有顯示媒體，請確認您的串流正在傳送至正確的區域，並檢閱串流名稱的拼寫。您可以在日誌中找到此資訊。

[提供區域給 `kvssink`](examples-gstreamer-plugin-parameters.md#kvssink-region) 如需 kvssink 如何決定要使用的區域的詳細資訊，請參閱 。

### 媒體在 中載入需要很長的時間 AWS 管理主控台
<a name="rpi-troubleshoot-load-time"></a>

**重要**  
主控台播放體驗與 HLS 和 DASH 播放體驗不同。使用 GitHub 中的範例媒體播放器[託管網頁](https://aws-samples.github.io/amazon-kinesis-video-streams-media-viewer/)來測試播放。您可以在[此處](https://github.com/aws-samples/amazon-kinesis-video-streams-media-viewer)找到網頁的原始碼。

由於網路頻寬不足或裝置受限，媒體可能會在主控台中緩慢載入，但也可能與影片編碼和分段相關。

**影片編碼基本概念：**
+ H.264 和 H.265 編碼器使用關鍵影格 (I-Frame) 和預測影格 (P-Frame) 以實現高效壓縮。
+ 關鍵影格包含完整的影像資料，而 P 影格僅包含先前影格的變更。
+ 「關鍵影格間隔」會決定關鍵影格在影片串流中的發生頻率。

**串流中的分段：**
+ 在 Kinesis Video Streams 中，新片段會從每個關鍵影格開始。如需詳細資訊，請參閱[Kinesis Video Streams 資料模型](how-data.md)。
+ 片段長度 （以秒為單位） 可估計為：*關鍵影格間隔* ÷ *影格率*

  **範例**：

  對於關鍵影格間隔為 30 且影格速率為 15 fps 的串流：

  片段長度 = 30 ÷ 15 = 2 秒

由於關鍵影格間隔較大，較長的片段會增加串流媒體的延遲。

**解決方法：**

為了改善載入時間，請考慮減少關鍵影格間隔。這將建立較短的片段，減少延遲，但也會增加影片檔案的大小。

對於 `x264enc` GStreamer 元素，您可以透過 `key-int-max` 屬性明確設定關鍵影格間隔：

```
x264enc bframes=0 key-int-max=60
```

檢閱日誌輸出時，請注意上傳用戶端從 Kinesis Video Streams 接收 ACKs 的頻率。產生的關鍵影格越多，傳回ACKs 越多。

### 媒體失真或有成品
<a name="rpi-troubleshoot-distortion"></a>

若要疑難排解此問題，請確定所有纜線都已緊密連接。檢閱攝影機模組的輸出 `libcamera-hello`（或`raspistill`舊版 Pi 攝影機的輸出）。

在您的 GStreamer 管道中，將 取代`kvssink`為 `autovideosink`或 `matroskamux`和 `filesink`。例如：

```
... x264enc tune=zerolatency speed-preset=ultrafast bframes=0 key-int-max=60 byte-stream=true ! h264parse ! matroskamux ! filesink location=output.mkv 
```

檢閱 的輸出檔案，`filesink`或是使用 時開啟的媒體播放器`autovideosink`，以查看成品是否也存在。

同時檢閱下列管道的輸出：

```
gst-launch-1.0 autovideosrc ! videoconvert ! autovideosink
```

將元素新增至管道，例如[去彎曲](https://gstreamer.freedesktop.org/documentation/opencv/dewarp.html?gi-language=c)，可以修正魚眼攝影機輸出。

檢閱攝影機支援的輸出轉碼器，並視需要調整元素。

例如，如果您的 USB 攝影機僅支援 JPEG 輸出，則您將需要使用 `jpegparse`和 `jpegdec`元素來轉換媒體，然後再使用 將其編碼為 H.264`x264enc`。在 GStreamer 論壇上搜尋具有類似管道和/或網路攝影機設定的其他使用者的協助。

# 針對適用於 Raspberry Pi 的 C\$1\$1 生產者 SDK 的建置問題進行故障診斷
<a name="troubleshoot-rpi"></a>

如果您遇到建置問題，並想要嘗試不同的 CMake 引數，請務必執行乾淨的建置。刪除 `open-source`、 `dependency`和 `build` 資料夾，然後再試一次。

## 使用 OpenSSL 建置問題
<a name="troubleshoot-rpi-build"></a>

如果您收到類似以下的輸出，則表示 OpenSSL 未正確偵測到您的系統架構。

```
crypto/md5/md5-aarch64.S: Assembler messages:
crypto/md5/md5-aarch64.S:3: Error: unrecognized symbol type ""
crypto/md5/md5-aarch64.S:6: Error: bad instruction `stp x19,x20,[sp,#-80]!'
crypto/md5/md5-aarch64.S:7: Error: bad instruction `stp x21,x22,[sp,#16]'
crypto/md5/md5-aarch64.S:8: Error: bad instruction `stp x23,x24,[sp,#32]'
crypto/md5/md5-aarch64.S:9: Error: bad instruction `stp x25,x26,[sp,#48]'
```

在此範例中，當 Raspberry Pi 實際上是 32 位元時，它會嘗試建置 64 位元版本 (`linux-aarch64`)。有些 Raspberry Pi 裝置具有 64 位元的核心，但有 32 位元的使用者空間。

決定 OpenSSL 嘗試建置的架構。您可以在 OpenSSL `configure` 的步驟中找到日誌列：

```
[ 33%] Performing update step for 'project_libopenssl'
-- Already at requested tag: OpenSSL_1_1_1t
[ 44%] No patch step for 'project_libopenssl'
[ 55%] Performing configure step for 'project_libopenssl'
Operating system: x86_64-whatever-linux2
Configuring OpenSSL version 1.1.1t (0x1010114fL) for linux-x86_64
Using os-specific seed configuration
Creating configdata.pm
Creating Makefile
```

驗證系統的架構：
+ 檢閱核心位元程度：執行 `uname -m`
+ 檢閱使用者空間位元：執行 `getconf LONG_BIT`

您也可以使用 `cat /proc/cpuinfo`或 `lscpu`命令檢閱 CPU 資訊。

**解決方法：**

若要解決此問題，請在建置時新增下列 CMake 引數，以確保 OpenSSL 針對 32 位元 ARM 架構正確建置：

```
-DBUILD_OPENSSL_PLATFORM=linux-armv4 
```

## 對 GStreamer 中的`kvssink`載入問題進行故障診斷
<a name="troubleshoot-rpi-kvssink"></a>

確認 `GST_PLUGIN_PATH`

確保目前 Shell 工作階段中的`GST_PLUGIN_PATH`環境變數指向包含 的目錄`kvssink`。環境變數是工作階段特定的，因此您需要為每個新工作階段設定它們。若要讓此變更永久存在，請參閱「更新 shell 的啟動指令碼以包含設定 GST\$1PLUGIN\$1PATH 環境變數」。

**錯誤：無法開啟共用物件檔案：沒有此類檔案或目錄**

如果您遇到錯誤 `Cannot open shared object file: No such file or directory`，請執行下列命令：

```
gst-inspect-1.0 /path/to/libgstkvssink.so
```

如果您收到下列輸出，表示動態連結器找不到 所需的程式庫`kvssink`。這通常是因為：
+ `kvssink` 移至與建置位置不同的位置。
+ 交叉編譯錯誤的 CPU 架構。
+ 缺少必要的相依性。

**輸出：**

```
WARNING: erroneous pipeline: no element "kvssink"
error while loading shared libraries: libcproducer.so: cannot open shared object file: No such file or directory
```

**解決方法：**

對於**移動的程式庫**，請將包含遺失程式庫的目錄新增至 `LD_LIBRARY_PATH`。

從原始儲存庫的根目錄中，您可以使用 `find`公用程式來尋找遺失的程式庫。在終端機中，輸入：

```
find . -name "*libcproducer*" 
```

**輸出：**

```
./build/dependency/libkvscproducer/kvscproducer-src/libcproducer.so
```

Linux 裝置上的檔案路徑分隔符號為 `:`。以下命令會將新的資料夾路徑附加至現有的`LD_LIBRARY_PATH`環境變數，以保留任何先前的值。

在終端機中，輸入：

```
export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/path/to/build/dependency/libkvscproducer/kvscproducer-src
```

**重要**  
環境變數是工作階段特定的。若要保留跨工作階段的變更，請修改 shell 的啟動指令碼。

您可能還需要將 `open-source/local/lib` 新增至您的 `$LD_LIBRARY_PATH`。

**錯誤：./path/to/libcproducer.so.1：無效的 ELF 標頭**

如果您在載入**共用程式庫**時收到此錯誤，可能是因為符號連結損壞 (`symlinks`)。如果主機機器的作業系統與目標機器的 作業系統不相符，Symlinks 可能會中斷。例如，Raspberry Pi 的 MacBook 上的交叉編譯。

另一個可能的原因是建置的二進位檔用於錯誤的架構。例如，如果二進位檔是針對 x86 建置的 (Raspberry Pi 使用 ARM CPUs)。

導覽至錯誤和類型中指定的程式庫位置： `ls -la`以檢查程式庫 `symlinks`。

**回應：**

```
drwxr-xr-x  16 me  staff      512 Sep 10 17:16 .
drwxr-xr-x   7 me  staff      224 Jan  6 23:46 ..
drwxr-xr-x   4 me  staff      128 Sep 10 17:16 engines-1.1
-rwxr-xr-x   1 me  staff  2294496 Sep 10 17:16 libcrypto.1.1.so
-rw-r--r--   1 me  staff  4002848 Sep 10 17:16 libcrypto.a
lrwxr-xr-x   1 me  staff       19 Sep 10 17:16 libcrypto.so -> libcrypto.1.1.so
-rwxr-xr-x   1 me  staff   631176 Sep 10 17:12 liblog4cplus-2.0.3.so
lrwxr-xr-x   1 me  staff       24 Sep 10 17:12 liblog4cplus.so -> liblog4cplus-2.0.3.so
-rwxr-xr-x   1 me  staff     1012 Sep 10 17:12 liblog4cplus.a
-rwxr-xr-x   1 me  staff   694328 Sep 10 17:12 liblog4cplusU-2.0.3.so
lrwxr-xr-x   1 me  staff       25 Sep 10 17:12 liblog4cplusU.dylib -> liblog4cplusU-2.0.3.so
-rwxr-xr-x   1 me  staff     1017 Sep 10 17:12 liblog4cplusU.a
-rwxr-xr-x   1 me  staff   536416 Sep 10 17:16 libssl.1.1.so
-rw-r--r--   1 me  staff   795184 Sep 10 17:16 libssl.a
lrwxr-xr-x   1 me  staff       16 Sep 10 17:16 libssl.so -> libssl.1.1.so
drwxr-xr-x   6 me  staff      192 Sep 10 17:16 pkgconfig
```

在上述範例輸出中， `symlinks` 不會中斷。中斷`symlinks`不會有指向其目標的箭頭。

**解決方法：**

有兩種選項可以修正符號連結：
+ **建議：**`symlink`使用 `ln`命令重新建立 。類型：

  ```
  ln -s /path/to/actual/library /path/to/symlink
  ```
+ 複製實際的程式庫檔案，並將其重新命名以符合 `symlink`。
**注意**  
此選項會導致儲存用量增加。

最佳實務是使用 Docker 等工具在相同的作業系統上編譯 ，以避免跨編譯問題。

**缺少相依性：**

如果缺少的程式庫名稱以 開頭`libkvs`，請參閱上面「移動的程式庫」一節，將 Kinesis Video Streams 程式庫從主機裝置安裝到目標裝置。

否則，請遵循 [安裝軟體先決條件](producersdk-cpp-rpi-software.md)以確保目標裝置上已安裝所有開放原始碼軟體先決條件。