

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

# 使用 C\$1\$1 生產者程式庫
<a name="producer-sdk-cpp"></a>

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

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

C\$1\$1 程式庫提供下列物件來管理將資料傳送至 Kinesis 影片串流：
+ **KinesisVideoProducer：**包含媒體來源和 AWS 登入資料的相關資訊，並維護回呼以報告 Kinesis Video Streams 事件。
+ **KinesisVideoStream：**代表 Kinesis 影片串流。包含視訊串流參數的相關資訊，例如名稱、資料保留期和媒體內容類型。

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

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

## 回呼介面
<a name="producer-sdk-cpp-callbacks"></a>

此層公開一組回呼界面，使其能與應用程式層溝通。這些回呼界面包含以下項目：


+ **服務回呼界面 (`CallbackProvider`)：**程式庫會在建立串流、取得串流描述，以及刪除串流時，叫用透過此界面取得的事件。
+ **用戶端就緒狀態或低儲存事件界面 (`ClientCallbackProvider`)：**當用戶端就緒，或偵測到其可能耗盡可用儲存體或記憶體時，程式庫會在此界面上叫用事件。
+ **串流事件回呼界面 (`StreamCallbackProvider`)：**當串流事件發生時，程式庫會在此界面上叫用事件，例如進入就緒狀態的串流、捨棄影格或串流錯誤。

Kinesis Video Streams 提供這些介面的預設實作。您也可以提供自己的自訂實作，例如，如果您需要自訂聯網邏輯，或想要向使用者介面公開低儲存條件。

如需生產者程式庫中回呼的詳細資訊，請參閱 [生產者開發套件回呼](producer-reference-callbacks.md)。

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

此程序示範如何在 C\$1\$1 應用程式中使用 Kinesis Video Streams 用戶端和媒體來源，將資料傳送至 Kinesis 影片串流。

此程序包含以下步驟：

**Topics**

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

在您設定 C\$1\$1 生產者 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 原生界面 (JNI) 時，才需要此操作。
  + 設定 `JAVA_HOME` 環境變數：`export JAVA_HOME=/usr/lib/jvm/java-8-openjdk-amd64/`

# 下載並設定 C\$1\$1 生產者程式庫程式碼
<a name="producersdk-cpp-download"></a>

如需如何下載和設定 C\$1\$1 生產者程式庫的資訊，請參閱 [Amazon Kinesis Video Streams CPP Producer、GStreamer Plugin 和 JNI](https://github.com/awslabs/amazon-kinesis-video-streams-producer-sdk-cpp)。

如需此範例的先決條件和詳細資訊，請參閱 [使用 C\$1\$1 生產者程式庫](producer-sdk-cpp.md)。

## CMake 引數
<a name="cmake-arguments"></a>

以下是 C\$1\$1 Producer SDK 特定 CMake 引數的參考表。您也可以將[標準 CMake 選項](https://cmake.org/cmake/help/latest/manual/cmake-env-variables.7.html)傳遞給 CMake。

**重要**  
這些都是選用的。

**包含或排除特定功能的旗標**


| CMake 引數 | Type | 預設 | 說明 | 
| --- | --- | --- | --- | 
| `BUILD_DEPENDENCIES` |  Boolean  |  ON  | 從來源建置相依性。否則，請使用已安裝在系統上的相依性。如果找不到其中一個必要的相依性，則會傳回錯誤。 | 
| `BUILD_GSTREAMER_PLUGIN` | Boolean |  OFF  | 建置 kvssink GStreamer 外掛程式。 | 
|  `BUILD_JNI`  | Boolean |  OFF  | 建置 Java 原生界面 (JNI)，以便能夠從 Java 執行時間環境呼叫此程式碼。 | 
|  `ALIGNED_MEMORY_MODEL`  | Boolean |  OFF  | 如果記憶體配置應對齊 8 位元組邊界。有些架構不允許未對齊的記憶體存取。 | 
| `CONSTRAINED_DEVICE` | Boolean |  OFF  | 僅限非 Windows。開啟時， 會將執行緒堆疊大小設定為 0.5 MiB。[Alpine Linux](https://wiki.alpinelinux.org/wiki/Main_Page) 組建需要。否則，會使用作業系統預設值。 | 
|  `BUILD_STATIC`  | Boolean |  OFF  | 將程式庫和可執行檔建置為[共用](https://en.wikipedia.org/wiki/Shared_library) (OFF) 或[靜態](https://en.wikipedia.org/wiki/Static_library) (ON)。 | 
|  `ADD_MUCLIBC`  | Boolean |  OFF  | 連結至 [uClibc](https://en.wikipedia.org/wiki/UClibc) 而非標準 C 程式庫，這是專為嵌入式系統設計的小型 C 標準程式庫。 | 
|  `OPEN_SRC_INSTALL_PREFIX`  |  String  | ../open-source/local | 如果從來源建置，安裝開放原始碼相依性的位置。 | 

**跨編譯的旗標**

**重要**  
如果您的目標和主機機器 CPU 架構不同，請設定這些架構。


| CMake 引數 | Type | 預設 | 說明 | 
| --- | --- | --- | --- | 
| `BUILD_LOG4CPLUS_HOST` |  String  |  ""  | 為指定的 CPU 架構建置log4cplus相依性。如果未設定， log4cplus會自動偵測並使用主機機器的 CPU 架構。 | 
| `BUILD_OPENSSL_PLATFORM`  |  String  |  ""  | 為指定的 CPU 架構建置OpenSSL相依性。如果未設定， OpenSSL會自動偵測並使用主機機器的 CPU 架構。 | 

**與測試相關的旗標**


| CMake 引數 | Type | 預設 | 說明 | 
| --- | --- | --- | --- | 
| `BUILD_TEST` |  Boolean  |  OFF  | 建置單元和整合測試。若要執行所有測試，./tst/producerTest請從建置目錄執行 。 AWS 需要登入資料才能執行測試。 | 
| `CODE_COVERAGE` | Boolean | OFF | 僅適用於 GNU/Clang 編譯器。使用 [gcov](https://gcc.gnu.org/onlinedocs/gcc/Gcov.html) 和產生報告來啟用程式碼涵蓋範圍集合。 | 
| `COMPILER_WARNINGS` | Boolean | OFF | 僅適用於 GNU/Clang 編譯器。啟用所有編譯器警告。 | 
| `ADDRESS_SANITIZER` | Boolean | OFF | 僅適用於 GNU/Clang 編譯器。使用 [AddressSanitizer](https://compiler-rt.llvm.org/) 建置 。 | 
| `MEMORY_SANITIZER` | Boolean | OFF | 僅適用於 GNU/Clang 編譯器。使用 [MemorySanitizer](https://compiler-rt.llvm.org/) 建置 。 | 
| `THREAD_SANITIZER` | Boolean | OFF | 僅適用於 GNU/Clang 編譯器。使用 [ThreadSanitizer](https://compiler-rt.llvm.org/) 建置 。 | 
| `UNDEFINED_BEHAVIOR_SANITIZER` | Boolean | OFF | 僅適用於 GNU/Clang 編譯器。使用 [UndefinedBehaviorSanitizer](https://compiler-rt.llvm.org/) 建置 。 | 

若要使用這些 CMake 引數，請依照 `cmake ..`命令以空格分隔的`-Dkey=value`配對清單傳遞這些引數。例如：

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

CMake 會遵循 `$PATH`變數尋找編譯器工具鏈。在執行 CMake 之前，請設定 `CC`和 `CXX`環境變數，以明確設定用於跨編譯的工具鏈。

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

在 的本節中[使用 C\$1\$1 生產者程式庫](producer-sdk-cpp.md)，您會檢查 C\$1\$1 測試工具組中的程式碼 (`tst/ProducerTestFixture.h` 和其他 檔案）。您在上一節中下載了此程式碼。

**平台獨立** C\$1\$1 範例顯示下列編碼模式：
+ 建立 執行個體`KinesisVideoProducer`以存取 Kinesis Video Streams。
+ 建立 `KinesisVideoStream` 的執行個體。 AWS 帳戶 如果相同名稱的串流尚未存在，這會在 中建立 Kinesis 影片串流。
+ 當可用時，在 `KinesisVideoStream` 上呼叫每個資料畫面的 `putFrame`，將其傳送到串流。

下列各節提供有關此編碼模式的詳細資訊。



## 建立 KinesisVideoProducer 的執行個體
<a name="producersdk-cpp-write-create-producer"></a>

您呼叫 `KinesisVideoProducer` 方法建立 `KinesisVideoProducer::createSync` 物件。下列範例在 `KinesisVideoProducer` 檔案中建立 `ProducerTestFixture.h`：

```
kinesis_video_producer_ = KinesisVideoProducer::createSync(move(device_provider_),
    move(client_callback_provider_),
    move(stream_callback_provider_),
    move(credential_provider_),
    defaultRegion_);
```

`createSync` 方法會使用下列三個參數：
+ `DeviceInfoProvider` 物件，其會傳回包含裝置或存放區組態相關資訊的 `DeviceInfo` 物件。
**注意**  
您使用 `deviceInfo.storageInfo.storageSize` 參數設定內容存放區大小。您的內容串流會共用內容存放區。若要判斷您的儲存大小需求，請將平均畫面大小乘以為所有串流最大持續時間存放的畫面數量，再乘以 1.2 以計算磁碟重組。例如，假設您的應用程式具有以下組態：  
三個串流
最大持續時間 3 分鐘
每個串流為每秒 30 個影格 (FPS)
每個畫面大小為 10,000 KB
此應用程式的內容存放區需求為 **3 （串流） \$1 3 （分鐘） \$1 60 （分鐘內秒） \$1 10000 (kb) \$1 1.2 （重組額度） = 194.4 Mb \$1 200 Mb。**
+ `ClientCallbackProvider` 物件，其會傳回報告用戶端特定事件的函數指標。
+ `StreamCallbackProvider` 物件，其會傳回串流特定事件發生後收回的函數指標。
+ `CredentialProvider` 物件，可讓您存取 AWS 登入資料環境變數。
+ The AWS 區域 ("us-west-2")。服務端點取決於區域。

## 建立 KinesisVideoStream 的執行個體
<a name="producersdk-cpp-write-create-stream"></a>

您呼叫使用 `StreamDefinition` 參數的 `KinesisVideoProducer::CreateStream` 方法建立 `KinesisVideoStream` 物件。該範例會在 `ProducerTestFixture.h` 檔案中建立 `KinesisVideoStream`，並將軌道類型設為視訊，軌道 ID 設為 1：

```
auto stream_definition = make_unique<StreamDefinition>(stream_name,
                                               hours(2),
                                               tags,
                                               "",
                                               STREAMING_TYPE_REALTIME,
                                               "video/h264",
                                               milliseconds::zero(),
                                               seconds(2),
                                               milliseconds(1),
                                               true,
                                               true,
                                               true);
return kinesis_video_producer_->createStream(move(stream_definition));
```

`StreamDefinition` 物件包含以下欄位：
+ 串流名稱。
+ 資料保留期間。
+ 標籤的串流。這些標籤可供消費者應用程式用於尋找正確的串流，或是取得更多關於串流的資訊。​也可以在 AWS 管理主控台​ 查看這些標籤。
+ AWS KMS 串流的加密金鑰。如需詳細資訊，請參閱[Kinesis Video Streams 中的資料保護](how-kms.md)。
+ 串流類型。目前唯一有效的值為：`STREAMING_TYPE_REALTIME`。
+ 媒體內容類型。
+ 媒體延遲。此值目前未使用，且應設為 0。
+ 每個片段的播放持續時間。
+ 媒體時間碼擴展。
+ 媒體是否使用關鍵影格片段。
+ 媒體是否使用時間碼。
+ 媒體是否使用絕對片段時間。

## 將音軌新增至 Kinesis 影片串流
<a name="producersdk-cpp-write-add-audiotrack-to-stream"></a>

您可以使用 的 `addTrack`方法，將音訊軌詳細資訊新增至視訊軌串流定義`StreamDefinition`：

```
stream_definition->addTrack(DEFAULT_AUDIO_TRACKID, DEFAULT_AUDIO_TRACK_NAME, DEFAULT_AUDIO_CODEC_ID, MKV_TRACK_INFO_TYPE_AUDIO);
```

`addTrack` 方法需要下列參數：
+ 音軌 ID （做為音訊的 ID)。這應該是唯一且非零的數值。
+ 使用者定義的音軌名稱 （例如，音訊音軌的「音訊」)。
+ 此音軌的轉碼器 ID （例如，音訊音軌 "A\$1AAC")。
+ 音軌類型 （例如，將 MKV\$1TRACK\$1INFO\$1TYPE\$1AUDIO 的列舉值用於音訊）。

如果您有音軌的轉碼器私有資料，則可以在呼叫 addTrack 函數時傳遞。您也可以在建立 KinesisVideoStream 物件之後傳送轉碼器建立私有資料，同時在 KinesisVideoStream 中呼叫開始方法。

## 將影格放入 Kinesis 影片串流
<a name="producersdk-cpp-write-putframe"></a>

您可以使用 將媒體放入 Kinesis 影片串流`KinesisVideoStream::putFrame`，並傳入包含 標頭和媒體資料的`Frame`物件。此範例呼叫 `ProducerApiTest.cpp` 檔案中的 `putFrame`：

```
frame.duration = FRAME_DURATION_IN_MICROS * HUNDREDS_OF_NANOS_IN_A_MICROSECOND;
    frame.size = SIZEOF(frameBuffer_);
    frame.frameData = frameBuffer_;
    MEMSET(frame.frameData, 0x55, frame.size);

    while (!stop_producer_) {
        // Produce frames
        timestamp = std::chrono::duration_cast<std::chrono::nanoseconds>(
                std::chrono::system_clock::now().time_since_epoch()).count() / DEFAULT_TIME_UNIT_IN_NANOS;
        frame.index = index++;
        frame.decodingTs = timestamp;
        frame.presentationTs = timestamp;

        // Key frame every 50th
        frame.flags = (frame.index % 50 == 0) ? FRAME_FLAG_KEY_FRAME : FRAME_FLAG_NONE;
    ...

    EXPECT_TRUE(kinesis_video_stream->putFrame(frame));
```

**注意**  
上述 C\$1\$1 生產者範例會傳送測試資料的緩衝區。在實際的應用程式中，您應該從媒體資源 (例如攝影機) 獲得畫面資料的畫面緩衝和大小。

`Frame` 物件包含以下欄位：
+ 畫面索引。此應為單一遞增的值。
+ 與畫面關聯的旗標。例如，如果設定編碼器產生關鍵影格，將會指定 `FRAME_FLAG_KEY_FRAME` 旗標給此畫面。
+ 解碼時間戳記。
+ 簡報時間戳記。
+ 畫面的持續時間 (到 100 ns 單位)。
+ 畫面的大小 (位元組)。
+ 畫面資料。

如需影格格式的詳細資訊，請參閱 [Kinesis Video Streams 資料模型](how-data.md)。

## 將 KinesisVideoFrame 放入 KinesisVideoStream 的特定軌道
<a name="producersdk-cpp-write-putframeintospecifictrack"></a>

您可以使用 `PutFrameHelper`類別將影格資料放入特定軌道。首先，呼叫 `getFrameDataBuffer`以取得其中一個預先配置緩衝區的指標，以填入`KinesisVideoFrame`資料。然後，您可以呼叫 `putFrameMultiTrack`來傳送 `KinesisVideoFrame`以及布林值，以指出影格資料類型。如果是視訊資料，使用 true，或者，如果影格包含音訊資料，則使用 false。此`putFrameMultiTrack`方法使用佇列機制，以確保 MKV 片段維持單調增加的影格時間戳記，且任兩個片段都不會重疊。例如，片段第一個影格的 MKV 時間戳記應一律大於先前片段最後一個影格的 MKV 時間戳記。

`PutFrameHelper` 具有下列欄位：
+ 佇列中的音訊影格數目上限。
+ 佇列中的影片影格數目上限。
+ 為單一音訊影格配置的大小。
+ 要為單一影片影格配置的大小。

## 存取指標和指標記錄
<a name="producersdk-cpp-write-metrics"></a>

C\$1\$1 生產者 SDK 包含指標和指標記錄的功能。

您可以使用 `getKinesisVideoMetrics`和 `getKinesisVideoStreamMetrics` API 操作來擷取 Kinesis Video Streams 和作用中串流的相關資訊。

以下是來自 `kinesis-video-pic/src/client/include/com/amazonaws/kinesis/video/client/Include.h` 檔案的程式碼。

```
/**
* Gets information about the storage availability.
*
* @param 1 CLIENT_HANDLE - the client object handle.
* @param 2 PKinesisVideoMetrics - OUT - Kinesis Video metrics to be filled.
*
* @return Status of the function call.
*/
PUBLIC_API STATUS getKinesisVideoMetrics(CLIENT_HANDLE, PKinesisVideoMetrics);

/**
* Gets information about the stream content view.
*
* @param 1 STREAM_HANDLE - the stream object handle.
* @param 2 PStreamMetrics - Stream metrics to fill.
*
* @return Status of the function call.
*/
PUBLIC_API STATUS getKinesisVideoStreamMetrics(STREAM_HANDLE, PStreamMetrics);
```

由 `getKinesisVideoMetrics` 填滿的 `PClientMetrics` 物件包含下列資訊：
+ **contentStoreSize：**內容存放區 (用於存放串流資料的記憶體) 的總大小 (位元組)。
+ **contentStoreAvailableSize：**內容存放區中可用的記憶體，以位元組為單位。
+ **contentStoreAllocatedSize：**內容存放區的配置記憶體。
+ **totalContentViewsSize：**用於內容檢視的總記憶體。內容檢視是內容存放區中一系列的資訊索引。
+ **totalFrameRate：**所有作用中串流的每秒畫面彙總數量。
+ **totalTransferRate：**所有串流中每秒傳送的總位元數 (bps)。

由 `getKinesisVideoStreamMetrics` 填滿的 `PStreamMetrics` 物件包含下列資訊：
+ **currentViewDuration：**內容檢視前端 （編碼影格時） 與目前位置 （將影格資料傳送至 Kinesis Video Streams 時） 之間 100 ns 單位的差異。
+ **overallViewDuration：**內容檢視前端 （編碼影格時） 與尾端 （從記憶體排清影格時，因為超過內容檢視的總配置空間，或因為從 Kinesis Video Streams 接收`PersistedAck`訊息，而已知會保留的影格） 之間的 100 ns 單位差異。
+ **currentViewSize：**內容檢視的大小，從前端 （編碼影格時） 到目前位置 （將影格傳送至 Kinesis Video Streams 時）。
+ **overallViewSize：**內容檢視的總大小 (位元組)。
+ **currentFrameRate：**串流的最新測量速率 (每秒畫面數)。
+ **currentTransferRate：**串流的最新測量速率 (每秒位元組)。

## 分解
<a name="producersdk-cpp-write-teardown"></a>

如果您想要傳送緩衝區中剩餘的位元組，並等待 `ACK`，則可以使用 `stopSync`：

```
kinesis_video_stream->stopSync();            
```

或者，您可以呼叫 `stop` 來結束串流：

```
kinesis_video_stream->stop();            
```

停止串流後，您可以透過叫用下列 API 來釋出串流：

```
kinesis_video_producer_->freeStream(kinesis_video_stream);            
```

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

若要執行和驗證 的程式碼[使用 C\$1\$1 生產者程式庫](producer-sdk-cpp.md)，請參閱下列作業系統特定指示：
+ [Linux](https://github.com/awslabs/amazon-kinesis-video-streams-producer-sdk-cpp/blob/master/docs/linux.md)
+ [macOS ](https://github.com/awslabs/amazon-kinesis-video-streams-producer-sdk-cpp/blob/master/docs/macos.md)
+ [Windows](https://github.com/awslabs/amazon-kinesis-video-streams-producer-sdk-cpp/blob/master/docs/windows.md)
+ [Raspberry Pi 作業系統](https://github.com/awslabs/amazon-kinesis-video-streams-producer-sdk-cpp/blob/master/docs/raspberry-pi.md)

您可以在 Amazon CloudWatch 主控台中監看與串流相關聯的指標，例如 ，以監控串流上的流量`PutMedia.IncomingBytes`。

# 使用 C\$1\$1 生產者 SDK 做為 GStreamer 外掛程式
<a name="producer-sdk-cpp-gstreamer"></a>

[GStreamer](https://gstreamer.freedesktop.org/) 是多個攝影機和視訊來源使用的熱門媒體架構，可透過結合模組化外掛程式來建立自訂媒體管道。Kinesis Video Streams GStreamer 外掛程式可簡化現有 GStreamer 媒體管道與 Kinesis Video Streams 的整合。

如需使用 C\$1\$1 生產者 SDK 做為 GStreamer 外掛程式的詳細資訊，請參閱 [範例：Kinesis Video Streams 生產者 SDK GStreamer 外掛程式 - kvssink](examples-gstreamer-plugin.md)。

# 使用 C\$1\$1 生產者 SDK 做為 Docker 容器中的 GStreamer 外掛程式
<a name="producer-sdk-cpp-gstreamer-docker"></a>

[GStreamer](https://gstreamer.freedesktop.org/) 是多個攝影機和視訊來源使用的熱門媒體架構，可透過結合模組化外掛程式來建立自訂媒體管道。Kinesis Video Streams GStreamer 外掛程式可簡化現有 GStreamer 媒體管道與 Kinesis Video Streams 的整合。

此外，使用 [Docker]() 建立 GStreamer 管道會將 Kinesis Video Streams 的操作環境標準化，以簡化應用程式的建置和執行。

如需在 Docker 容器中使用 C\$1\$1 生產者 SDK 做為 GStreamer 外掛程式的詳細資訊，請參閱 [在 Docker 容器中執行 GStreamer 元素](examples-gstreamer-plugin.md#examples-gstreamer-plugin-docker)。

# 搭配 C\$1\$1 生產者 SDK 使用記錄
<a name="producer-sdk-cpp-logging"></a>

您可以在 `kinesis-video-native-build` 資料夾中的 `kvs_log_configuration` 檔案中設定 C\$1\$1 生產者 SDK 應用程式的記錄。

以下範例顯示預設組態檔案的第一行，可用來設定應用程式將 `DEBUG` 層級日誌項目寫至 AWS 管理主控台：

```
log4cplus.rootLogger=DEBUG, KvsConsoleAppender
```

您可以將記錄層級設為 `INFO`，以用於較為詳細的記錄。

若要設定應用程式將日誌項目寫入日誌檔案，請將檔案中的第一行更新為下列項目：

```
log4cplus.rootLogger=DEBUG, KvsConsoleAppender, KvsFileAppender
```

這會把應用程式設為將日誌項目寫入至 `kvs.log` 資料夾的 `kinesis-video-native-build/log` 中。

若要變更日誌檔位置，請以新路徑更新下列行：

```
log4cplus.appender.KvsFileAppender.File=./log/kvs.log
```

**注意**  
如果 `DEBUG` - 層級記錄為寫入至檔案，則日誌檔可能快速用掉裝置上的可用儲存空間。