

本文属于机器翻译版本。若本译文内容与英语原文存在差异，则一律以英文原文为准。

# 使用 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 制作人库基于一个名为平台独立代码库 (PIC) 的通用组件，该组件可在-pic/ GitHub 上https://github.com/awslabs/amazon-kinesis-video-streams找到。](https://github.com/awslabs/amazon-kinesis-video-streams-pic/)PIC 包含基础组件的独立于平台的业务逻辑。Kinesis Video Streams C 制作人库将 PIC 与额外的 API 层封装在一起，允许特定于场景和平台的回调和事件。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 API 之前，它还简化了 PIC 帧结构中的帧元数据打包。对于非多轨道场景，此组件直接传递到 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 客户端和媒体源向你的 Kinesis 视频流发送 H.264 编码的视频帧。

该过程包括以下步骤：
+ [下载 C 制作器库代码](producersdk-c-download.md)
+ [编写并检查代码](producersdk-c-write.md)
+ [运行并验证代码](producersdk-c-test.md)

# 先决条件
<a name="producer-sdk-c-prerequisites"></a>

在设置 C Producer 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-选择版本 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-配置：`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  
有关更多信息，请参阅 in-p [https://github.com/awslabs/amazon-kinesis-video-streamsroducer-c `README.md` .git](https://github.com/awslabs/amazon-kinesis-video-streams-producer-c.git) 中的。

1. 在您选定的集成开发环境 (IDE) (例如 [Eclipse](https://www.eclipse.org/)) 中打开您的代码。

# 编写并检查代码
<a name="producersdk-c-write"></a>

在本节中，您将在-p [https://github.com/awslabs/amazon-kinesis-video-streamsroducer-c `samples`](https://github.com/awslabs/amazon-kinesis-video-streams-producer-c) 存储库的文件夹`KvsVideoOnlyStreamingSample.c`中检查示例应用程序的代码。 GitHub您在上一步中已下载该代码。此示例演示如何使用 C 制作人库将文件夹内的 H.264 编码视频帧发送到`samples/h264SampleFrames`您的 Kinesis 视频流。

此示例应用程序包含三个部分：
+ 初始化和配置：
  + 初始化和配置特定于平台的媒体管道。
  +  KinesisVideoStream为管道初始 KinesisVideoClient 化和配置、设置回调、集成特定场景的身份验证、提取和提交编解码器私有数据，以及将流置于 READY 状态。
+ 主循环：
  + 使用时间戳和标志从媒体管道获取帧。
  + 将框架提交给 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 SDK](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 SDK 及其提供的示例。

   ```
   make                
   ```

1. 示例应用程序`kinesis_video_cproducer_video_only_sample`将文件夹`samples/h264SampleFrames`内的 h.264 编码视频帧发送到 Kinesis Video Streams。以下命令将视频帧循环发送到 Kinesis Video Streams 十秒钟：

   ```
   ./kinesis_video_cproducer_video_only_sample YourStreamName 10
   ```

   如果要从其他文件夹（例如`MyH264FramesFolder`）发送 H.264 编码的帧，请使用以下参数运行示例：

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

1. 若要启用详细日志，请定义 `HEAP_DEBUG` 并通过取消 `CMakeList.txt` 中相应行的注释进行 `LOG_STREAMING` C 定义。

您可以在 IDE 中的调试输出中监控测试套件的进度。您还可以通过在 Amazon CloudWatch 控制台中查看与您的直播相关的指标来监控直播流量，例如`PutMedia.IncomingBytes`。

**注意**  
由于测试框架仅发送空字节的帧，因此，控制台不会将数据显示为视频流。