Share via


De Azure Kinect-afspeel-API

De sensor-SDK biedt een API voor het vastleggen van apparaatgegevens naar een Matroska-bestand (.wmv). De Matroska-containerindeling slaat videosporen, IMU-monsters en apparaatkalibratie op. Opnamen kunnen worden gegenereerd met behulp van het meegeleverde opdrachtregelprogramma k4arecorder . Opnamen kunnen ook rechtstreeks worden aangepast en opgenomen met behulp van de record-API.

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

Zie de pagina Opnamebestandsindeling voor meer informatie over de matroska-bestandsindelingspecificaties .

De afspeel-API gebruiken

Opnamebestanden kunnen worden geopend met behulp van de afspeel-API. 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 behulp van k4a_playback_open(), drukken we de lengte van de opname af en sluiten we het bestand vervolgens 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 opnameopnamen. In dit volgende voorbeeld worden alle opnamen 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 binnen een opname

Zodra het einde van het bestand is bereikt, kunnen we teruggaan en het opnieuw lezen. Dit proces kan worden uitgevoerd door achteruit te lezen met k4a_playback_get_previous_capture(), maar het kan erg traag zijn, afhankelijk van de 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 naar verschillende punten in het bestand te zoeken.

// 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 kunnen worden geopend 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 recordtags

Hieronder ziet 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.

Codenaam Standaardwaarde k4a_record_configuration_t Veld Opmerkingen
K4A_COLOR_MODE "UIT" color_format / color_resolution Mogelijke waarden: "UIT", "MJPG_1080P", "NV12_720P", "YUY2_720P", enzovoort
K4A_DEPTH_MODE "UIT" depth_mode / depth_track_enabled Mogelijke waarden: "UIT, "NFOV_UNBINNED", "PASSIVE_IR", enzovoort
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.json" N.v.t. Zie k4a_device_get_raw_calibration()
K4A_DEPTH_DELAY_NS "0" depth_delay_off_color_usec De waarde die is opgeslagen in nanoseconden, biedt API microseconden.
K4A_WIRED_SYNC_MODE "ZELFSTANDIG" wired_sync_mode Mogelijke waarden: "STANDALONE", "MASTER", "SUBORDINATE"
K4A_SUBORDINATE_DELAY_NS "0" subordinate_delay_off_master_usec De waarde die is opgeslagen in nanoseconden, biedt API microseconden.
K4A_COLOR_FIRMWARE_VERSION "" N.v.t. Firmwareversie van apparaatkleur, bijvoorbeeld '1.x.xx'
K4A_DEPTH_FIRMWARE_VERSION "" N.v.t. Firmwareversie van apparaatdiepte, bijvoorbeeld '1.x.xx'
K4A_DEVICE_SERIAL_NUMBER "" N.v.t. Serienummer van apparaat opnemen
K4A_START_OFFSET_NS "0" start_timestamp_offset_usec Zie De tijdstempelsynchronisatie hieronder.
K4A_COLOR_TRACK Geen N.v.t. Zie Opnamebestandsindeling - Sporen identificeren.
K4A_DEPTH_TRACK Geen N.v.t. Zie Opnamebestandsindeling - Sporen identificeren.
K4A_IR_TRACK Geen N.v.t. Zie Opnamebestandsindeling - Sporen identificeren.
K4A_IMU_TRACK Geen N.v.t. Zie 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 opnemen 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 tijdstempelverschil op te geven, zodat bestanden na opname opnieuw kunnen worden gesynchroniseerd. Deze tijdstempelverschil kan worden toegevoegd aan elke tijdstempel in het bestand om de oorspronkelijke tijdstempels van het apparaat te reconstrueren.

De begin offset is ook beschikbaar in de k4a_record_configuration_t struct.