Udostępnij za pośrednictwem


Interfejs API odtwarzania zestawu Azure Kinect

Zestaw SDK czujnika udostępnia interfejs API do rejestrowania danych urządzenia do pliku Matroska (.również). Format kontenera Matroska przechowuje ścieżki wideo, próbki IMU i kalibrację urządzenia. Nagrania można wygenerować przy użyciu dostarczonego narzędzia wiersza polecenia k4arecorder . Nagrania można również dostosowywać i rejestrować bezpośrednio przy użyciu interfejsu API rekordów.

Aby uzyskać więcej informacji na temat interfejsu API rejestrowania, zobacz k4a_record_create().

Aby uzyskać więcej informacji na temat specyfikacji formatu pliku Matroska, zobacz stronę Format pliku nagrywania .

Korzystanie z interfejsu API odtwarzania

Pliki nagrywania można otwierać przy użyciu interfejsu API odtwarzania. Interfejs API odtwarzania zapewnia dostęp do danych czujników w tym samym formacie co reszta zestawu SDK czujnika.

Otwieranie pliku rekordu

W poniższym przykładzie otworzymy nagranie przy użyciu polecenia k4a_playback_open(), wydrukuj długość nagrania, a następnie zamknij plik za k4a_playback_close()pomocą polecenia .

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

Przechwytywanie odczytu

Po otwarciu pliku możemy rozpocząć odczytywanie przechwytywania z nagrania. W następnym przykładzie zostanie odczytany każdy z przechwytów w pliku.

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

Wyszukiwanie w nagraniu

Po osiągnięciu końca pliku możemy chcieć wrócić i odczytać go ponownie. Ten proces można wykonać, odczytując do tyłu za k4a_playback_get_previous_capture()pomocą metody , ale może to być bardzo powolne w zależności od długości nagrania. Zamiast tego możemy użyć k4a_playback_seek_timestamp() funkcji, aby przejść do określonego punktu w pliku.

W tym przykładzie określamy znaczniki czasu w mikrosekundach, aby szukać różnych punktów w pliku.

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

Odczytywanie informacji o tagach

Nagrania mogą również zawierać różne metadane, takie jak numer seryjny urządzenia i wersje oprogramowania układowego. Te metadane są przechowywane w tagach rejestrowania, do których można uzyskać dostęp za pomocą k4a_playback_get_tag() funkcji.

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

Lista tagów rekordów

Poniżej znajduje się lista wszystkich tagów domyślnych, które mogą być uwzględnione w pliku nagrywania. Wiele z tych wartości jest dostępnych w ramach k4a_record_configuration_t struktury i można je odczytać za k4a_playback_get_record_configuration() pomocą funkcji .

Jeśli tag nie istnieje, zakłada się, że ma wartość domyślną.

Nazwa tagu Wartość domyślna k4a_record_configuration_t Pole Uwagi
K4A_COLOR_MODE "WYŁĄCZONE" color_format / color_resolution Możliwe wartości: "OFF", "MJPG_1080P", "NV12_720P", "YUY2_720P" itd.
K4A_DEPTH_MODE "WYŁĄCZONE" depth_mode / depth_track_enabled Możliwe wartości: "OFF, "NFOV_UNBINNED", "PASSIVE_IR" itd.
K4A_IR_MODE "WYŁĄCZONE" depth_mode / ir_track_enabled Możliwe wartości: "OFF", "ACTIVE", "PASSIVE"
K4A_IMU_MODE "WYŁĄCZONE" imu_track_enabled Możliwe wartości: "ON", "OFF"
K4A_CALIBRATION_FILE "calibration.json" Nie dotyczy Zobacz k4a_device_get_raw_calibration()
K4A_DEPTH_DELAY_NS „0” depth_delay_off_color_usec Wartość przechowywana w nanosekundach, interfejs API udostępnia mikrosekundy.
K4A_WIRED_SYNC_MODE "AUTONOMICZNA" wired_sync_mode Możliwe wartości: "STANDALONE", "MASTER", "SUBORDINATE"
K4A_SUBORDINATE_DELAY_NS „0” subordinate_delay_off_master_usec Wartość przechowywana w nanosekundach, interfejs API udostępnia mikrosekundy.
K4A_COLOR_FIRMWARE_VERSION "" Nie dotyczy Wersja oprogramowania układowego koloru urządzenia, na przykład "1.x.xx"
K4A_DEPTH_FIRMWARE_VERSION "" Nie dotyczy Wersja oprogramowania układowego głębokości urządzenia, na przykład "1.x.xx"
K4A_DEVICE_SERIAL_NUMBER "" Nie dotyczy Rejestrowanie numeru seryjnego urządzenia
K4A_START_OFFSET_NS „0” start_timestamp_offset_usec Zobacz Synchronizacja sygnatury czasowej poniżej.
K4A_COLOR_TRACK Brak Nie dotyczy Zobacz Format pliku nagrywania — identyfikowanie ścieżek.
K4A_DEPTH_TRACK Brak Nie dotyczy Zobacz Format pliku nagrywania — identyfikowanie ścieżek.
K4A_IR_TRACK Brak Nie dotyczy Zobacz Format pliku nagrywania — identyfikowanie ścieżek.
K4A_IMU_TRACK Brak Nie dotyczy Zobacz Format pliku nagrywania — identyfikowanie ścieżek.

Synchronizacja sygnatury czasowej

Format Matroska wymaga, aby nagrania zaczęły się od znacznika czasu zero. Podczas zewnętrznej synchronizacji kamer znacznik czasu z każdego urządzenia może być niezerowy.

Aby zachować oryginalne znaczniki czasu z urządzeń między nagrywaniem i odtwarzaniem, plik przechowuje przesunięcie, aby zastosować znaczniki czasu.

Tag K4A_START_OFFSET_NS służy do określania przesunięcia znacznika czasu, dzięki czemu pliki można ponownie zsynchronizować po zarejestrowaniu. To przesunięcie znacznika czasu można dodać do każdego znacznika czasu w pliku w celu odtworzenia oryginalnych sygnatur czasowych urządzenia.

Przesunięcie początkowe jest również dostępne w strukturach k4a_record_configuration_t .