Tulis dan periksa kodenya - 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 kodenya

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 Kinesis Video Streams.

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

  • Panggil putFrame KinesisVideoStream untuk setiap frame data, karena tersedia, untuk mengirimkannya ke aliran.

Bagian berikut memberikan informasi lebih lanjut tentang pola pengkodean ini.

Buat sebuah 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:

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

    catatan

    Anda mengonfigurasi ukuran toko konten Anda menggunakan deviceInfo.storageInfo.storageSize parameter. Aliran konten Anda berbagi toko konten. Untuk menentukan kebutuhan ukuran penyimpanan Anda, kalikan ukuran bingkai rata-rata dengan jumlah frame yang disimpan untuk durasi maksimal 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.

  • ClientCallbackProviderObjek, yang mengembalikan pointer fungsi yang melaporkan peristiwa khusus klien.

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

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

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

Buat sebuah instance dari KinesisVideoStream

Anda membuat KinesisVideoStream objek dengan memanggil KinesisVideoProducer::CreateStream metode dengan StreamDefinition parameter. Contoh membuat ProducerTestFixture.h file KinesisVideoStream dalam dengan jenis trek sebagai video, dan dengan track id sebagai 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));

StreamDefinitionObjek memiliki bidang berikut:

  • Nama aliran.

  • Periode retensi data.

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

  • AWS KMS kunci enkripsi untuk aliran. 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.

Tambahkan 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 satu untuk audio). Ini harus unik dan nilai bukan nol.

  • Nama trek yang ditentukan pengguna (misalnya, “audio” untuk trek audio).

  • Codec id untuk lagu 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 addTrack fungsi. Anda juga dapat mengirim data pribadi codec setelah membuat KinesisVideoStream objek sambil memanggil metode awal di KinesisVideoStream.

Masukkan bingkai ke dalam aliran video Kinesis

Anda menempatkan 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).

FrameObjek 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 tanda. FRAME_FLAG_KEY_FRAME

  • Stempel waktu decoding.

  • Stempel waktu presentasi.

  • Durasi frame (untuk 100 ns unit).

  • Ukuran frame dalam byte.

  • Data bingkai.

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

Menempatkan KinesisVideoFrame ke dalam trek tertentu KinesisVideoStream

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

Ini PutFrameHelper memiliki bidang-bidang berikut:

  • Jumlah maksimum bingkai audio dalam antrian.

  • Jumlah maksimum bingkai video dalam antrian.

  • Ukuran untuk mengalokasikan untuk satu bingkai audio.

  • Ukuran untuk mengalokasikan untuk satu bingkai video.

Akses metrik dan pencatatan metrik

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

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

Kode berikut adalah 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);

PClientMetricsObjek yang diisi oleh getKinesisVideoMetrics berisi informasi berikut:

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

  • contentStoreAvailableUkuran: Memori yang tersedia di toko konten, dalam byte.

  • contentStoreAllocatedUkuran: Memori yang dialokasikan di toko konten.

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

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

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

PStreamMetricsObjek yang diisi oleh getKinesisVideoStreamMetrics berisi informasi berikut:

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

  • overallViewDuration: Perbedaan unit 100 ns antara kepala tampilan konten (saat bingkai dikodekan) ke ekor (ketika bingkai dikeluarkan dari memori, baik karena total ruang yang dialokasikan untuk tampilan konten terlampaui, atau karena PersistedAck pesan diterima dari Kinesis Video Streams, dan bingkai yang diketahui bertahan dibilas).

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

  • overallViewSize: Ukuran total dalam byte tampilan konten.

  • currentFrameRate: Laju aliran terukur terakhir, dalam bingkai per detik.

  • currentTransferRate: Laju aliran terukur terakhir, dalam byte per detik.

Pembongkaran

Jika Anda ingin mengirim byte yang tersisa dalam buffer dan menungguACK, Anda dapat menggunakan: stopSync

kinesis_video_stream->stopSync();

Atau Anda dapat menelepon stop untuk mengakhiri streaming:

kinesis_video_stream->stop();

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

kinesis_video_producer_->freeStream(kinesis_video_stream);