Sdílet prostřednictvím


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

Sada SDK pro senzor poskytuje rozhraní API pro zaznamenávání dat zařízení do souboru Matroska (.aro). Formát kontejneru Matroska ukládá video stopy, vzorky IMU a kalibraci zařízení. Nahrávky lze vygenerovat pomocí poskytnutého nástroje příkazového řádku k4arecorder . Nahrávky lze také přizpůsobit a nahrát přímo pomocí rozhraní API pro záznam.

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

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

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

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

Otevření souboru záznamu

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

Čtení zachytávání

Jakmile je soubor otevřený, můžeme začít číst záznamy z nahrávky. Tento další příklad přečte každý záznam 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 záznamu

Jakmile se dostaneme na konec souboru, možná se budeme chtít vrátit a znovu ho přečíst. Tento proces může být proveden zpětným k4a_playback_get_previous_capture()čtením , ale může to být velmi pomalé v závislosti na délce záznamu. Místo toho můžeme funkci použít k4a_playback_seek_timestamp() k přechodu na konkrétní bod v souboru.

V tomto příkladu určíme časové razítka v mikrosekundách, které se mají hledat v různých bodech 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 můžou obsahovat také různá metadata, jako je sériové číslo zařízení a verze firmwaru. Tato metadata se ukládají do značek nahrávek, 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 do souboru záznamu. Mnohé z těchto hodnot jsou k dispozici jako součást k4a_record_configuration_t struktury a lze je k4a_playback_get_record_configuration() číst pomocí funkce.

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 Notes
K4A_COLOR_MODE "VYPNUTO" color_format / color_resolution Možné hodnoty: "OFF", "MJPG_1080P", "NV12_720P", "YUY2_720P" atd.
K4A_DEPTH_MODE "VYPNUTO" depth_mode / depth_track_enabled Možné hodnoty: "OFF, "NFOV_UNBINNED", "PASSIVE_IR" atd.
K4A_IR_MODE "VYPNUTO" depth_mode / ir_track_enabled Možné hodnoty: "OFF", "ACTIVE", "PASIVNÍ"
K4A_IMU_MODE "VYPNUTO" 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 barev 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ých razítek níže.
K4A_COLOR_TRACK Nic Viz Formát souboru záznamu – identifikace stop.
K4A_DEPTH_TRACK Nic Viz Formát souboru záznamu – identifikace stop.
K4A_IR_TRACK Nic Viz Formát souboru záznamu – identifikace stop.
K4A_IMU_TRACK Nic Viz Formát souboru záznamu – identifikace stop.

Synchronizace časového razítka

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

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

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

Počáteční posun je také k dispozici ve struktuře k4a_record_configuration_t .