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.