View a markdown version of this page

Tulis dan periksa kode - Amazon Kinesis Video Streams

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

Tulis dan periksa kode

Di bagian iniGunakan pustaka produser C++, Anda memeriksa kode di C++ test harness (tst/ProducerTestFixture.hdan file lainnya). Anda mengunduh kode ini di bagian sebelumnya.

Contoh Platform Independent C++ menunjukkan pola pengkodean berikut:

  • Buat instance KinesisVideoProducer untuk mengakses Streams Video Kinesis.

  • Buat instans KinesisVideoStream. Ini membuat aliran video Kinesis di Anda Akun AWS jika aliran dengan nama yang sama belum ada.

  • Pang putFrame gil KinesisVideoStream untuk setiap frame data, saat tersedia, untuk mengirimkannya ke streaming.

Bagian berikut memberikan informasi lebih lanjut tentang pola pengkodean ini.

Buat instance dari KinesisVideoProducer

Anda membuat KinesisVideoProducer objek dengan memanggil KinesisVideoProducer::createSync metode. Contoh berikut membuat KinesisVideoProducer dalam ProducerTestFixture.h file:

kinesis_video_producer_ = KinesisVideoProducer::createSync(move(device_provider_), move(client_callback_provider_), move(stream_callback_provider_), move(credential_provider_), defaultRegion_);

createSyncMetode ini mengambil parameter berikut:

  • Sebuah DeviceInfoProvider objek, yang mengembalikan DeviceInfo objek yang berisi informasi tentang perangkat atau konfigurasi penyimpanan.

    catatan

    Anda mengonfigurasi ukuran penyimpanan konten Anda menggunakan deviceInfo.storageInfo.storageSize parameter. Aliran konten Anda berbagi penyimpanan konten. Untuk menentukan kebutuhan ukuran penyimpanan Anda, kalikan ukuran bingkai rata-rata dengan jumlah frame yang disimpan untuk durasi maksimum untuk semua aliran. Kemudian kalikan dengan 1,2 untuk memperhitungkan defragmentasi. Misalnya, misalkan aplikasi Anda memiliki konfigurasi berikut:

    • Tiga aliran

    • Durasi maksimum 3 menit

    • Setiap aliran adalah 30 frame per detik (FPS)

    • Setiap frame berukuran 10.000 KB

    Persyaratan penyimpanan konten untuk aplikasi ini adalah 3 (aliran) * 3 (menit) * 60 (detik dalam satu menit) * 10000 (kb) * 1,2 (tunjangan defragmentasi) = 194,4 Mb ~ 200 Mb.

  • Sebuah ClientCallbackProvider objek, yang mengembalikan pointer fungsi yang melaporkan peristiwa khusus klien.

  • Sebuah StreamCallbackProvider objek, yang mengembalikan pointer fungsi yang dipanggil kembali ketika peristiwa spesifik aliran terjadi.

  • Sebuah CredentialProvider objek, yang menyediakan akses ke variabel lingkungan AWS kredensi.

  • Wilayah AWS (“us-west-2"). Titik akhir layanan ditentukan dari Wilayah.

Buat instance dari KinesisVideoStream

Anda membuat KinesisVideoStream objek dengan memanggil KinesisVideoProducer::CreateStream metode dengan StreamDefinition parameter. Contoh membuat ProducerTestFixture.h file dengan jenis trek sebagai video, dan dengan id trek sebagai 1: KinesisVideoStream

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));

Ob StreamDefinition jek memiliki bidang berikut:

  • Nama streaming.

  • Periode penyimpanan data.

  • Tag untuk streaming. Tag ini dapat digunakan oleh aplikasi konsumen untuk menemukan aliran yang benar, atau untuk mendapatkan informasi lebih lanjut tentang streaming. Tag juga dapat dilihat di Konsol Manajemen AWS.

  • AWS KMS kunci enkripsi untuk streaming. Untuk informasi selengkapnya, lihat Perlindungan data di Kinesis Video Streams.

  • Jenis streaming. Saat ini, satu-satunya nilai yang valid adalahSTREAMING_TYPE_REALTIME.

  • Jenis konten media.

  • Latensi media. Nilai ini saat ini tidak digunakan, dan harus disetel ke 0.

  • Durasi pemutaran setiap fragmen.

  • Skala kode waktu media.

  • Apakah media menggunakan fragmentasi bingkai kunci.

  • Apakah media menggunakan kode waktu.

  • Apakah media menggunakan waktu fragmen absolut.

Menambahkan trek audio ke aliran video Kinesis

Anda dapat menambahkan detail trek audio ke definisi aliran trek video dengan menggunakan addTrack metodeStreamDefinition:

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

addTrackMetode ini membutuhkan parameter berikut:

  • Track id (sebagai salah satu untuk audio). Ini harus unik dan nilai bukan nol.

  • User-defined nama trek (misalnya, “audio” untuk trek audio).

  • ID codec untuk trek ini (misalnya, untuk trek audio “A_AAC”).

  • Jenis trek (misalnya, gunakan nilai enum MKV_TRACK_INFO_TYPE_AUDIO untuk audio).

Jika Anda memiliki data pribadi codec untuk trek audio, maka Anda dapat meneruskannya saat memanggil fungsi AddTrack. Anda juga dapat mengirim data pribadi codec setelah membuat KinesisVideoStream objek saat memanggil metode start di KinesisVideoStream.

Masukkan bingkai ke dalam aliran video Kinesis

Anda memasukkan media ke dalam aliran video Kinesis menggunakanKinesisVideoStream::putFrame, meneruskan Frame objek yang berisi header dan data media. Contoh panggilan putFrame dalam ProducerApiTest.cpp file:

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));
catatan

Contoh produsen C++ sebelumnya mengirimkan buffer data uji. Dalam aplikasi dunia nyata, Anda harus mendapatkan buffer bingkai dan ukuran dari data bingkai dari sumber media (seperti kamera).

Ob Frame jek memiliki bidang berikut:

  • Indeks bingkai. Ini harus menjadi nilai yang meningkat secara monoton.

  • Bendera yang terkait dengan bingkai. Misalnya, jika encoder dikonfigurasi untuk menghasilkan bingkai kunci, bingkai ini akan diberi FRAME_FLAG_KEY_FRAME flag.

  • Menguraikan stempel waktu.

  • Stempel waktu presentasi.

  • Durasi bingkai (hingga 100 ns unit).

  • Ukuran bingkai dalam byte.

  • Data bingkai.

Untuk informasi lebih lanjut tentang format bingkai, lihatModel data Streaming Video Kinesis.

Masukkan KinesisVideoFrame ke dalam trek tertentu KinesisVideoStream

Anda dapat menggunakan PutFrameHelper kelas untuk menempatkan data bingkai ke trek tertentu. Pertama, panggil getFrameDataBuffer untuk mendapatkan pointer ke salah satu buffer yang telah dialokasikan sebelumnya untuk mengisi data. KinesisVideoFrame Kemudian, Anda dapat memang putFrameMultiTrack gil untuk mengirim KinesisVideoFrame bersama dengan nilai Boolean untuk menunjukkan jenis data bingkai. Gunakan true jika itu data video atau false jika frame berisi data audio. putFrameMultiTrackMetode ini menggunakan mekanisme antrian untuk memastikan bahwa Fragmen MKV mempertahankan cap waktu bingkai yang meningkat secara monoton dan dua fragmen tidak tumpang tindih. Misalnya, stempel waktu MKV dari bingkai pertama fragmen harus selalu lebih besar dari stempel waktu MKV dari bingkai terakhir dari fragmen sebelumnya.

Ini PutFrameHelper memiliki bidang berikut:

  • Jumlah maksimum frame audio dalam antrian.

  • Jumlah maksimum frame video dalam antrian.

  • Ukuran yang dialokasikan untuk satu bingkai audio.

  • Ukuran yang dialokasikan untuk satu bingkai video.

Akses metrik dan pencatatan metrik

SDK produsen C++ menyertakan fungsionalitas untuk metrik dan pencatatan metrik.

Anda dapat menggunakan operasi getKinesisVideoMetrics dan getKinesisVideoStreamMetrics API untuk mengambil informasi tentang Kinesis Video Streams dan aliran aktif Anda.

Kode berikut berasal dari kinesis-video-pic/src/client/include/com/amazonaws/kinesis/video/client/Include.h file.

/** * 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);

Ob PClientMetrics jek yang diisi getKinesisVideoMetrics berisi informasi berikut:

  • kontenStoreSize: Ukuran keseluruhan dalam byte dari penyimpanan konten (memori yang digunakan untuk menyimpan data streaming).

  • kontenStoreAvailableSize: Memori yang tersedia di penyimpanan konten, dalam byte.

  • kontenStoreAllocatedSize: Memori yang dialokasikan di penyimpanan konten.

  • totalContentViewsSize: Total memori yang digunakan untuk tampilan konten. Tampilan konten adalah serangkaian indeks informasi di penyimpanan konten.

  • totalFrameRate: Jumlah agregat frame per detik di semua aliran aktif.

  • totalTransferRate: Total bit per detik (bps) yang dikirim di semua aliran.

Ob PStreamMetrics jek yang diisi getKinesisVideoStreamMetrics berisi informasi berikut:

  • saat iniViewDuration: Perbedaan unit 100 ns antara kepala tampilan konten (ketika frame dikodekan) dan posisi saat ini (ketika data bingkai dikirim ke Kinesis Video Streams).

  • secara keseluruhanViewDuration: Perbedaan dalam unit 100 ns antara kepala tampilan konten (ketika bingkai dikodekan) ke ekor (ketika frame dihapus dari memori, baik karena total ruang yang dialokasikan untuk tampilan konten terlampaui, atau karena PersistedAck pesan diterima dari Kinesis Video Streams, dan frame yang diketahui dipertahankan dibilas).

  • currentViewSize: Ukuran dalam byte tampilan konten dari head (saat frame dikodekan) ke posisi saat ini (saat frame dikirim ke Kinesis Video Streams).

  • keseluruhanViewSize: Ukuran total dalam byte dari tampilan konten.

  • arusFrameRate: Laju aliran terakhir yang diukur, dalam frame per detik.

  • currentTransferRate: Tingkat terakhir yang diukur dari aliran, dalam byte per detik.

Membongkar

Jika Anda ingin mengirim sisa byte dalam buffer dan menungguACK, Anda dapat menggunakanstopSync:

kinesis_video_stream->stopSync();

Atau Anda dapat menelep stop on untuk mengakhiri streaming:

kinesis_video_stream->stop();

Setelah menghentikan streaming, Anda dapat membebaskan streaming dengan memanggil API berikut:

kinesis_video_producer_->freeStream(kinesis_video_stream);