

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

# Kinesis Video Streams 数据模型
<a name="how-data"></a>

[上传到 Kinesis Video Streams](producer-sdk.md) 和 [使用解析器库观看摄像机的输出](parser-library.md) 以某种格式发送和接收视频数据，此格式支持随视频数据一起嵌入信息。此格式基于 Matroska (MKV) 规范。

[MKV 格式](https://en.wikipedia.org/wiki/Matroska)是适用于媒体数据的开放规范。*亚马逊 Kinesis Video Streams 开发者*指南中的所有库和代码示例都以 MKV 格式发送或接收数据。

[上传到 Kinesis Video Streams](producer-sdk.md)使用`StreamDefinition`和`Frame`类型生成 MKV 流标头、帧标题和帧数据。

有关完整 MKV 规范的信息，请参阅 [Matroska 规范](https://www.matroska.org/technical/specs/index.html)。

以下几节描述了由 [C\$1\$1](producer-sdk-cpp.md) 生成的 MKV 格式数据的组成部分。

**Topics**
+ [流标头元素](#how-data-header-streamdefinition)
+ [直播曲目数据](#how-data-header-streamtrack)
+ [帧头元素](#how-data-header-frame)
+ [MKV 帧数据](#how-data-frame)

## 流标头元素
<a name="how-data-header-streamdefinition"></a>

`StreamDefinition` 使用以下 MKV 标头元素 (在 `StreamDefinition.h` 中定义)。


****  

| Element | 说明 | 典型值 | 
| --- | --- | --- | 
| stream\$1name | 与 Kinesis 视频流的名称相对应。 | my-stream | 
| retention\$1period | Kinesis Video Streams 保留直播数据的持续时间（以小时为单位）。0为不保留数据的直播指定。 | 24 | 
| tags | 用户数据的键-值集合。此数据显示在 AWS 管理控制台 中，可由客户端应用程序读取以筛选或获取有关流的信息。 |  | 
| kms\$1key\$1id | 如果存在，则使用用户定义的 AWS KMS 密钥来加密流中的数据。如果不存在，则通过 Kinesis 提供的密钥 () 对数据进行加密。aws/kinesisvideo | 01234567-89ab-cdef-0123-456789ab | 
| streaming\$1type | 目前，唯一有效的流式处理类型是 STREAMING\$1TYPE\$1REALTIME。 | STREAMING\$1TYPE\$1REALTIME | 
| content\$1type | 用户定义的内容类型。对于要在控制台中播放的流视频数据，内容类型必须为 video/h264。 | video/h264 | 
| max\$1latency | 此值当前未使用，应设置为 0。 | 0 | 
| fragment\$1duration | 这是对片段应持续时间的估计，用于优化。实际的片段持续时间由流数据决定。 | 2 | 
| timecode\$1scale | 表示帧时间戳使用的比例。默认为 1 毫秒。指定 `0` 还将分配 1 毫秒的默认值。此值可以介于 100 纳秒到 1 秒之间。 有关更多信息，请参阅 Matroska 文档[TimecodeScale](https://matroska.org/technical/specs/notes.html#TimecodeScale)中的。 |  | 
| key\$1frame\$1fragmentation | 如果为 true，则流在收到关键帧时将启动一个新集群。 | true | 
| frame\$1timecodes | 如果是true，Kinesis Video Streams 将使用接收到的帧的演示时间戳 (pts) 和解码时间戳 (dts) 值。如果是false，Kinesis Video Streams 将在收到帧时使用系统生成的时间值对其进行标记。 | true | 
| absolute\$1fragment\$1time |  如果为 true，则集群时间码将解释为使用绝对时间 (例如，来自创建者的系统时钟)。如果为 false，则集群时间码将解释为相对于流的开始时间。 | true | 
| fragment\$1acks |  如果为true，则在 Kinesis Video Streams 收到数据时发送确认 (ACKs)。 ACKs 可以使用KinesisVideoStreamFragmentAck或KinesisVideoStreamParseFragmentAck回调接收。 | true | 
| restart\$1on\$1error | 指示在发生流错误后是否应继续传输流。 | true | 
| nal\$1adaptation\$1flags | 指示内容中是否有 NAL (网络抽象层) 改编或编解码器私有数据。有效标记包括 NAL\$1ADAPTATION\$1ANNEXB\$1NALS 和 NAL\$1ADAPTATION\$1ANNEXB\$1CPD\$1NALS。 | NAL\$1ADAPTATION\$1ANNEXB\$1NALS | 
| frame\$1rate | 内容帧速率的估计值。此值用于优化；实际帧速率由传入数据的速率决定。指定 0 将分配默认值 24。 | 24 | 
| avg\$1bandwidth\$1bps | 内容带宽的估计值，以 Mbps 为单位。此值用于优化；实际速率由传入数据的带宽决定。例如，对于按 25 FPS 运行的 720p 分辨率视频流，您可预计平均带宽为 5 Mbps。 | 5 | 
| buffer\$1duration | 要在创建者中缓冲的内容的持续时间。如果网络延迟较低，则可以降低此值。如果网络延迟很高，则增加此值可以防止帧在发送之前被丢弃，因为分配无法将帧放入较小的缓冲区。 |  | 
| replay\$1duration | 如果连接中断，视频数据流 “倒带” 的时间量。如果不考虑因连接丢失而导致的帧丢失，则此值可以为零。如果使用该应用程序可以删除冗余帧，则可以增加该值。此值应小于缓冲持续时间，否则使用缓冲持续时间。 |  | 
| connection\$1staleness | 在未收到数据时保持连接的持续时间。 |  | 
| codec\$1id | 内容使用的编解码器。有关更多信息，请参阅 Matroska 规范中的 [CodecID](https://matroska.org/technical/specs/codecid/index.html)。 | V\$1 MPEG2 | 
| track\$1name | 用户定义的音轨名称。 | my\$1track | 
| codecPrivateData | 编码器提供的数据，用于对许多下游使用者所需的帧数据（例如，以像素表示的帧宽度和高度）进行解码。在 [C\$1\$1 制作器库](producer-sdk-cpp.md)中，中的gMkvTrackVideoBits数组MkvStatics.cpp包括帧的像素宽度和高度。 |  | 
| codecPrivateDataSize | codecPrivateData 参数中数据的大小。 |  | 
| track\$1type | 流的轨道的类型。 | MKV\$1TRACK\$1INFO\$1TYPE\$1AUDIO 或 MKV\$1TRACK\$1INFO\$1TYPE\$1VIDEO | 
| segment\$1uuid | 用户定义的片段 uuid（16 字节）。 |  | 
| default\$1track\$1id | 轨道的唯一非零编号。 | 1 | 

## 直播曲目数据
<a name="how-data-header-streamtrack"></a>

`StreamDefinition` 使用以下 MKV 轨道元素（在 `StreamDefinition.h` 中定义）。


****  

| Element | 说明 | 典型值 | 
| --- | --- | --- | 
| track\$1name | 用户定义的轨道名称。例如，“audio”代表音轨。 | audio | 
| codec\$1id | 轨道的编解码器 ID。例如，“A\$1AAC”代表音轨。 | A\$1AAC | 
| cpd | 编码器提供的数据用于对帧数据进行解码。帧数据可以包括帧的像素宽度和高度，许多下游使用者都需要帧数据。在 [C\$1\$1 制作器库](https://docs.aws.amazon.com//kinesisvideostreams/latest/dg/producer-sdk-cpp.html)中， MkvStatics.cpp 中的 gMkvTrackVideoBits 数组包括帧的像素宽度和高度。 |  | 
| cpd\$1size |  codecPrivateData 参数中数据的大小。 |  | 
| track\$1type | 轨道的类型。例如，您可以对音频使用 MKV\$1TRACK\$1INFO\$1TYPE\$1AUDIO 的枚举值。 | MKV\$1TRACK\$1INFO\$1TYPE\$1AUDIO | 

## 帧头元素
<a name="how-data-header-frame"></a>

`Frame` (在 `mkvgen/Include.h` 中的 `KinesisVideoPic` 程序包中定义) 将使用以下 MKV 标头：
+ **Frame Index：**一个单调递增的值。
+ **Flags：**帧的类型。有效值包括：
  + `FRAME_FLAGS_NONE`
  + `FRAME_FLAG_KEY_FRAME`：如果在流上设置 `key_frame_fragmentation`，关键帧将启动新的片段。
  + `FRAME_FLAG_DISCARDABLE_FRAME`：告知解码器可在解码速度较慢时放弃此帧。
  + `FRAME_FLAG_INVISIBLE_FRAME`：此数据块的持续时间为 0。
+ **解码时间戳：**解码此帧的时间戳。如果之前的帧依赖于此帧进行解码，则此时间戳可能早于前一帧的时间戳。该值相对于片段的开头。
+ **演示时间戳：**显示此帧的时间戳。该值相对于片段的开头。
+ **Duration：**帧的播放持续时间。
+ **Size：**帧数据的大小 (以字节为单位)

## MKV 帧数据
<a name="how-data-frame"></a>

`frame.frameData` 中的数据可能仅包含帧的媒体数据，或可能包含进一步嵌套的标头信息，具体取决于使用的编码架构。要在中显示 AWS 管理控制台，必须使用 [H.264](https://en.wikipedia.org/wiki/H.264/MPEG-4_AVC) 编解码器对数据进行编码，但是 Kinesis Video Streams 可以接收任何格式的时间序列化数据流。