Azure Kinect kayıttan yürütme API'si

Algılayıcı SDK'sı, cihaz verilerini matroska (.mkv) dosyasına kaydetmek için bir API sağlar. Matroska kapsayıcı biçimi video parçalarını, IMU örneklerini ve cihaz kalibrasyonunu depolar. Kayıtlar, sağlanan k4arecorder komut satırı yardımcı programı kullanılarak oluşturulabilir. Kayıtlar ayrıca doğrudan kayıt API'sini kullanarak özelleştirilebilir ve kaydedilebilir.

Kayıt API'si hakkında daha fazla bilgi için bkz k4a_record_create(). .

Matroska dosya biçimi belirtimleri hakkında daha fazla bilgi için Kayıt Dosyası Biçimi sayfasına bakın.

Kayıttan yürütme API'sini kullanma

Kayıt dosyaları kayıttan yürütme API'sini kullanarak açılabilir. Kayıttan yürütme API'si algılayıcı verilerine algılayıcı SDK'sının geri kalanıyla aynı biçimde erişim sağlar.

Kayıt dosyasını açma

Aşağıdaki örnekte kullanarak bir kaydı açarız, kayıt k4a_playback_open()uzunluğunu yazdırır ve dosyayı ile k4a_playback_close()kapatırız.

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

Okuma yakalamaları

Dosya açıldıktan sonra kayıttan yakalamaları okumaya başlayabiliriz. Bu sonraki örnek, dosyadaki yakalamaların her birini okur.

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

Kayıt içinde arama

Dosyanın sonuna ulaştıktan sonra geri dönüp yeniden okumak isteyebiliriz. Bu işlem ile k4a_playback_get_previous_capture()geriye doğru okuyarak yapılabilir, ancak kaydın uzunluğuna bağlı olarak çok yavaş olabilir. Bunun yerine, dosyasında belirli bir noktaya gitmek için işlevini kullanabiliriz k4a_playback_seek_timestamp() .

Bu örnekte, dosyadaki çeşitli noktaları aramak için mikrosaniye olarak zaman damgaları belirteceğiz.

// 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;
}

Etiket bilgilerini okuma

Kayıtlar, cihaz seri numarası ve üretici yazılımı sürümleri gibi çeşitli meta veriler de içerebilir. Bu meta veriler, işlevi kullanılarak erişilebilen kayıt etiketlerinde k4a_playback_get_tag() depolanır.

// 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");
}

Kayıt etiketi listesi

Aşağıda, bir kayıt dosyasına dahil edilebilecek tüm varsayılan etiketlerin listesi verilmiştir. Bu değerlerin çoğu yapının bir parçası k4a_record_configuration_t olarak kullanılabilir ve işleviyle k4a_playback_get_record_configuration() okunabilir.

Bir etiket yoksa, varsayılan değere sahip olduğu varsayılır.

Etiket Adı Varsayılan Değer k4a_record_configuration_t Alan Notlar
K4A_COLOR_MODE "KAPALI" color_format / color_resolution Olası değerler: "OFF", "MJPG_1080P", "NV12_720P", "YUY2_720P" vb.
K4A_DEPTH_MODE "KAPALI" depth_mode / depth_track_enabled Olası değerler: "KAPALI, "NFOV_UNBINNED", "PASSIVE_IR" vb.
K4A_IR_MODE "KAPALI" depth_mode / ir_track_enabled Olası değerler: "KAPALI", "ETKİn", "PASIF"
K4A_IMU_MODE "KAPALI" imu_track_enabled Olası değerler: "ON", "OFF"
K4A_CALIBRATION_FILE "calibration.json" Yok Bkz. k4a_device_get_raw_calibration()
K4A_DEPTH_DELAY_NS "0" depth_delay_off_color_usec Nanosaniyede depolanan değer, API mikrosaniyeler sağlar.
K4A_WIRED_SYNC_MODE "TEK BAŞıNA" wired_sync_mode Olası değerler: "STANDALONE", "MASTER", "SUBORDINATE"
K4A_SUBORDINATE_DELAY_NS "0" subordinate_delay_off_master_usec Nanosaniyede depolanan değer, API mikrosaniyeler sağlar.
K4A_COLOR_FIRMWARE_VERSION "" Yok Cihaz rengi üretici yazılımı sürümü, örneğin "1.x.xx"
K4A_DEPTH_FIRMWARE_VERSION "" Yok Cihaz derinliği üretici yazılımı sürümü, örneğin "1.x.xx"
K4A_DEVICE_SERIAL_NUMBER "" Yok Kayıt cihazı seri numarası
K4A_START_OFFSET_NS "0" start_timestamp_offset_usec Aşağıdaki Zaman Damgası Eşitlemesi'ne bakın.
K4A_COLOR_TRACK Hiçbiri Yok Bkz. Kayıt Dosyası Biçimi - Parçaları tanımlama.
K4A_DEPTH_TRACK Hiçbiri Yok Bkz. Kayıt Dosyası Biçimi - Parçaları tanımlama.
K4A_IR_TRACK Hiçbiri Yok Bkz. Kayıt Dosyası Biçimi - Parçaları tanımlama.
K4A_IMU_TRACK Hiçbiri Yok Bkz. Kayıt Dosyası Biçimi - Parçaları tanımlama.

Zaman damgası eşitlemesi

Matroska biçimi, kayıtların sıfır zaman damgasıyla başlamasını gerektirir. Kameraları harici olarak eşitlerken, her cihazın ilk zaman damgası sıfır olmayabilir.

Kayıt ve kayıttan yürütme arasındaki cihazlardan özgün zaman damgalarını korumak için, dosya zaman damgalarına uygulanacak bir uzaklık depolar.

Etiket K4A_START_OFFSET_NS , dosyaların kayıttan sonra yeniden eşitlenebilmesi için bir zaman damgası uzaklığı belirtmek için kullanılır. Bu zaman damgası uzaklığı, özgün cihaz zaman damgalarını yeniden yapılandırmak için dosyadaki her zaman damgasına eklenebilir.

Başlangıç uzaklığı yapıda k4a_record_configuration_t da kullanılabilir.