Rozhraní API pro přehrávání Azure Kinect

Sada SDK senzorů poskytuje rozhraní API pro záznam dat zařízení do souboru Matroska (.mkv). Ve formátu kontejneru Matroska jsou uloženy stopy videa, ukázky IMU a zařízení. Nahrávky je možné generovat pomocí poskytnutého nástroje příkazového řádku k4arecorder. Nahrávky je také možné přizpůsobit a zaznamenat přímo pomocí rozhraní API pro záznamy.

Další informace o rozhraní API pro záznam najdete v tématu k4a_record_create() .

Další informace o specifikacích formátu souboru Matroska najdete na stránce Formát souboru záznamu.

Použití rozhraní API pro přehrávání

Soubory pro záznam můžete otevřít pomocí rozhraní API pro přehrávání. Rozhraní API pro přehrávání poskytuje přístup k datům senzorů ve stejném formátu jako zbytek sady SDK senzorů.

Otevření souboru záznamu

V následujícím příkladu otevřete záznam pomocí příkazu , vytiskněte délku záznamu a k4a_playback_open() pak soubor zavřete pomocí 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);

Zachytávání čtení

Jakmile je soubor otevřený, můžeme z nahrávky začít číst zachytávání. Tento další příklad přečte všechny zachytávání v souboru .

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

Hledání v rámci nahrávky

Po dosažení konce souboru se možná budeme chtít vrátit a znovu si ho přečíst. Tento proces je možné provést čtením zpět pomocí , ale v závislosti na délce záznamu může být velmi k4a_playback_get_previous_capture() pomalý. Místo toho můžeme pomocí k4a_playback_seek_timestamp() funkce přejít na konkrétní bod v souboru.

V tomto příkladu určíme časová razítka v mikrosekundách pro hledání různých bodů v souboru.

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

Čtení informací o značce

Nahrávky mohou také obsahovat různá metadata, jako je sériové číslo zařízení a verze firmwaru. Tato metadata jsou uložená v záznamech značek, ke kterým je možné přistupovat pomocí k4a_playback_get_tag() funkce .

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

Seznam značek záznamů

Níže je seznam všech výchozích značek, které mohou být zahrnuty v souboru záznamu. Mnohé z těchto hodnot jsou k dispozici jako součást struktury a k4a_record_configuration_t lze je číst pomocí funkce k4a_playback_get_record_configuration() .

Pokud značka neexistuje, předpokládá se, že má výchozí hodnotu.

Název značky Výchozí hodnota k4a_record_configuration_t Pole Poznámky
K4A_COLOR_MODE "OFF" color_format / color_resolution Možné hodnoty: OFF, MJPG_1080P, NV12_720P, YUY2_720P a tak dále.
K4A_DEPTH_MODE "OFF" depth_mode / depth_track_enabled Možné hodnoty: OFF, NFOV_UNBINNED, PASSIVE_IR a tak dále.
K4A_IR_MODE "OFF" depth_mode / ir_track_enabled Možné hodnoty: OFF, ACTIVE, PASSIVE
K4A_IMU_MODE "OFF" imu_track_enabled Možné hodnoty: "ON", "OFF"
K4A_CALIBRATION_FILE "calibration.json" Viz k4a_device_get_raw_calibration()
K4A_DEPTH_DELAY_NS "0" depth_delay_off_color_usec Hodnota uložená v nanosekundách poskytuje rozhraní API mikrosekundy.
K4A_WIRED_SYNC_MODE "STANDALONE" wired_sync_mode Možné hodnoty: STANDALONE, MASTER, SUBORDINATE
K4A_SUBORDINATE_DELAY_NS "0" subordinate_delay_off_master_usec Hodnota uložená v nanosekundách poskytuje rozhraní API mikrosekundy.
K4A_COLOR_FIRMWARE_VERSION "" Verze firmwaru barvy zařízení, například 1.x.xx
K4A_DEPTH_FIRMWARE_VERSION "" Verze firmwaru hloubky zařízení, například 1.x.xx
K4A_DEVICE_SERIAL_NUMBER "" Záznam sériového čísla zařízení
K4A_START_OFFSET_NS "0" start_timestamp_offset_usec Viz Synchronizace časového razítka níže.
K4A_COLOR_TRACK Žádná Viz Formát souboru záznamu – identifikace stop.
K4A_DEPTH_TRACK Žádná Viz Formát souboru záznamu – identifikace stop.
K4A_IR_TRACK Žádná Viz Formát souboru záznamu – identifikace stop.
K4A_IMU_TRACK Žádná Viz Formát souboru záznamu – identifikace stop.

Synchronizace časového razítka

Formát Matroska vyžaduje, aby nahrávky začaly s razítkem nula. Při externí synchronizaci fotoaparátůmůže být první časové razítko každého zařízení nenulové.

Pro zachování původních časových razítek ze zařízení mezi záznamem a přehráváním soubor uloží posun, který se použije na časová razítka.

Značka se používá k určení posunu časového razítka, aby bylo možné soubory po záznamu K4A_START_OFFSET_NS znovu synchronizovat. Tento posun časového razítka lze přidat ke každému časovému razítku v souboru, aby bylo možné rekonstruovat časová razítka původního zařízení.

Počáteční posun je k dispozici také ve k4a_record_configuration_t struktury .