撰寫並檢查程式碼 - Amazon Kinesis Video Streams

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

撰寫並檢查程式碼

在的這一節中使用 C ++ 生產者庫,您會檢查 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 INFO TYPE _ 的枚舉值來表示AUDIO音頻)。

如果您有音軌的編解碼器私人數據,則可以在調用該 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 ++ 生產者示例發送測試數據的緩衝區。在實際的應用程式中,您應該從媒體資源 (例如攝影機) 獲得畫面資料的畫面緩衝和大小。

Frame 物件包含以下欄位:

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

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

  • 解碼時間戳記。

  • 簡報時間戳記。

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

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

  • 畫面資料。

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

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

您可以使用該PutFrameHelper類將幀數據放入特定軌道中。首先,調用getFrameDataBuffer以獲取指向其中一個預先分配緩衝區的指針以填充數KinesisVideoFrame據。然後,您可以呼叫傳putFrameMultiTrack送與 Boolean 值一KinesisVideoFrame起傳送,以指示訊框資料的類型。如果是視訊資料,使用 true,或者,如果影格包含音訊資料,則使用 false。該putFrameMultiTrack方法使用隊列機制來確保MKV片段保持單調增加的幀時間戳,並且任何兩個片段不重疊。例如,片段第一個影格的MKV時間戳記應該永遠大於前一個片段最後一個影格的MKV時間戳記。

PutFrameHelper有下列欄位:

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

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

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

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

存取指標和指標記錄

C++ 生產者SDK包含指標和指標記錄的功能。

您可以使用getKinesisVideoMetricsgetKinesisVideoStreamMetricsAPI操作來擷取 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);