API pemutaran Azure Kinect
SDK sensor menyediakan API untuk merekam data perangkat ke file Matroska (.mkv). Format kontainer Matroska menyimpan trek video, sampel IMU, dan kalibrasi perangkat. Rekaman dapat dibuat menggunakan utilitas baris perintah k4arecorder yang disediakan. Rekaman juga dapat disesuaikan dan direkam secara langsung menggunakan API rekaman.
Untuk informasi selengkapnya tentang API perekaman, lihat k4a_record_create()
.
Untuk informasi selengkapnya tentang spesifikasi format file Matroska, lihat halaman Format File Rekaman.
Menggunakan API pemutaran
File rekaman dapat dibuka menggunakan API pemutaran. API pemutaran menyediakan akses ke data sensor dalam format yang sama dengan SDK sensor lainnya.
Membuka file rekaman
Dalam contoh berikut, kami membuka rekaman menggunakan k4a_playback_open()
, mencetak panjang rekaman, lalu menutup file dengan k4a_playback_close()
.
k4a_playback_t playback_handle = NULL;
if (k4a_playback_open("recording.mkv", &playback_handle) != K4A_RESULT_SUCCEEDED)
{
printf("Failed to open recording\n");
return 1;
}
uint64_t recording_length = k4a_playback_get_last_timestamp_usec(playback_handle);
printf("Recording is %lld seconds long\n", recording_length / 1000000);
k4a_playback_close(playback_handle);
Membaca pengambilan
Setelah file dibuka, kita dapat mulai membaca pengambilan dari rekaman. Contoh berikut ini akan membaca setiap pengambilan dalam file.
k4a_capture_t capture = NULL;
k4a_stream_result_t result = K4A_STREAM_RESULT_SUCCEEDED;
while (result == K4A_STREAM_RESULT_SUCCEEDED)
{
result = k4a_playback_get_next_capture(playback_handle, &capture);
if (result == K4A_STREAM_RESULT_SUCCEEDED)
{
// Process capture here
k4a_capture_release(capture);
}
else if (result == K4A_STREAM_RESULT_EOF)
{
// End of file reached
break;
}
}
if (result == K4A_STREAM_RESULT_FAILED)
{
printf("Failed to read entire recording\n");
return 1;
}
Mencari di dalam rekaman
Setelah kita mencapai akhir file, kita mungkin ingin kembali dan membacanya lagi. Proses ini dapat dilakukan dengan membaca mundur dengan k4a_playback_get_previous_capture()
, tetapi bisa sangat lambat tergantung pada panjang rekaman.
Sebagai gantinya, kita dapat menggunakan fungsi k4a_playback_seek_timestamp()
untuk menuju ke titik tertentu dalam file.
Dalam contoh ini, kami menentukan tanda waktu dalam mikrodetik untuk mencari ke berbagai titik dalam file.
// Seek to the beginning of the file
if (k4a_playback_seek_timestamp(playback_handle, 0, K4A_PLAYBACK_SEEK_BEGIN) != K4A_RESULT_SUCCEEDED)
{
return 1;
}
// Seek to the end of the file
if (k4a_playback_seek_timestamp(playback_handle, 0, K4A_PLAYBACK_SEEK_END) != K4A_RESULT_SUCCEEDED)
{
return 1;
}
// Seek to 10 seconds from the start
if (k4a_playback_seek_timestamp(playback_handle, 10 * 1000000, K4A_PLAYBACK_SEEK_BEGIN) != K4A_RESULT_SUCCEEDED)
{
return 1;
}
// Seek to 10 seconds from the end
if (k4a_playback_seek_timestamp(playback_handle, -10 * 1000000, K4A_PLAYBACK_SEEK_END) != K4A_RESULT_SUCCEEDED)
{
return 1;
}
Membaca informasi tag
Rekaman juga dapat berisi berbagai metadata seperti nomor seri perangkat dan versi firmware. Metadata ini disimpan dalam tag rekaman, yang dapat diakses menggunakan fungsi k4a_playback_get_tag()
.
// Print the serial number of the device used to record
char serial_number[256];
size_t serial_number_size = 256;
k4a_buffer_result_t buffer_result = k4a_playback_get_tag(playback_handle, "K4A_DEVICE_SERIAL_NUMBER", &serial_number, &serial_number_size);
if (buffer_result == K4A_BUFFER_RESULT_SUCCEEDED)
{
printf("Device serial number: %s\n", serial_number);
}
else if (buffer_result == K4A_BUFFER_RESULT_TOO_SMALL)
{
printf("Device serial number too long.\n");
}
else
{
printf("Tag does not exist. Device serial number was not recorded.\n");
}
Merekam daftar tag
Di bawah ini adalah daftar semua tag default yang mungkin disertakan dalam file rekaman. Banyak dari nilai ini tersedia sebagai bagian dari struct k4a_record_configuration_t
, dan dapat dibaca dengan fungsi k4a_playback_get_record_configuration()
.
Jika tag tidak ada, tag dianggap memiliki nilai default.
Nama Tag | Nilai Default | k4a_record_configuration_t Bidang |
Catatan |
---|---|---|---|
K4A_COLOR_MODE |
"NONAKTIF" | color_format / color_resolution |
Kemungkinan nilai: "NONAKTIF", "MJPG_1080P", "NV12_720P", "YUY2_720P", dan seterusnya |
K4A_DEPTH_MODE |
"NONAKTIF" | depth_mode / depth_track_enabled |
Kemungkinan nilai: "NONAKTIF, "NFOV_UNBINNED", "PASSIVE_IR", dan seterusnya |
K4A_IR_MODE |
"NONAKTIF" | depth_mode / ir_track_enabled |
Kemungkinan nilai: "NONAKTIF", "AKTIF", "PASIF" |
K4A_IMU_MODE |
"NONAKTIF" | imu_track_enabled |
Nilai yang mungkin: "AKTIF", "NONAKTIF" |
K4A_CALIBRATION_FILE |
"calibration.json" | T/A | Lihat k4a_device_get_raw_calibration() |
K4A_DEPTH_DELAY_NS |
"0" | depth_delay_off_color_usec |
Nilai disimpan dalam nanodetik, API memberikan mikrodetik. |
K4A_WIRED_SYNC_MODE |
"MANDIRI" | wired_sync_mode |
Kemungkinan nilai: "STANDAR", "MASTER", "SUBORDINAT" |
K4A_SUBORDINATE_DELAY_NS |
"0" | subordinate_delay_off_master_usec |
Nilai disimpan dalam nanodetik, API memberikan mikrodetik. |
K4A_COLOR_FIRMWARE_VERSION |
"" | T/A | Versi firmware warna perangkat, misalnya "1.x.xx" |
K4A_DEPTH_FIRMWARE_VERSION |
"" | T/A | Versi firmware kedalaman perangkat, misalnya "1.x.xx" |
K4A_DEVICE_SERIAL_NUMBER |
"" | T/A | Nomor seri perangkat rekaman |
K4A_START_OFFSET_NS |
"0" | start_timestamp_offset_usec |
Lihat Sinkronisasi Tanda Waktu di bawah. |
K4A_COLOR_TRACK |
Tidak ada | T/A | Lihat Format File Rekaman - Mengidentifikasi trek. |
K4A_DEPTH_TRACK |
Tidak ada | T/A | Lihat Format File Rekaman - Mengidentifikasi trek. |
K4A_IR_TRACK |
Tidak ada | T/A | Lihat Format File Rekaman - Mengidentifikasi trek. |
K4A_IMU_TRACK |
Tidak ada | T/A | Lihat Format File Rekaman - Mengidentifikasi trek. |
Sinkronisasi tanda waktu
Format Matroska mengharuskan bahwa rekaman harus dimulai dengan tanda waktu nol. Saat menyinkronkan kamera secara eksternal, tanda waktu pertama dari setiap perangkat mungkin bukan nol.
Untuk mempertahankan tanda waktu asli dari perangkat antara rekaman dan pemutaran, file menyimpan offset untuk diterapkan ke tanda waktu.
Tag K4A_START_OFFSET_NS
digunakan untuk menentukan offset tanda waktu sehingga file dapat disinkronkan ulang setelah rekaman. Offset tanda waktu ini dapat ditambahkan ke setiap tanda waktu dalam file untuk merekonstruksi tanda waktu perangkat asli.
Offset awal juga tersedia di struct k4a_record_configuration_t
.