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

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

步驟 2:編寫並檢查代碼

在本節中,您將檢查 https://github.com/awslabs/ amazon-kinesis-video-streams-生產者-c 存儲庫的samples文件夾KvsVideoOnlyStreamingSample.c中示例應用程序的代碼。 GitHub您在上一個步驟中下載了此程式碼。本範例示範如何使用 C 製作者程式庫,將資料夾內的 H.264 編碼視訊影格傳送samples/h264SampleFrames至 Kinesis 視訊串流。

此範例應用程式有三個部分:

  • 初始化及設定:

    • 初始化及設定平台特定的媒體管道。

    • 初始化和配置 KinesisVideoClient 和管道,設置回調,集成特定 KinesisVideoStream於案例的身份驗證,提取和提交編解碼器私有數據,以及使流進入 READY 狀態。

  • 主要迴圈:

    • 從包含時間戳記及旗標的媒體管道取得影格。

    • 將框架提交到 KinesisVideoStream.

  • 分解:

    • 停止(同步) KinesisVideoStream,釋放 KinesisVideoStream,釋放 KinesisVideoClient。

此範例應用程式完成下列任務:

  • 呼叫 createDefaultDeviceInfo API 以建立 deviceInfo 物件,其中包含裝置或儲存組態的相關資訊。

    // default storage size is 128MB. Use setDeviceInfoStorageSize after create to change storage size. CHK_STATUS(createDefaultDeviceInfo(&pDeviceInfo)); // adjust members of pDeviceInfo here if needed pDeviceInfo->clientInfo.loggerLogLevel = LOG_LEVEL_DEBUG;
  • 呼叫 createRealtimeVideoStreamInfoProvider API 以建立 StreamInfo 物件。

    CHK_STATUS(createRealtimeVideoStreamInfoProvider(streamName, DEFAULT_RETENTION_PERIOD, DEFAULT_BUFFER_DURATION, &pStreamInfo)); // adjust members of pStreamInfo here if needed
  • 呼叫 createDefaultCallbacksProviderWithAwsCredentials API,根據靜態認 AWS 證建立預設回呼提供者。

    CHK_STATUS(createDefaultCallbacksProviderWithAwsCredentials(accessKey, secretKey, sessionToken, MAX_UINT64, region, cacertPath, NULL, NULL, FALSE, &pClientCallbacks));
  • 呼叫 createKinesisVideoClient API 以建立包含裝置儲存體相關資訊的KinesisVideoClient物件,並維護回呼以報告 Kinesis Video Streams 事件。

    CHK_STATUS(createKinesisVideoClient(pDeviceInfo, pClientCallbacks, &clientHandle));
  • 呼叫 createKinesisVideoStreamSync API 以建立 KinesisVideoStream 物件。

    CHK_STATUS(createKinesisVideoStreamSync(clientHandle, pStreamInfo, &streamHandle));
  • 設定範例影格並呼叫 PutKinesisVideoFrame API,將該影格傳送至 KinesisVideoStream 物件。

    // setup sample frame MEMSET(frameBuffer, 0x00, frameSize); frame.frameData = frameBuffer; frame.version = FRAME_CURRENT_VERSION; frame.trackId = DEFAULT_VIDEO_TRACK_ID; frame.duration = HUNDREDS_OF_NANOS_IN_A_SECOND / DEFAULT_FPS_VALUE; frame.decodingTs = defaultGetTime(); // current time frame.presentationTs = frame.decodingTs; while(defaultGetTime() > streamStopTime) { frame.index = frameIndex; frame.flags = fileIndex % DEFAULT_KEY_FRAME_INTERVAL == 0 ? FRAME_FLAG_KEY_FRAME : FRAME_FLAG_NONE; frame.size = SIZEOF(frameBuffer); CHK_STATUS(readFrameData(&frame, frameFilePath)); CHK_STATUS(putKinesisVideoFrame(streamHandle, &frame)); defaultThreadSleep(frame.duration); frame.decodingTs += frame.duration; frame.presentationTs = frame.decodingTs; frameIndex++; fileIndex++; fileIndex = fileIndex % NUMBER_OF_FRAME_FILES; }
  • 分解:

    CHK_STATUS(stopKinesisVideoStreamSync(streamHandle)); CHK_STATUS(freeKinesisVideoStream(&streamHandle)); CHK_STATUS(freeKinesisVideoClient(&clientHandle));

下一步驟

步驟 3:運行並驗證代碼