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.