本文內(nèi)容
● 使用回放API
● 時(shí)間戳同步
傳感器SDK提供了用于將設(shè)備數(shù)據(jù)錄制到 Matroska (.mkv) 文件的 API 接口。 Matroska 容器格式可以存儲(chǔ)視頻數(shù)據(jù)、IMU數(shù)據(jù)和設(shè)備校準(zhǔn)信息。您可以使用 k4arecorder 命令行工具進(jìn)行錄制,也可以直接使用錄制 API 來錄制內(nèi)容。
有關(guān)錄制 API 的詳細(xì)信息,請(qǐng)參閱 。
有關(guān) Matroska 文件格式規(guī)范的詳細(xì)信息,請(qǐng)參閱 打開一個(gè)錄制文件,輸出錄制長(zhǎng)度,然后使用 關(guān)閉該文件。
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);
讀取 Capture
打開文件后,可以讀取錄制內(nèi)容中的 Capture。 以下示例演示讀取文件中的每個(gè) Capture。
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; }
在錄制內(nèi)容中查找
到達(dá)文件末尾后,我們可能需要返回并再次讀取。 若要完成此過程,可以使用 進(jìn)行回讀,但根據(jù)錄制內(nèi)容的長(zhǎng)度,這種做法可能非常緩慢。 我們可以改用 函數(shù)轉(zhuǎn)到文件中的時(shí)間點(diǎn)。
在此示例中,我們以微秒為單位指定了時(shí)間戳,以定位到文件中的各個(gè)時(shí)間點(diǎn)。
// 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; }
讀取標(biāo)記信息
錄制內(nèi)容還可能包含各種元數(shù)據(jù),例如設(shè)備序列號(hào)和固件版本。 此元數(shù)據(jù)存儲(chǔ)在錄制標(biāo)記中,可以使用 函數(shù)來訪問。
// 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"); }
錄制標(biāo)記列表
下面是可以包含在錄制文件中的所有默認(rèn)標(biāo)記的列表。 其中的許多值可用作 結(jié)構(gòu)的一部分,可以使用 函數(shù)來讀取。
如果某個(gè)標(biāo)記不存在,則假設(shè)采用默認(rèn)值。