Rozhraní API pro přehrávání Azure Kinect
Sada SDK pro senzor poskytuje rozhraní API pro zaznamenávání dat zařízení do souboru Matroska (.aro). Formát kontejneru Matroska ukládá video stopy, vzorky IMU a kalibraci zařízení. Nahrávky lze vygenerovat pomocí poskytnutého nástroje příkazového řádku k4arecorder . Nahrávky lze také přizpůsobit a nahrát 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 naleznete na stránce Formát souboru záznamu.
Použití rozhraní API pro přehrávání
Soubory záznamů 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 snímačů ve stejném formátu jako zbytek sady SDK snímače.
Otevření souboru záznamu
V následujícím příkladu otevřete záznam pomocí k4a_playback_open()
, vytiskneme délku záznamu a pak zavřeme soubor s 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);
Čtení zachytávání
Jakmile je soubor otevřený, můžeme začít číst záznamy z nahrávky. Tento další příklad přečte každý záznam 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 záznamu
Jakmile se dostaneme na konec souboru, možná se budeme chtít vrátit a znovu ho přečíst. Tento proces může být proveden zpětným k4a_playback_get_previous_capture()
čtením , ale může to být velmi pomalé v závislosti na délce záznamu.
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 obsahovat také různá metadata, jako je sériové číslo zařízení a verze firmwaru. Tato metadata se ukládají do značek nahrávek, 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é mohou být zahrnuty do souboru záznamu. Mnohé z těchto hodnot jsou k dispozici jako součást k4a_record_configuration_t
struktury a lze je k4a_playback_get_record_configuration()
číst pomocí 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 |
Notes |
---|---|---|---|
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", "PASIVNÍ" |
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", "SUBORDINATE" |
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 firmwaru barev 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 |
"" | – | Záznam sériového čísla zařízení |
K4A_START_OFFSET_NS |
"0" | start_timestamp_offset_usec |
Viz Synchronizace časových razítek níže. |
K4A_COLOR_TRACK |
Nic | – | Viz Formát souboru záznamu – identifikace stop. |
K4A_DEPTH_TRACK |
Nic | – | Viz Formát souboru záznamu – identifikace stop. |
K4A_IR_TRACK |
Nic | – | Viz Formát souboru záznamu – identifikace stop. |
K4A_IMU_TRACK |
Nic | – | Viz Formát souboru záznamu – identifikace stop. |
Synchronizace časového razítka
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é.
Pokud chcete zachovat původní časová razítka ze zařízení mezi záznamem a přehráváním, uloží soubor posun, který se použije u časových razítek.
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 do každého časového razítka v souboru, aby bylo možné rekonstruovat původní časové razítko zařízení.
Počáteční posun je také k dispozici ve struktuře k4a_record_configuration_t
.