

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

# 使用 C 生產者程式庫
<a name="producer-sdk-c-api"></a>

您可以使用 Amazon Kinesis Video Streams 提供的 C 生產者程式庫撰寫應用程式程式碼，將媒體資料從裝置傳送至 Kinesis 影片串流。

## 物件模型
<a name="producer-sdk-c-objectmodel"></a>

Kinesis Video Streams C 生產者程式庫是以稱為 Platform Independent Codebase (PIC) 的常見元件為基礎，可在 GitHub 上取得，網址為 [https://github.com/awslabs/amazon-kinesis-video-streams-pic/](https://github.com/awslabs/amazon-kinesis-video-streams-pic/)：//。PIC 包含基礎元件的平台獨立商業邏輯。Kinesis Video Streams C 生產者程式庫使用額外的 API 層包裝 PIC，允許案例和平台特定的回呼和事件。Kinesis Video Streams C 生產者程式庫具有下列建置在 PIC 上的元件：
+ **裝置資訊提供者** – 公開可直接提供給 PIC API 的`DeviceInfo`結構。您可以設定一組提供者，包括應用程式案例最佳化提供者，可根據應用程式處理的串流數量和類型，以及根據可用 RAM 數量設定的所需緩衝量來最佳化內容存放區。
+ **串流資訊提供者** – 公開可直接提供給 PIC API 的`StreamInfo`結構。有一組特定於應用程式類型和常見串流案例類型的提供者。這些包括視訊、音訊、音訊和視訊多軌等供應商。這些案例都有預設值，您可以根據應用程式的需求進行自訂。
+ **回呼提供者** – 公開可直接提供給 PIC API 的`ClientCallbacks`結構。這包括一組用於聯網的回呼提供者 (CURL 型 API 回呼）、授權 (AWS 憑證 API)，以及在錯誤回呼時重試串流。回呼提供者 API 需要設定許多引數，例如 AWS 區域 和 授權資訊。這可透過使用 IoT 憑證或使用 AWS AccessKeyId、SecretKey 或 SessionToken 來完成。如果您的應用程式需要進一步處理特定回呼，才能實現一些應用程式特定邏輯，您可以使用自訂回呼來增強回呼提供者。
+ **FrameOrderCoordinator** – 協助處理多軌案例的音訊和視訊同步。它具有預設行為，您可以自訂以處理應用程式的特定邏輯。它也會先簡化 PIC Frame 結構中的影格中繼資料封裝，再將其提交至底層 PIC API。對於非多軌案例，此元件是 PIC putFrame API 的傳遞。

C 程式庫提供以下物件，管理將資料傳送到 Kinesis 影片串流的作業：
+ **KinesisVideoClient** – 包含您的裝置相關資訊，並維護要報告 Kinesis Video Streams 事件的回呼。
+ **KinesisVideoStream** – 代表視訊串流參數的相關資訊，例如名稱、資料保留期和媒體內容類型。

## 將媒體放入串流
<a name="producer-sdk-c-putframe"></a>

您可以使用 C 程式庫提供的方法 （例如 `PutKinesisVideoFrame`) 將資料放入`KinesisVideoStream`物件。然後程式庫會管理資料的內部狀態，包括以下任務：
+ 執行身分驗證。
+ 查看網路延遲。如果延遲太高，程式庫可能選擇減少影格數。
+ 追蹤進行中串流的狀態。

## 程序：使用 C 生產者 SDK
<a name="producer-sdk-c-using"></a>

此程序示範如何在 C 應用程式中使用 Kinesis Video Streams 用戶端和媒體來源，將 H.264 編碼的影片影格傳送至您的 Kinesis 影片串流。

此程序包含以下步驟：
+ [下載 C 生產者程式庫程式碼](producersdk-c-download.md)
+ [撰寫並檢查程式碼](producersdk-c-write.md)
+ [執行並驗證程式碼](producersdk-c-test.md)

# 先決條件
<a name="producer-sdk-c-prerequisites"></a>

設定 C 生產者 SDK 之前，請確定您有下列先決條件：
+ **登入**資料 – 在範例程式碼中，您可以透過指定您在登入資料設定檔檔案中設定的設定檔來提供 AWS 登入資料。如果您尚未這麼做，請先設定您的登入資料設定檔。

  如需詳細資訊，請參閱[設定用於開發的 AWS 登入資料和區域](https://docs.aws.amazon.com/sdk-for-java/v1/developer-guide/setup-credentials.html)。
+ **憑證存放區整合** – Kinesis Video Streams 生產者程式庫必須與呼叫的服務建立信任。這是透過驗證公有憑證存放區中的憑證授權單位 (CAs) 來完成。在以 Linux 為基礎的模型中，此存放位於 `/etc/ssl`/ 目錄。

  將下列位置的憑證下載到您的憑證存放區：

  [https://www.amazontrust.com/repository/SFSRootCAG2.pem](https://www.amazontrust.com/repository/SFSRootCAG2.pem)
+ 安裝下列適用於 macOS 的建構相依性：
  + [Autoconf 2.69](http://www.gnu.org/software/autoconf/autoconf.html) (授權 GPLv3\$1/Autoconf：GNU GPL 第 3 版或更新版本) 
  + [CMake 3.7 或 3.8](https://cmake.org/)
  + [Pkg-Config](https://www.freedesktop.org/wiki/Software/pkg-config/)
  + xCode (macOS)/clang/gcc (xcode-select 2347 版)
  + Java 開發套件 (JDK) (適用於 Java JNI 編譯)
  + [Lib-Pkg](https://github.com/freebsd/pkg/tree/master/libpkg)
+ 安裝下列 Ubuntu 的建置相依性：
  + Git： `sudo apt install git`
  + [CMake：](http://kitware.com/cmake)`sudo apt install cmake`
  + G\$1\$1： `sudo apt install g++`
  + pkg-config： `sudo apt install pkg-config`
  + OpenJDK： `sudo apt install openjdk-8-jdk`
  + 設定 `JAVA_HOME` 環境變數：`export JAVA_HOME=/usr/lib/jvm/java-8-openjdk-amd64/`

# 下載 C 生產者程式庫程式碼
<a name="producersdk-c-download"></a>

在本節中，您會下載低階程式庫。如需此範例的先決條件和其他詳細資訊，請參閱 [使用 C\$1\$1 生產者程式庫](producer-sdk-cpp.md)。





1. 建立目錄，然後從 GitHub 儲存庫複製範例原始碼。

   ```
   git clone --recursive https://github.com/awslabs/amazon-kinesis-video-streams-producer-c.git
   ```
**注意**  
如果您錯過了搭配 `--recursive` 執行 Git 複製，請在 `amazon-kinesis-video-streams-producer-c/open-source` 目錄中運行 `git submodule update --init` 。您也必須安裝 pkg-config、CMake 和建置環境。  
如需詳細資訊，請參閱 https：//[https://github.com/awslabs/amazon-kinesis-video-streams-producer-c.git](https://github.com/awslabs/amazon-kinesis-video-streams-producer-c.git) `README.md`中的 。

1. 在您選擇的整合開發環境 (IDE) 中開啟程式碼 (例如 [Eclipse](https://www.eclipse.org/))。

# 撰寫並檢查程式碼
<a name="producersdk-c-write"></a>

在本節`KvsVideoOnlyStreamingSample.c`中，您會在 GitHub 上 [https://github.com/awslabs/amazon-kinesis-video-streams-producer-c](https://github.com/awslabs/amazon-kinesis-video-streams-producer-c) 儲存庫的 `samples`資料夾中檢查範例應用程式的程式碼。您在上一個步驟中下載了此程式碼。此範例示範如何使用 C 生產者程式庫，將資料夾內的 H.264 編碼影片影格`samples/h264SampleFrames`傳送至 Kinesis 影片串流。

此範例應用程式有三個部分：
+ 初始化及設定：
  + 初始化及設定平台特定的媒體管道。
  + 初始化及設定管道的 KinesisVideoClient 和 KinesisVideoStream、設定回呼、整合案例特定驗證、擷取和提交轉碼器私有資料，以及讓串流成為「就緒」狀態。
+ 主要迴圈：
  + 從包含時間戳記及旗標的媒體管道取得影格。
  + 提交影格至 KinesisVideoStream。
+ 分解：
  + 停止 (同步) KinesisVideoStream、釋放 KinesisVideoStream、釋放 KinesisVideoClient。

此範例應用程式完成下列任務：
+ 呼叫 `createDefaultDeviceInfo` API 以建立 `deviceInfo` 物件，其中包含裝置或儲存組態的相關資訊。

  ```
  // default storage size is 128MB. Use setDeviceInfoStorageSize after create to change storage size.
  CHK_STATUS(createDefaultDeviceInfo(&pDeviceInfo));
  // adjust members of pDeviceInfo here if needed
      pDeviceInfo->clientInfo.loggerLogLevel = LOG_LEVEL_DEBUG;
  ```
+ 呼叫 `createRealtimeVideoStreamInfoProvider` API 以建立 `StreamInfo` 物件。

  ```
  CHK_STATUS(createRealtimeVideoStreamInfoProvider(streamName, DEFAULT_RETENTION_PERIOD, DEFAULT_BUFFER_DURATION, &pStreamInfo));
  // adjust members of pStreamInfo here if needed
  ```
+ 呼叫 `createDefaultCallbacksProviderWithAwsCredentials` API，根據靜態 AWS 登入資料建立預設回呼提供者。

  ```
  CHK_STATUS(createDefaultCallbacksProviderWithAwsCredentials(accessKey,
                                                                  secretKey,
                                                                  sessionToken,
                                                                  MAX_UINT64,
                                                                  region,
                                                                  cacertPath,
                                                                  NULL,
                                                                  NULL,
                                                                  FALSE,
                                                                  &pClientCallbacks));
  ```
+ 呼叫 `createKinesisVideoClient` API 以建立包含裝置儲存相關資訊的`KinesisVideoClient`物件，並維護回呼以報告 Kinesis Video Streams 事件。

  ```
  CHK_STATUS(createKinesisVideoClient(pDeviceInfo, pClientCallbacks, &clientHandle));                
  ```
+ 呼叫 `createKinesisVideoStreamSync` API 以建立 `KinesisVideoStream` 物件。

  ```
  CHK_STATUS(createKinesisVideoStreamSync(clientHandle, pStreamInfo, &streamHandle));                
  ```
+ 設定範例影格並呼叫 `PutKinesisVideoFrame` API，將該影格傳送至 `KinesisVideoStream` 物件。

  ```
   // setup sample frame
      MEMSET(frameBuffer, 0x00, frameSize);
      frame.frameData = frameBuffer;
      frame.version = FRAME_CURRENT_VERSION;
      frame.trackId = DEFAULT_VIDEO_TRACK_ID;
      frame.duration = HUNDREDS_OF_NANOS_IN_A_SECOND / DEFAULT_FPS_VALUE;
      frame.decodingTs = defaultGetTime(); // current time
      frame.presentationTs = frame.decodingTs;
  
      while(defaultGetTime() > streamStopTime) {
          frame.index = frameIndex;
          frame.flags = fileIndex % DEFAULT_KEY_FRAME_INTERVAL == 0 ? FRAME_FLAG_KEY_FRAME : FRAME_FLAG_NONE;
          frame.size = SIZEOF(frameBuffer);
  
          CHK_STATUS(readFrameData(&frame, frameFilePath));
  
          CHK_STATUS(putKinesisVideoFrame(streamHandle, &frame));
          defaultThreadSleep(frame.duration);
  
          frame.decodingTs += frame.duration;
          frame.presentationTs = frame.decodingTs;
          frameIndex++;
          fileIndex++;
          fileIndex = fileIndex % NUMBER_OF_FRAME_FILES;
      }
  ```
+ 分解：

  ```
  CHK_STATUS(stopKinesisVideoStreamSync(streamHandle));
  CHK_STATUS(freeKinesisVideoStream(&streamHandle));
  CHK_STATUS(freeKinesisVideoClient(&clientHandle));
  ```

# 執行並驗證程式碼
<a name="producersdk-c-test"></a>



若要執行和驗證 的程式碼[使用 C\$1\$1 生產者程式庫](producer-sdk-cpp.md)，請執行下列動作：

1. 執行下列命令，在[下載的 C 開發套件](https://github.com/awslabs/amazon-kinesis-video-streams-producer-c.git)中建立`build`目錄，並從`cmake`中啟動：

   ```
   mkdir -p amazon-kinesis-video-streams-producer-c/build; 
   cd amazon-kinesis-video-streams-producer-c/build; 
   cmake ..
   ```

   您可以將以下選項傳給 `cmake ..`
   + `-DBUILD_DEPENDENCIES` - 是否根據來源的程式庫建置 。
   + `-DBUILD_TEST=TRUE` - 建置單位和整合測試。可能有助於確認對裝置的支援。

     `./tst/webrtc_client_test`
   + `-DCODE_COVERAGE` - 啟用涵蓋範圍報告。
   + `-DCOMPILER_WARNINGS` - 啟用所有編譯器警告。
   + `-DADDRESS_SANITIZER` - 使用 AddressSanitizer 建置 。
   + `-DMEMORY_SANITIZER` - 使用 MemorySanitizer 建置 。
   + `-DTHREAD_SANITIZER` - 使用 ThreadSanitizer 建置 。
   + `-DUNDEFINED_BEHAVIOR_SANITIZER` - 使用 UndefinedBehaviorSanitizer 建置 。
   + `-DALIGNED_MEMORY_MODEL` - 僅針對對齊記憶體模型的裝置建立。預設值為 `OFF`。

1. 導覽至您剛使用上一個步驟建立的`build`目錄，然後執行 `make` 來建置 WebRTC C 開發套件及其提供的範例。

   ```
   make                
   ```

1. 範例應用程式會將資料夾內的 `kinesis_video_cproducer_video_only_sample` h.264 編碼影片影格`samples/h264SampleFrames`傳送至 Kinesis Video Streams。下列命令會將迴圈中的影片影格 10 秒傳送至 Kinesis Video Streams：

   ```
   ./kinesis_video_cproducer_video_only_sample YourStreamName 10
   ```

   如果您想要從另一個資料夾 （例如 `MyH264FramesFolder`) 傳送 H.264 編碼的影格，請使用下列引數執行範例：

   ```
   ./kinesis_video_cproducer_video_only_sample YourStreamName 10 MyH264FramesFolder
   ```

1. 若要啟用詳細日誌，請取消 `CMakeList.txt` 中適當的程式列來定義 `HEAP_DEBUG` 和 `LOG_STREAMING` C-defines。

在 IDE 中，您可以監控偵錯輸出測試套件的進度。您也可以在 Amazon CloudWatch 主控台中觀看與串流相關聯的指標，例如 ，來監控串流上的流量`PutMedia.IncomingBytes`。

**注意**  
因為測試工具只傳送空位元組的影格，所以主控台不會將資料顯示為視訊串流。