Azure Kinect-uppspelnings-API:et
Sensor-SDK:n tillhandahåller ett API för registrering av enhetsdata till en Matroska-fil (.mkv). Matroska-containerformatet lagrar videospår, IMU-exempel och enhetsavbildning. Inspelningar kan genereras med hjälp av kommandoradsverktyget k4arecorder. Inspelningar kan också anpassas och registreras direkt med hjälp av post-API:et.
Mer information om inspelnings-API:et finns i k4a_record_create() .
Mer information om specifikationerna för Matroska-filformat finns på sidan Inspelningsfilformat.
Använda uppspelnings-API:et
Inspelningsfiler kan öppnas med hjälp av uppspelnings-API:et. Uppspelnings-API:et ger åtkomst till sensordata i samma format som resten av sensor-SDK:n.
Öppna en postfil
I följande exempel öppnar vi en inspelning med k4a_playback_open() , skriver ut inspelningslängden och stänger sedan filen med 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);
Läsinfångningar
När filen är öppen kan vi börja läsa infångade från inspelningen. I nästa exempel läses var och en av infångade data i filen.
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;
}
Söka i en inspelning
När vi har kommit till slutet av filen kanske vi vill gå tillbaka och läsa den igen. Den här processen kan göras genom att läsa bakåt med , men den k4a_playback_get_previous_capture() kan vara mycket långsam beroende på längden på inspelningen.
I stället kan vi använda k4a_playback_seek_timestamp() funktionen för att gå till en specifik punkt i filen.
I det här exemplet anger vi tidsstämplar i mikrosekunder för att söka efter olika punkter i filen.
// 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;
}
Läsa tagginformation
Inspelningar kan också innehålla olika metadata, till exempel enhetens serienummer och versioner av inbyggd programvara. Dessa metadata lagras i inspelningstaggar som kan nås med hjälp av k4a_playback_get_tag() funktionen .
// 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");
}
Posttagglista
Nedan visas en lista över alla standardtaggar som kan ingå i en inspelningsfil. Många av dessa värden är tillgängliga som en del av k4a_record_configuration_t struct-structen och kan läsas med k4a_playback_get_record_configuration() funktionen .
Om det inte finns någon tagg antas den ha standardvärdet.
| Taggnamn | Standardvärde | k4a_record_configuration_t Fältet |
Kommentarer |
|---|---|---|---|
K4A_COLOR_MODE |
"AV" | color_format / color_resolution |
Möjliga värden: "OFF", "MJPG_1080P", "NV12_720P", "YUY2_720P" och så vidare |
K4A_DEPTH_MODE |
"AV" | depth_mode / depth_track_enabled |
Möjliga värden: "OFF, "NFOV_UNBINNED", "PASSIVE_IR" och så vidare |
K4A_IR_MODE |
"AV" | depth_mode / ir_track_enabled |
Möjliga värden: "OFF", "ACTIVE", "PASSIVE" |
K4A_IMU_MODE |
"AV" | imu_track_enabled |
Möjliga värden: "ON", "OFF" |
K4A_CALIBRATION_FILE |
"calibration.jspå" | Ej tillämpligt | Se k4a_device_get_raw_calibration() |
K4A_DEPTH_DELAY_NS |
"0" | depth_delay_off_color_usec |
Värdet som lagras i nanosekunder, API:et tillhandahåller mikrosekunder. |
K4A_WIRED_SYNC_MODE |
"FRISTÅENDE" | wired_sync_mode |
Möjliga värden: "STANDALONE", "MASTER", "SUBORDINATE" |
K4A_SUBORDINATE_DELAY_NS |
"0" | subordinate_delay_off_master_usec |
Värdet som lagras i nanosekunder, API:et tillhandahåller mikrosekunder. |
K4A_COLOR_FIRMWARE_VERSION |
"" | Ej tillämpligt | Version av inbyggd programvara för enhetsfärg, till exempel "1.x.xx" |
K4A_DEPTH_FIRMWARE_VERSION |
"" | Ej tillämpligt | Version av inbyggd programvara för enhetsdjup, till exempel "1.x.xx" |
K4A_DEVICE_SERIAL_NUMBER |
"" | Ej tillämpligt | Registrera enhetens serienummer |
K4A_START_OFFSET_NS |
"0" | start_timestamp_offset_usec |
Se Tidsstämpelsynkronisering nedan. |
K4A_COLOR_TRACK |
Ingen | Ej tillämpligt | Se Inspelningsfilformat – Identifiera spår. |
K4A_DEPTH_TRACK |
Ingen | Ej tillämpligt | Se Inspelningsfilformat – Identifiera spår. |
K4A_IR_TRACK |
Ingen | Ej tillämpligt | Se Inspelningsfilformat – Identifiera spår. |
K4A_IMU_TRACK |
Ingen | Ej tillämpligt | Se Inspelningsfilformat – Identifiera spår. |
Tidsstämpelsynkronisering
Matroska-formatet kräver att inspelningar måste börja med en tidsstämpel på noll. När du synkroniserar kameror externtkan den första tidsstämpeln från varje enhet vara icke-noll.
För att bevara de ursprungliga tidsstämplar från enheterna mellan inspelning och uppspelning lagrar filen en förskjutning som ska tillämpas på tidsstämplar.
Taggen K4A_START_OFFSET_NS används för att ange en tidsstämpelförskjutning så att filerna kan synkroniseras om efter inspelningen. Den här tidsstämpelförskjutningen kan läggas till i varje tidsstämpel i filen för att rekonstruera de ursprungliga enhetens tidsstämplar.
Startförskjutningen är också tillgänglig i k4a_record_configuration_t struct-structen.