Rozhraní API pro přehrávání v Azure Kinectu
Sada SDK pro senzor poskytuje rozhraní API pro záznam dat zařízení do souboru Matroska (.mkv). Formát kontejneru Matroska ukládá video stopy, vzorky IMU a kalibraci zařízení. Nahrávky lze generovat pomocí poskytnutého nástroje příkazového řádku k4arecorder . Nahrávky je také možné přizpůsobit a nahrávat přímo pomocí rozhraní API pro záznam.
Další informace o rozhraní API pro nahrávání najdete v tématu k4a_record_create()
.
Další informace o specifikacích formátu souboru Matroska najdete na stránce Formát souboru záznamu .
Použití rozhraní API pro přehrávání
Soubory záznamu je možné otevřít pomocí rozhraní API pro přehrávání. Rozhraní API pro přehrávání poskytuje přístup k datům ze senzorů ve stejném formátu jako zbytek sady SDK pro senzory.
Otevření souboru záznamu
V následujícím příkladu otevřeme nahrávku pomocí k4a_playback_open()
příkazu , vytiskneme délku záznamu a pak soubor zavřeme pomocí k4a_playback_close()
příkazu .
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);
Čtení zachycení
Jakmile je soubor otevřený, můžeme začít číst záznamy ze záznamu. Tento další příklad přečte všechny záznamy v souboru.
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;
}
Hledání v rámci nahrávky
Jakmile dosáhneme konce souboru, možná se budeme chtít vrátit a přečíst si ho znovu. Tento proces lze provést zpětným čtením pomocí k4a_playback_get_previous_capture()
příkazu , ale v závislosti na délce záznamu může být velmi pomalý.
Místo toho můžeme funkci použít k4a_playback_seek_timestamp()
k přechodu na konkrétní bod v souboru.
V tomto příkladu určíme časová razítka v mikrosekundách, která se mají hledat v různých bodech v souboru.
// 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;
}
Čtení informací o značce
Nahrávky můžou také obsahovat různá metadata, například sériové číslo zařízení a verze firmwaru. Tato metadata jsou uložená ve značkách záznamu, ke kterým je možné přistupovat pomocí k4a_playback_get_tag()
funkce .
// 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");
}
Seznam značek záznamů
Níže je seznam všech výchozích značek, které můžou být součástí záznamového souboru. Mnoho z těchto hodnot je k dispozici jako součást k4a_record_configuration_t
struktury a lze je číst pomocí k4a_playback_get_record_configuration()
funkce.
Pokud značka neexistuje, předpokládá se, že má výchozí hodnotu.
Název značky | Výchozí hodnota | k4a_record_configuration_t Pole |
Poznámky |
---|---|---|---|
K4A_COLOR_MODE |
"VYPNUTO" | color_format / color_resolution |
Možné hodnoty: "OFF", "MJPG_1080P", "NV12_720P", "YUY2_720P" atd. |
K4A_DEPTH_MODE |
"VYPNUTO" | depth_mode / depth_track_enabled |
Možné hodnoty: "OFF", "NFOV_UNBINNED", "PASSIVE_IR" atd. |
K4A_IR_MODE |
"VYPNUTO" | depth_mode / ir_track_enabled |
Možné hodnoty: "OFF", "ACTIVE", "PASSIVE" |
K4A_IMU_MODE |
"VYPNUTO" | imu_track_enabled |
Možné hodnoty: "ON", "OFF" |
K4A_CALIBRATION_FILE |
"calibration.json" | – | Viz k4a_device_get_raw_calibration() . |
K4A_DEPTH_DELAY_NS |
"0" | depth_delay_off_color_usec |
Hodnota uložená v nanosekundách poskytuje rozhraní API mikrosekundy. |
K4A_WIRED_SYNC_MODE |
"STANDALONE" | wired_sync_mode |
Možné hodnoty: "STANDALONE", "MASTER", "PODŘÍZENÝ" |
K4A_SUBORDINATE_DELAY_NS |
"0" | subordinate_delay_off_master_usec |
Hodnota uložená v nanosekundách poskytuje rozhraní API mikrosekundy. |
K4A_COLOR_FIRMWARE_VERSION |
"" | – | Verze barevného firmwaru zařízení, například 1.x.xx |
K4A_DEPTH_FIRMWARE_VERSION |
"" | – | Verze firmwaru hloubky zařízení, například 1.x.xx |
K4A_DEVICE_SERIAL_NUMBER |
"" | – | Sériové číslo záznamového zařízení |
K4A_START_OFFSET_NS |
"0" | start_timestamp_offset_usec |
Viz Synchronizace časových razítek níže. |
K4A_COLOR_TRACK |
Žádné | – | Viz Formát souboru záznamu – identifikace stop. |
K4A_DEPTH_TRACK |
Žádné | – | Viz Formát souboru záznamu – identifikace stop. |
K4A_IR_TRACK |
Žádné | – | Viz Formát souboru záznamu – identifikace stop. |
K4A_IMU_TRACK |
Žádné | – | Viz Formát souboru záznamu – identifikace stop. |
Synchronizace časových razítek
Formát Matroska vyžaduje, aby nahrávky začínaly časovým razítkem nuly. Při externí synchronizaci fotoaparátů může být první časové razítko z každého zařízení nenulové.
Aby se zachovala původní časová razítka ze zařízení mezi nahráváním a přehráváním, soubor ukládá posun, který se použije pro časová razítka.
Značka K4A_START_OFFSET_NS
se používá k určení posunu časového razítka, aby bylo možné soubory po záznamu znovu synchronizovat. Tento posun časového razítka lze přidat ke každému časovému razítku v souboru a rekonstruovat původní časová razítka zařízení.
Počáteční posun je také k dispozici ve k4a_record_configuration_t
struktuře.