

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

# 示例：使用 PutMedia API 向 Kinesis Video Streams 发送数据
<a name="examples-putmedia"></a>

此示例演示了如何使用 [PutMedia](https://docs.aws.amazon.com/kinesisvideostreams/latest/dg/API_dataplane_PutMedia.html)API。它显示了如何发送已经是容器格式 (MKV) 的数据。如果您的数据在发送之前必须汇编成容器格式（例如，如果您要将摄像机视频数据组合成帧），请参阅[上传到 Kinesis Video Streams](producer-sdk.md)。

**注意**  
该`PutMedia`操作仅在 C\+\+ 和 Java 中可用 SDKs。这是因为连接、数据流和确认采用全双工管理。其他语言不支持它。

**Topics**
+ [下载并配置代码](#examples-putmedia-download)
+ [编写并检查代码](#examples-putmedia-write)
+ [运行并验证代码](#examples-putmedia-run)

## 下载并配置代码
<a name="examples-putmedia-download"></a>

按照以下步骤下载 Java 示例代码，将项目导入 Java IDE，配置库位置，然后配置代码以使用您的 AWS 凭据。

1. 创建目录并从 GitHub存储库中克隆示例源代码。`PutMedia` 示例是 [Java](producer-sdk-javaapi.md) 的一部分。

   ```
   git clone https://github.com/awslabs/amazon-kinesis-video-streams-producer-sdk-java
   ```

1. 打开你正在使用的 Java IDE（例如 Eclip [se 或 Intelli](https://www.eclipse.org/) [J ID](https://www.jetbrains.com/idea/) EA），然后导入你下载的 Apache Maven 项目：
   + **在 Eclipse 中：**依次选择 **File** (文件)、**Import** (导入)、**Maven** 和 **Existing Maven Projects** (现有的 Maven 项目)，然后导航到下载的程序包的根目录。选择 `pom.xml` 文件。
   + **在 IntelliJ Idea 中：**选择 **Import**。导航到下载的程序包的根目录中的 `pom.xml` 文件。

    有关更多信息，请参阅相关的 IDE 文档。

1. 更新项目，以便 IDE 可以发现您导入的库。
   + 对于 IntelliJ IDEA，请执行下列操作之一：

     1. 打开项目的 **lib** 目录的上下文菜单 (右键单击)，选择 **Add as library**。

     1. 选择 “**文件**”，然后选择 “**项目结构**”。

     1. 在 **Project Settings** 下，选择 **Modules**。

     1. 在 **Sources (源)** 选项卡中，将 **Language Level (语言级别)** 设置为 **7** 或更大值。
   + 对于 Eclipse，执行以下操作：

     1. 打开项目的上下文菜单 (右键单击)，并依次选择 **Properties**、**Java Build Path** 和 **Source**。然后执行以下操作：

        1. 在 **Source** 选项卡中，双击 **Native library location**。

        1. 在 **Native Library Folder Configuration** 向导中，选择 **Workspace**。

        1. 在 **Native Library Folder** 选择项中，选择项目中的 **lib** 目录。

     1. 打开项目的上下文菜单 (右键单击)，选择 **Properties**。然后执行以下操作：

        1. 在 **Libraries** 选项卡上，选择 **Add Jars**。

        1. 在 **JAR 选择** 向导中，选择项目的 `lib` 目录中的所有 .jar。

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

`PutMedia` API 示例 (`PutMediaDemo`) 显示以下编码模式：

**Topics**
+ [创建 PutMediaClient](#producersdk-javaapi-writecode-putmediaapi-putmediaclient)
+ [对媒体进行流式处理并暂停线程](#producersdk-javaapi-writecode-putmediaapi-run)

此部分中的代码示例来自 `PutMediaDemo` 类。

### 创建 PutMediaClient
<a name="producersdk-javaapi-writecode-putmediaapi-putmediaclient"></a>

创建`PutMediaClient`对象需要以下参数：
+ `PutMedia` 终端节点的 URI。
+ 一个 `InputStream`，指向要流式处理的 MKV 文件。
+ 流名称。此示例使用已在 [使用 Java 制作器库](producer-sdk-javaapi.md) (`my-stream`) 中创建的流。要使用其他流，请更改以下参数：

  ```
  private static final String STREAM_NAME="my-stream";
  ```
**注意**  
`PutMedia`API 示例未创建直播。你必须使用测试应用程序[使用 Java 制作器库](producer-sdk-javaapi.md)、Kinesis Video Streams 控制台或 AWS CLI。
+ 当前时间戳。
+ 时间码类型。此示例使用 `RELATIVE`，指示时间戳相对于容器的开始时间。
+ 一个 `AWSKinesisVideoV4Signer` 对象，验证收到的数据包是否由授权发件人发送。
+ 最大上游带宽 (以 Kbps 为单位)。
+ 一个 `AckConsumer` 对象，用于接收“数据包已接收确认”。

以下代码创建 `PutMediaClient` 对象：

```
/* actually URI to send PutMedia request */
final URI uri = URI.create(KINESIS_VIDEO_DATA_ENDPOINT + PUT_MEDIA_API);

/* input stream for sample MKV file */
final InputStream inputStream = new FileInputStream(MKV_FILE_PATH);

/* use a latch for main thread to wait for response to complete */
final CountDownLatch latch = new CountDownLatch(1);

/* a consumer for PutMedia ACK events */
final AckConsumer ackConsumer = new AckConsumer(latch);

/* client configuration used for AWS SigV4 signer */
final ClientConfiguration configuration = getClientConfiguration(uri);

/* PutMedia client */
final PutMediaClient client = PutMediaClient.builder()
        .putMediaDestinationUri(uri)
        .mkvStream(inputStream)
        .streamName(STREAM_NAME)
        .timestamp(System.currentTimeMillis())
        .fragmentTimeCodeType("RELATIVE")
        .signWith(getKinesisVideoSigner(configuration))
        .upstreamKbps(MAX_BANDWIDTH_KBPS)
        .receiveAcks(ackConsumer)
        .build();
```

### 对媒体进行流式处理并暂停线程
<a name="producersdk-javaapi-writecode-putmediaapi-run"></a>

在创建客户端后，此示例使用 `putMediaInBackground` 开始异步流式处理。随后，主线程将暂停并显示 `latch.await`，直到 `AckConsumer` 返回，此时客户端已关闭。

```
 /* start streaming video in a background thread */
            client.putMediaInBackground();

            /* wait for request/response to complete */
            latch.await();

            /* close the client */
            client.close();
```

## 运行并验证代码
<a name="examples-putmedia-run"></a>

若要运行 `PutMedia` API 示例，请执行以下操作：

1. 在 Kinesis Video Streams 控制台`my-stream`中或使用 AWS CLI创建名为的直播。

1. 将工作目录更改为 Java 创建者开发工具包目录：

   ```
   cd /<YOUR_FOLDER_PATH_WHERE_SDK_IS_DOWNLOADED>/amazon-kinesis-video-streams-producer-sdk-java/
   ```

1. 编译 Java 开发工具包演示应用程序：

   ```
   mvn package
   ```

1. 在 `/tmp` 目录中创建临时文件名：

   ```
   jar_files=$(mktemp)
   ```

1. 创建从本地存储库到文件的依赖项的类路径字符串：

   ```
   mvn -Dmdep.outputFile=$jar_files dependency:build-classpath
   ```

1. 将 `LD_LIBRARY_PATH` 环境变量的值设置如下：

   ```
   export LD_LIBRARY_PATH=/<YOUR_FOLDER_PATH_WHERE_SDK_IS_DOWNLOADED>/amazon-kinesis-video-streams-producer-sdk-cpp/kinesis-video-native-build/downloads/local/lib:$LD_LIBRARY_PATH
   $ classpath_values=$(cat $jar_files)
   ```

1. 按如下所示从命令行运行演示，并提供您的 AWS 凭据：

   ```
   java -classpath target/kinesisvideo-java-demo-1.0-SNAPSHOT.jar:$classpath_values -Daws.accessKeyId=${ACCESS_KEY} -Daws.secretKey=${SECRET_KEY} -Djava.library.path=/opt/amazon-kinesis-video-streams-producer-sdk-cpp/kinesis-video-native-build com.amazonaws.kinesisvideo.demoapp.DemoAppMain
   ```

1. 打开 [Kinesis Video Stream](https://console.aws.amazon.com//kinesisvideo/home/) s 控制台，然后在 “**管理直播” 页面上**选择您的直播。该视频将在 **Video Preview** 窗格中播放。