Bagikan melalui


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.