

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

# 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)是適用於媒體資料的開放規格。*Amazon 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>

以下 MKV 標頭元素會由 `StreamDefinition` 所使用 (在 `StreamDefinition.h` 中加以定義)。


****  

| Element | Description | 典型值 | 
| --- | --- | --- | 
| 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。 | 影片/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)。您可以使用 KinesisVideoStreamFragmentAck 或 KinesisVideoStreamParseFragmentAck 回呼來接收 ACK。 | 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 的 720 p 解析度影片串流，您可以預期平均頻寬為 5 Mbps。 | 5 | 
| buffer\$1duration | 內容在生產者上緩衝的持續時間。如果網路延遲低，可以降低此值。如果網路延遲很高，增加此值可防止影格在傳送之前遭到捨棄，因為配置無法將影格放入較小的緩衝區中。 |  | 
| replay\$1duration | 如果連線中斷，視訊資料串流「復原」的時間量。如果因為連線遺失而遺失影格，則此值可以是零。如果耗用的應用程式可以移除備援影格，則可以增加該值。此值應小於緩衝持續時間，否則會使用緩衝持續時間。 |  | 
| connection\$1staleness | 沒有接收到任何資料時，連線的維護持續時間。 |  | 
| codec\$1id | 內容使用的轉碼器。如需詳細資訊，請參閱 Matroska 規格中的 [CodecID](https://matroska.org/technical/specs/codecid/index.html)。 | V\$1MPEG2 | 
| 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>

以下 MKV 軌道元素會由 `StreamDefinition` 所使用 (在 `StreamDefinition.h` 中加以定義)。


****  

| Element | Description | 典型值 | 
| --- | --- | --- | 
| track\$1name | 使用者定義的軌道名稱。例如，「音訊」代表音軌。 | 音訊 | 
| 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 陣列包含影格的像素寬度和高度。 MkvStatics.cpp  |  | 
| cpd\$1size | codecPrivateData 參數中的資料大小。 |  | 
| track\$1type | 軌道的類型。例如，您可以針對音訊使用 MKV\$1TRACK\$1INFO\$1TYPE\$1AUDIO 的列舉值。 | MKV\$1TRACK\$1INFO\$1TYPE\$1AUDIO | 

## 影格標頭元素
<a name="how-data-header-frame"></a>

以下 MKV 標頭元素會由 `Frame` 所使用 (在 `mkvgen/Include.h` 中的 `KinesisVideoPic` 套件中加以定義)。
+ **影格索引：**單調增加的值。
+ **旗標：**影格的類型。有效值包括下列項目：
  + `FRAME_FLAGS_NONE`
  + `FRAME_FLAG_KEY_FRAME`：如果 `key_frame_fragmentation` 是在串流上設定，關鍵影格會開始新的片段。
  + `FRAME_FLAG_DISCARDABLE_FRAME`：告知解碼器，當解碼速度太慢時，其可以放棄此影格。
  + `FRAME_FLAG_INVISIBLE_FRAME`：此區塊的持續時間為 0。
+ **解碼時間戳記：**解碼此影格時的時間戳記。如果先前的影格依賴此影格進行解碼，則此時間戳記可能早於先前影格的時間戳記。這個值相對於該片段的開始。
+ **呈現時間戳記：**此影格顯示時的時間戳記。這個值相對於該片段的開始。
+ **持續時間：**影格播放的持續時間。
+ **大小：**影格資料大小 (以位元組為單位)

## 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 可以接收任何格式的時間序列化資料串流。