API de lecture Azure Kinect
Le Kit de développement logiciel (SDK) de capteur fournit une API pour l’enregistrement des données de l’appareil dans un fichier Matroska (.mkv). Le format de conteneur Matroska stocke les pistes vidéo, les échantillons d’IMU et l’étalonnage des appareils. Vous pouvez générer des enregistrements à l’aide de l’utilitaire de ligne de commande k4arecorder fourni. Vous pouvez également personnaliser et enregistrer des enregistrements directement à l’aide de l’API d’enregistrement.
Pour plus d’informations sur l’API d’enregistrement, consultez k4a_record_create()
.
Pour plus d’informations sur les spécifications de format de fichier Matroska, consultez la page Format de fichier d’enregistrement.
Utiliser l’API de lecture
Vous pouvez ouvrir des fichiers d’enregistrement à l’aide de l’API de lecture. L’API de lecture donne accès aux données de capteur dans le même format que le reste du Kit de développement logiciel (SDK) du capteur.
Ouvrir un fichier d’enregistrement
Dans l’exemple suivant, nous ouvrons un enregistrement à l’aide de la commande k4a_playback_open()
, imprimons la longueur de l’enregistrement, puis fermons le fichier à l’aide de la commande 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);
Lire les captures
Une fois le fichier ouvert, nous pouvons commencer à lire les captures de l’enregistrement. L’exemple suivant lit chacune des captures dans le fichier.
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;
}
Rechercher dans un enregistrement
Une fois que nous avons atteint la fin du fichier, nous pouvons revenir en arrière et le relire. Vous pouvez effectuer ce processus en lisant en arrière à l’aide de la commande k4a_playback_get_previous_capture()
, mais cela peut prendre beaucoup de temps selon la durée de l’enregistrement.
Au lieu de cela, nous pouvons utiliser la fonction k4a_playback_seek_timestamp()
pour atteindre un point spécifique dans le fichier.
Dans cet exemple, nous spécifions des horodateurs en microsecondes pour rechercher plusieurs points dans le fichier.
// 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;
}
Lire les Informations sur les balises
Les enregistrements peuvent également contenir diverses métadonnées, telles que le numéro de série et les versions du microprogramme de l’appareil. Ces métadonnées sont stockées dans des balises d’enregistrement, accessibles à l’aide de la fonction k4a_playback_get_tag()
.
// 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");
}
Liste de balises d’enregistrement
Vous trouverez ci-dessous la liste de toutes les balises par défaut qui peuvent être incluses dans un fichier d’enregistrement. La plupart de ces valeurs sont disponibles dans le cadre de la structure k4a_record_configuration_t
, et peuvent être lues avec la fonction k4a_playback_get_record_configuration()
.
Si une balise n’existe pas, elle est supposée avoir la valeur par défaut.
Nom de la balise | Valeur par défaut | k4a_record_configuration_t Champ |
Notes |
---|---|---|---|
K4A_COLOR_MODE |
"OFF" | color_format / color_resolution |
Valeurs possibles : "OFF", "MJPG_1080P", "NV12_720P", "YUY2_720P", etc. |
K4A_DEPTH_MODE |
"OFF" | depth_mode / depth_track_enabled |
Valeurs possibles : "OFF, "NFOV_UNBINNED", "PASSIVE_IR", etc. |
K4A_IR_MODE |
"OFF" | depth_mode / ir_track_enabled |
Valeurs possibles : "OFF", "ACTIVE", "PASSIVE" |
K4A_IMU_MODE |
"OFF" | imu_track_enabled |
Valeurs possibles : "ON", "OFF" |
K4A_CALIBRATION_FILE |
"calibration.json" | N/A | Consultez k4a_device_get_raw_calibration() |
K4A_DEPTH_DELAY_NS |
"0" | depth_delay_off_color_usec |
Valeur stockée en nanosecondes, l’API fournit des microsecondes. |
K4A_WIRED_SYNC_MODE |
"STANDALONE" | wired_sync_mode |
Valeurs possibles : "STANDALONE", "MASTER", "SUBORDINATE" |
K4A_SUBORDINATE_DELAY_NS |
"0" | subordinate_delay_off_master_usec |
Valeur stockée en nanosecondes, l’API fournit des microsecondes. |
K4A_COLOR_FIRMWARE_VERSION |
"" | N/A | Version du microprogramme de couleur de l’appareil, par exemple « 1.x.xx » |
K4A_DEPTH_FIRMWARE_VERSION |
"" | N/A | Version du microprogramme de profondeur de l’appareil, par exemple « 1.x.xx » |
K4A_DEVICE_SERIAL_NUMBER |
"" | N/A | Numéro de série de l’appareil d’enregistrement |
K4A_START_OFFSET_NS |
"0" | start_timestamp_offset_usec |
Consultez Synchronisation d’horodatage ci-dessous. |
K4A_COLOR_TRACK |
None | N/A | Consultez Format de fichier d’enregistrement – Identification de pistes. |
K4A_DEPTH_TRACK |
None | N/A | Consultez Format de fichier d’enregistrement – Identification de pistes. |
K4A_IR_TRACK |
None | N/A | Consultez Format de fichier d’enregistrement – Identification de pistes. |
K4A_IMU_TRACK |
None | N/A | Consultez Format de fichier d’enregistrement – Identification de pistes. |
Synchronisation d’horodatage
Le format Matroska nécessite que les enregistrements commencent par un horodateur à zéro. Lors de la synchronisation externe des caméras, le premier horodatage de chaque appareil peut être différent de zéro.
Pour conserver les horodatages d’origine des appareils entre l’enregistrement et la lecture, le fichier stocke un décalage à appliquer aux horodatages.
La balise K4A_START_OFFSET_NS
permet de spécifier un décalage d’horodatage afin que les fichiers puissent être resynchronisés après l’enregistrement. Vous pouvez ajouter ce décalage d’horodatage à chaque horodatage dans le fichier pour reconstruire les horodatages de l’appareil d’origine.
Le décalage de début est également disponible dans la structure k4a_record_configuration_t
.