本文內容
● 使用回放API
● 時(shí)間戳同步
傳感器SDK提供了用于將設備數據錄制到 Matroska (.mkv) 文件的 API 接口。 Matroska 容器格式可以存儲視頻數據、IMU數據和設備校準信息。您可以使用 k4arecorder 命令行工具進(jìn)行錄制,也可以直接使用錄制 API 來(lái)錄制內容。
有關(guān)錄制 API 的詳細信息,請參閱 k4a_record_create()。
有關(guān) Matroska 文件格式規范的詳細信息,請參閱錄制文件格式頁(yè)。
使用回放 API
錄制文件可以使用回放 API 進(jìn)行錄像回放。 通過(guò)回放 API 可以訪(fǎng)問(wèn)格式與 SDK 相同的傳感器數據。
打開(kāi)錄制文件
在以下示例中,我們將使用 k4a_playback_open() 打開(kāi)一個(gè)錄制文件,輸出錄制長(cháng)度,然后使用 k4a_playback_close() 關(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
打開(kā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;
}
在錄制內容中查找
到達文件末尾后,我們可能需要返回并再次讀取。 若要完成此過(guò)程,可以使用 k4a_playback_get_previous_capture() 進(jìn)行回讀,但根據錄制內容的長(cháng)度,這種做法可能非常緩慢。 我們可以改用 k4a_playback_seek_timestamp() 函數轉到文件中的時(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;
}
讀取標記信息
錄制內容還可能包含各種元數據,例如設備序列號和固件版本。 此元數據存儲在錄制標記中,可以使用 k4a_playback_get_tag() 函數來(lái)訪(fǎng)問(wèn)。
// 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");
}
錄制標記列表
下面是可以包含在錄制文件中的所有默認標記的列表。 其中的許多值可用作 k4a_record_configuration_t 結構的一部分,可以使用 k4a_playback_get_record_configuration() 函數來(lái)讀取。
如果某個(gè)標記不存在,則假設采用默認值。
標記名稱(chēng) | 默認值 | 備注 | |
K4A_COLOR_MODE | "OFF" | color_format / color_resolution | 可能的值:"OFF"、"MJPG_1080P"、"NV12_720P"、"YUY2_720P" 等 |
K4A_DEPTH_MODE | "OFF" | depth_mode / depth_track_enabled | 可能的值:"OFF"、"NFOV_UNBINNED"、"PASSIVE_IR" 等 |
K4A_IR_MODE | "OFF" | depth_mode / ir_track_enabled | 可能的值:"OFF"、"ACTIVE"、"PASSIVE" |
K4A_IMU_MODE | "OFF" | imu_track_enabled | 可能的值:"ON"、"OFF" |
K4A_CALIBRATION_FILE | "calibration.json" | 不適用 | 請參見(jiàn)k4a_device_get_raw_calibration() |
K4A_DEPTH_DELAY_NS | "0" | depth_delay_off_color_usec | 值以納秒為單位存儲,API 以微秒為單位。 |
K4A_WIRED_SYNC_MODE | "STANDALONE" | wired_sync_mode | 可能的值:"STANDALONE"、"MASTER"、"SUBORDINATE" |
K4A_SUBORDINATE_DELAY_NS | "0" | subordinate_delay_off_master_usec | 值以納秒為單位存儲,API 以微秒為單位。 |
K4A_COLOR_FIRMWARE_VERSION | "" | 不適用 | 設備顏色固件版本,例如 "1.x.xx" |
K4A_DEPTH_FIRMWARE_VERSION | "" | 不適用 | 設備深度固件版本,例如 "1.x.xx" |
K4A_DEVICE_SERIAL_NUMBER | "" | 不適用 | 錄制設備序列號 |
K4A_START_OFFSET_NS | "0" | start_timestamp_offset_usec | 請參閱下面的時(shí)間戳同步。 |
K4A_COLOR_TRACK | None | 不適用 | 請參閱錄制文件格式 - 識別篇目。 |
K4A_DEPTH_TRACK | None | 不適用 | 請參閱錄制文件格式 - 識別篇目。 |
K4A_IR_TRACK | None | 不適用 | 請參閱錄制文件格式 - 識別篇目。 |
K4A_IMU_TRACK | None | 不適用 | 請參閱錄制文件格式 - 識別篇目。 |
時(shí)間戳同步
Matroska 格式要求錄制內容必須以時(shí)間戳 0 開(kāi)頭。 使用多機同步時(shí),每個(gè)設備中的第一個(gè)時(shí)間戳可以不為 0。
為了在錄制和播放之間切換時(shí)保留設備的原始時(shí)間戳,該文件會(huì )存儲一個(gè)要應用到時(shí)間戳的偏移量。
K4A_START_OFFSET_NS 標記用于指定時(shí)間戳偏移量,以便在錄制后可以重新同步文件。 可將此時(shí)間戳偏移量添加到文件中的每個(gè)時(shí)間戳,以重新構造原始設備時(shí)間戳。
起始偏移量也會(huì )在 k4a_record_configuration_t 結構中提供。