De Afspeel-API van Azure Kinect

De sensor-SDK biedt een API voor het vastleggen van apparaatgegevens in een Matroska-bestand (.mkv). In de Matroska-containerindeling worden videotracks, IMU-voorbeelden en apparaatbraties op basis van apparaten op basis van de containerindeling op basis van de inhoud op de computer op een computer op het apparaat geplaatst. Opnamen kunnen worden gegenereerd met behulp van het opgegeven opdrachtregelprogramma k4arecorder. Opnamen kunnen ook rechtstreeks worden aangepast en vastgelegd met behulp van de record-API.

Zie voor meer informatie over de k4a_record_create() opname-API.

Zie de pagina Recording File Format voor meer informatie over de matroska-bestandsindelingsspecificaties.

De API voor afspelen gebruiken

Opnamebestanden kunnen worden geopend met behulp van de API voor afspelen. De afspeel-API biedt toegang tot sensorgegevens in dezelfde indeling als de rest van de sensor-SDK.

Een recordbestand openen

In het volgende voorbeeld openen we een opname met , drukken we de k4a_playback_open() opnamelengte af en sluiten we het bestand met 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);

Leesopnamen

Zodra het bestand is geopend, kunnen we beginnen met het lezen van opnamen van de opname. In het volgende voorbeeld worden alle vastleggen in het bestand gelezen.

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

Zoeken in een opname

Zodra het einde van het bestand is bereikt, kunnen we teruggaan en het opnieuw lezen. Dit proces kan worden uitgevoerd door terug te lezen met , maar het kan erg traag zijn, afhankelijk van de k4a_playback_get_previous_capture() lengte van de opname. In plaats daarvan kunnen we de k4a_playback_seek_timestamp() functie gebruiken om naar een specifiek punt in het bestand te gaan.

In dit voorbeeld geven we tijdstempels op in microseconden om te zoeken naar verschillende punten in het bestand.

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

Taggegevens lezen

Opnamen kunnen ook verschillende metagegevens bevatten, zoals het serienummer van het apparaat en firmwareversies. Deze metagegevens worden opgeslagen in opnametags, die toegankelijk zijn met behulp van de k4a_playback_get_tag() functie .

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

Lijst met recordstags

Hieronder vindt u een lijst met alle standaardtags die kunnen worden opgenomen in een opnamebestand. Veel van deze waarden zijn beschikbaar als onderdeel van de k4a_record_configuration_t struct en kunnen worden gelezen met de k4a_playback_get_record_configuration() functie .

Als er geen tag bestaat, wordt ervan uitgegaan dat deze de standaardwaarde heeft.

Tagnaam Standaardwaarde k4a_record_configuration_t Veld Notities
K4A_COLOR_MODE 'UIT' color_format / color_resolution Mogelijke waarden: 'UIT', 'MJPG_1080P', 'NV12_720P', 'YUY2_720P', en meer
K4A_DEPTH_MODE 'UIT' depth_mode / depth_track_enabled Mogelijke waarden: "UIT, "NFOV_UNBINNED", "PASSIVE_IR", en
K4A_IR_MODE 'UIT' depth_mode / ir_track_enabled Mogelijke waarden: 'UIT', 'ACTIEF', 'PASSIEF'
K4A_IMU_MODE 'UIT' imu_track_enabled Mogelijke waarden: 'AAN', 'UIT'
K4A_CALIBRATION_FILE 'calibration.jsaan' N.v.t. Zie k4a_device_get_raw_calibration()
K4A_DEPTH_DELAY_NS "0" depth_delay_off_color_usec Waarde opgeslagen in nanoseconden, API biedt microseconden.
K4A_WIRED_SYNC_MODE 'ZELFSTANDIG' wired_sync_mode Mogelijke waarden: 'STANDALONE', 'MASTER', 'SUBORDINATE'
K4A_SUBORDINATE_DELAY_NS "0" subordinate_delay_off_master_usec Waarde opgeslagen in nanoseconden, API biedt microseconden.
K4A_COLOR_FIRMWARE_VERSION "" N.v.t. Firmwareversie van apparaatkleur, bijvoorbeeld '1.x.xx'
K4A_DEPTH_FIRMWARE_VERSION "" N.v.t. Firmwareversie voor apparaatdiepte, bijvoorbeeld '1.x.xx'
K4A_DEVICE_SERIAL_NUMBER "" N.v.t. Serienummer van het apparaat opnemen
K4A_START_OFFSET_NS "0" start_timestamp_offset_usec Zie Tijdstempelsynchronisatie hieronder.
K4A_COLOR_TRACK Geen N.v.t. Zie Recording File Format - Identifying tracks (Opnamebestandsindeling - Sporen identificeren).
K4A_DEPTH_TRACK Geen N.v.t. Zie Recording File Format - Identifying tracks (Opnamebestandsindeling - Sporen identificeren).
K4A_IR_TRACK Geen N.v.t. Zie Recording File Format - Identifying tracks (Opnamebestandsindeling - Sporen identificeren).
K4A_IMU_TRACK Geen N.v.t. Zie Recording File Format - Identifying tracks (Opnamebestandsindeling - Sporen identificeren).

Tijdstempelsynchronisatie

De Matroska-indeling vereist dat opnamen beginnen met een tijdstempel van nul. Wanneer u camera's extern synchroniseert,kan de eerste tijdstempel van elk apparaat niet nul zijn.

Als u de oorspronkelijke tijdstempels van de apparaten tussen opname en afspelen wilt behouden, slaat het bestand een offset op die moet worden toegepast op de tijdstempels.

De K4A_START_OFFSET_NS tag wordt gebruikt om een tijdstempel-offset op te geven, zodat bestanden na de opname opnieuw kunnen worden gesynchroniseerd. Deze tijdstempel-offset kan worden toegevoegd aan elke tijdstempel in het bestand om de oorspronkelijke tijdstempels van het apparaat te reconstrueren.

De start-offset is ook beschikbaar in k4a_record_configuration_t de struct.