

Terjemahan disediakan oleh mesin penerjemah. Jika konten terjemahan yang diberikan bertentangan dengan versi bahasa Inggris aslinya, utamakan versi bahasa Inggris.

# Tulis dan periksa kodenya
<a name="producersdk-c-write"></a>

Di bagian ini, Anda memeriksa kode aplikasi sampel `KvsVideoOnlyStreamingSample.c` di `samples` folder repo [https://github.com/awslabs/amazon-kinesis-video-streams-producer-c](https://github.com/awslabs/amazon-kinesis-video-streams-producer-c) pada. GitHub Anda mengunduh kode ini di langkah sebelumnya. Contoh ini menunjukkan cara menggunakan pustaka produser C untuk mengirim bingkai video yang dikodekan H.264 di dalam folder ke aliran video Kinesis Anda. `samples/h264SampleFrames`

Aplikasi sampel ini memiliki tiga bagian:
+ Inisialisasi dan konfigurasi:
  + Menginisialisasi dan mengonfigurasi saluran media khusus platform.
  + Menginisialisasi dan mengonfigurasi KinesisVideoClient dan KinesisVideoStream untuk pipeline, menyetel panggilan balik, mengintegrasikan otentikasi khusus skenario, mengekstrak dan mengirimkan data pribadi codec, dan mendapatkan aliran ke status READY.
+ Loop utama:
  + Mendapatkan bingkai dari pipa media dengan stempel waktu dan bendera.
  + Mengirimkan bingkai ke. KinesisVideoStream
+ Pembongkaran:
  + Berhenti (sinkronisasi) KinesisVideoStream, membebaskan KinesisVideoStream, membebaskan KinesisVideoClient.

Contoh aplikasi ini menyelesaikan tugas-tugas berikut:
+ Panggil `createDefaultDeviceInfo` API untuk membuat `deviceInfo` objek yang berisi informasi tentang perangkat atau konfigurasi penyimpanan.

  ```
  // 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;
  ```
+ Panggil `createRealtimeVideoStreamInfoProvider` API untuk membuat `StreamInfo` objek.

  ```
  CHK_STATUS(createRealtimeVideoStreamInfoProvider(streamName, DEFAULT_RETENTION_PERIOD, DEFAULT_BUFFER_DURATION, &pStreamInfo));
  // adjust members of pStreamInfo here if needed
  ```
+ Panggil `createDefaultCallbacksProviderWithAwsCredentials` API untuk membuat penyedia callback default berdasarkan AWS kredenal statis.

  ```
  CHK_STATUS(createDefaultCallbacksProviderWithAwsCredentials(accessKey,
                                                                  secretKey,
                                                                  sessionToken,
                                                                  MAX_UINT64,
                                                                  region,
                                                                  cacertPath,
                                                                  NULL,
                                                                  NULL,
                                                                  FALSE,
                                                                  &pClientCallbacks));
  ```
+ Panggil `createKinesisVideoClient` API untuk membuat `KinesisVideoClient` objek yang berisi informasi tentang penyimpanan perangkat Anda dan mempertahankan callback untuk melaporkan peristiwa Kinesis Video Streams.

  ```
  CHK_STATUS(createKinesisVideoClient(pDeviceInfo, pClientCallbacks, &clientHandle));                
  ```
+ Panggil `createKinesisVideoStreamSync` API untuk membuat `KinesisVideoStream` objek.

  ```
  CHK_STATUS(createKinesisVideoStreamSync(clientHandle, pStreamInfo, &streamHandle));                
  ```
+ Siapkan bingkai sampel dan panggil `PutKinesisVideoFrame` API untuk mengirim bingkai itu ke `KinesisVideoStream` objek.

  ```
   // 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;
      }
  ```
+ Pembongkaran:

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