Die Azure Kinect-Wiedergabe-API

Das Sensor-SDK beinhaltet eine API, um Gerätedaten in einer Matroska-Datei (.mkv) zu erfassen. Im Matroska-Containerformat werden Videospuren, IME-Beispiele und die Gerätekalibrierung gespeichert. Aufzeichnungen können über das bereitgestellte Befehlszeilen-Hilfsprogramm k4arecorder generiert werden. Über die Aufnahme-API können diese Aufzeichnungen zudem angepasst und direkt erfasst werden.

Weitere Informationen zur Aufnahme-API finden Sie unter k4a_record_create().

Weitere Informationen zu den Spezifikationen des Matroska-Dateiformats finden Sie unter Format der Aufzeichnungsdatei.

Verwenden der Wiedergabe-API

Aufzeichnungsdateien können mit der Wiedergabe-API geöffnet werden. Die Wiedergabe-API bietet Zugriff auf Sensordaten im gleichen Format wie die übrigen Elemente des Sensor-SDKs.

Öffnen einer Aufzeichnungsdatei

Im folgenden Beispiel wird unter Verwendung von k4a_playback_open() eine Aufzeichnungsdatei geöffnet. Dann wird die Aufzeichnungslänge gedruckt und die Datei mit k4a_playback_close() geschlossen.

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);

Lesen von Aufnahmen

Nachdem die Datei geöffnet wurde, können wir mit dem Lesen von Aufnahmen in der Aufzeichnung beginnen. Im nächsten Beispiel werden die einzelnen Aufnahmen in der Datei gelesen.

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;
}

Suchen innerhalb einer Aufzeichnung

Sobald wir das Ende der Datei erreicht haben, kann es sinnvoll oder erforderlich sein, die Datei noch einmal zu lesen. Dazu können wir die Datei mit k4a_playback_get_previous_capture() rückwärts lesen. Dieser Vorgang kann abhängig von der Länge der Aufzeichnung jedoch sehr langsam sein. Stattdessen können wir mit der Funktion k4a_playback_seek_timestamp() zu einer bestimmten Stelle innerhalb der Datei wechseln.

In diesem Beispiel geben wir Zeitstempel in Mikrosekunden an, um zu verschiedenen Punkten in der Datei zu gehen.

// 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;
}

Lesen von Taginformationen

Aufzeichnungen können zudem über verschiedene Metadaten verfügen (z. B. die Seriennummer des Geräts oder Firmwareversionen). Diese Metadaten werden in Aufzeichnungstags gespeichert, auf die über die Funktion k4a_playback_get_tag() zugegriffen werden kann.

// 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 der Aufzeichnungstags

In der nachfolgenden Liste sind alle Standardtags aufgeführt, die in einer Aufzeichnungsdatei enthalten sein können: Viele dieser Werte sind als Teil der k4a_record_configuration_t-Struktur verfügbar und können mit der Funktion k4a_playback_get_record_configuration() gelesen werden.

Wenn ein Tag nicht vorhanden ist, wird vom Standardwert ausgegangen.

Tag-Name Standardwert Feld k4a_record_configuration_t Notizen
K4A_COLOR_MODE „OFF“ color_format / color_resolution Mögliche Werte: „OFF“, „MJPG_1080P“, „NV12_720P“, „YUY2_720P“ usw.
K4A_DEPTH_MODE „OFF“ depth_mode / depth_track_enabled Mögliche Werte: „OFF“, „NFOV_UNBINNED“, „PASSIVE_IR“ usw.
K4A_IR_MODE „OFF“ depth_mode / ir_track_enabled Mögliche Werte: „OFF“, „ACTIVE“, „PASSIVE“
K4A_IMU_MODE „OFF“ imu_track_enabled Mögliche Werte: „ON“, „OFF“
K4A_CALIBRATION_FILE „calibration.json“ Siehe k4a_device_get_raw_calibration().
K4A_DEPTH_DELAY_NS "0" depth_delay_off_color_usec Der Wert wird in Nanosekunden gespeichert. Die API gibt Werte in Mikrosekunden an.
K4A_WIRED_SYNC_MODE „STANDALONE“ wired_sync_mode Mögliche Werte: „STANDALONE“, „MASTER“, „SUBORDINATE“
K4A_SUBORDINATE_DELAY_NS "0" subordinate_delay_off_master_usec Der Wert wird in Nanosekunden gespeichert. Die API gibt Werte in Mikrosekunden an.
K4A_COLOR_FIRMWARE_VERSION "" Firmwareversion der Farbeinheit, z. B. „1.x.xx“
K4A_DEPTH_FIRMWARE_VERSION "" Firmwareversion der Tiefeneinheit, z. B. „1.x.xx“
K4A_DEVICE_SERIAL_NUMBER "" Aufzeichnung der Seriennummer des Geräts
K4A_START_OFFSET_NS "0" start_timestamp_offset_usec Weitere Informationen finden Sie unter Synchronisieren von Zeitstempeln weiter unten.
K4A_COLOR_TRACK Keine Weitere Informationen finden Sie unter Format der Aufzeichnungsdatei – Identifizieren von Spuren.
K4A_DEPTH_TRACK Keine Weitere Informationen finden Sie unter Format der Aufzeichnungsdatei – Identifizieren von Spuren.
K4A_IR_TRACK Keine Weitere Informationen finden Sie unter Format der Aufzeichnungsdatei – Identifizieren von Spuren.
K4A_IMU_TRACK Keine Weitere Informationen finden Sie unter Format der Aufzeichnungsdatei – Identifizieren von Spuren.

Synchronisieren von Zeitstempeln

Beim Matroska-Format ist es erforderlich, dass Aufzeichnungen mit dem Zeitstempel 0 beginnen. Bei der externen Synchronisierung von Kameras kann der Zeitstempel der einzelnen Geräte einen anderen Wert als 0 aufweisen.

Um die ursprünglichen Zeitstempel der Geräte zwischen Aufzeichnung und Wiedergabe beizubehalten, wird in der Datei ein Versatz zum Anwenden der Zeitstempel gespeichert.

Das Tag K4A_START_OFFSET_NS wird zum Angeben eines Zeitstempelversatzes verwendet, um Dateien nach der Aufzeichnung erneut synchronisieren zu können. Dieser Zeitstempelversatz kann zu jedem Zeitstempel innerhalb der Datei hinzugefügt werden, um die ursprünglichen Zeitstempel der Geräte wiederherzustellen.

Der Startversatz ist auch in der k4a_record_configuration_t-Struktur verfügbar.