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.