步驟 2:編寫並檢查代碼 - Amazon Kinesis Video Streams

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

步驟 2:編寫並檢查代碼

在此 C++ Producer Library 程序的區段中,您在 C++ 測試工具 (tst/ProducerTestFixture.h 和其他檔案) 中檢查程式碼。您在上一節中下載了此程式碼。

平台獨立 C++ 範例顯示下列編碼模式:

  • 建立的執行個體KinesisVideoProducer以存取 Kinesis Video Streams。

  • 建立 KinesisVideoStream 的執行個體。 AWS 帳戶 如果不存在相同名稱的串流,這會在您的 Kinesis 視訊串流中建立。

  • 當可用時,在 KinesisVideoStream 上呼叫每個資料畫面的 putFrame,將其傳送到串流。

以下各節提供有關此編碼模式的更多信息。

建立執行個體 KinesisVideoProducer

您呼叫 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 (串流) * 3 (分鐘) * 60 (一分鐘內的秒數) * 10000 (kb) * 1.2 (磁碟重組容量) = 194.4 Mb ~ 200 Mb

  • ClientCallbackProvider 物件,其會傳回報告用戶端特定事件的函數指標。

  • StreamCallbackProvider 物件,其會傳回串流特定事件發生後收回的函數指標。

  • CredentialProvider物件,可讓您存取 AWS 認證環境變數。

  • AWS 區域 (「美國西部 -2」)。服務端點取決於區域。

建立執行個體 KinesisVideoStream

您呼叫使用 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 Management Console​ 查看這些標籤。

  • AWS KMS 串流的加密金鑰。如需詳細資訊,請參閱搭配 Kinesis Video Streams 使用伺服器端加密

  • 串流類型。目前唯一有效的值為:STREAMING_TYPE_REALTIME

  • 媒體內容類型。

  • 媒體延遲。此值目前未使用,應該設定為 0。

  • 每個片段的播放持續時間。

  • 媒體時間碼擴展。

  • 媒體是否使用關鍵影格片段。

  • 媒體是否使用時間碼。

  • 媒體是否使用絕對片段時間。

將音軌新增至 Kinesis 視訊串流

您可以使用下列項目的 addTrack 方法,將音軌詳細資料新增至視訊軌道串流定義: StreamDefinition

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

addTrack 方法需要下列參數:

  • 音軌 ID(作為音頻的一個)。這應該是唯一且非零的數值。

  • 使用者定義的音軌名稱 (例如,音軌的「音訊」)。

  • 此音軌的編解碼器 ID (例如,音軌「A_AAC」)。

  • 軌道類型(例如,對音頻使用 MKV_TRACK_ 類型 _ 音頻的枚舉值)。

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

將影格放入 Kinesis 影片串流

您可以使用將媒體放入 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++ Producer 範例傳送測試資料的緩衝。在實際的應用程式中,您應該從媒體資源 (例如攝影機) 獲得畫面資料的畫面緩衝和大小。

Frame 物件包含以下欄位:

  • 畫面索引。此應為單一遞增的值。

  • 與畫面關聯的旗標。例如,如果設定編碼器產生關鍵影格,將會指定 FRAME_FLAG_KEY_FRAME 旗標給此畫面。

  • 解碼時間戳記。

  • 簡報時間戳記。

  • 畫面的持續時間 (到 100 ns 單位)。

  • 畫面的大小 (位元組)。

  • 畫面資料。

如需框架格式的詳細資訊,請參閱 Kinesis Video Streams 資料模型

把一個 KinesisVideoFrame 到一個特定的軌道 KinesisVideoStream

您可以使用該 PutFrameHelper 類將幀數據放入特定軌道中。首先,調用 getFrameData Buffer 以獲取指向其中一個預先分配緩衝區的指針以填充數 KinesisVideoFrame 據。然後,您可以調用 putFrameMulti Track 與布爾值一 KinesisVideoFrame 起發送,以指示幀數據的類型。如果是視訊資料,使用 true,或者,如果影格包含音訊資料,則使用 false。T putFrameMulti rack 方法使用排隊機制來確保 MKV 片段保持單調增加的幀時間戳,並且任何兩個片段不會重疊。例如,片段第一幀的 MKV 時間戳應始終大於上一個片段最後一幀的 MKV 時間戳。

具 PutFrameHelper 有下列欄位:

  • 佇列中的音訊影格數目上限。

  • 佇列中的視訊影格數目上限。

  • 要分配給單個音頻幀的大小。

  • 要配置給單一視訊影格的大小。

指標和指標記錄

C++ Producer 開發套件包含適用於指標和指標記錄的功能。

您可以使用getKinesisVideoMetricsgetKinesisVideoStreamMetrics API 操作來擷取 Kinesis 影片串流和作用中串流的相關資訊。

以下是來自 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:內容存放區 (用於儲存串流資料的記憶體) 的整體大小 (以位元組為單位)。

  • contentStoreAvailable大小:內容存放區中的可用記憶體,以位元組為單位。

  • contentStoreAllocated大小:內容存放區中配置的記憶體。

  • totalContentViews大小:內容視圖使用的總內存。內容檢視是內容存放區中的一系列資訊索引。

  • 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: 串流的最後測量速率,以每秒位元組為單位。

分解

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

kinesis_video_stream->stopSync();

或者,您可以呼叫 stop 來結束串流:

kinesis_video_stream->stop();

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

kinesis_video_producer_->freeStream(kinesis_video_stream);

下一步驟

步驟 3:運行並驗證代碼