Azure Kinect 播放 API

感應器 SDK 提供可以將裝置資料錄製到 Matroska (.mkv) 檔案的 API。 Matroska 容器格式會儲存視訊播放軌、IMU 範例和裝置校正。 您可以使用提供的 k4arecorder 命令列公用程式來產生錄製內容。 您也可以直接使用錄製 API 來自訂和錄製錄製內容。

如需錄製 API 的詳細資訊,請參閱 k4a_record_create()

如需 Matroska 檔案格式規格的詳細資訊,請參閱錄製檔案格式頁面。

使用播放 API

您可以使用播放 API 來開啟錄製檔案。 播放 API 以和其他感應器 SDK 相同的格式來存取感應器資料。

開啟記錄檔

在下列範例中,我們會使用 k4a_playback_open() 來開啟錄製內容,列印錄製內容的長度,然後使用 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);

讀取擷取

檔案開啟之後,我們可以開始從錄製內容中讀取擷取。 下一個範例會讀取檔案中的各個擷取。

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

在錄製內容內搜尋

到達檔案結尾時,我們可能會想要回頭重新讀取一次。 這個流程可以透過使用 k4a_playback_get_previous_capture() 進行向後讀取來完成,但取決於錄製內容的長度,此流程可能會非常緩慢。 我們可以改用 k4a_playback_seek_timestamp() 函式來移動到檔案中的特定時間點。

在此範例中,我們會指定時間戳記 (以微秒為單位) 來搜尋檔案中的各個時間點。

// 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() 函式來存取。

// 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() 函式來讀取。

如果標記不存在,則假設該標籤為預設值。

標記名稱 預設值 k4a_record_configuration_t 欄位 備註
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" N/A 請參閱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 "" N/A 裝置色彩韌體版本,例如「1.x.xx」
K4A_DEPTH_FIRMWARE_VERSION "" N/A 裝置深度韌體版本,例如「1.x.xx」
K4A_DEVICE_SERIAL_NUMBER "" N/A 錄製裝置序號
K4A_START_OFFSET_NS "0" start_timestamp_offset_usec 請參閱下面的時間戳記同步處理
K4A_COLOR_TRACK None N/A 請參閱錄製檔案格式 - 識別播放軌
K4A_DEPTH_TRACK None N/A 請參閱錄製檔案格式 - 識別播放軌
K4A_IR_TRACK None N/A 請參閱錄製檔案格式 - 識別播放軌
K4A_IMU_TRACK None N/A 請參閱錄製檔案格式 - 識別播放軌

時間戳記同步處理

Matroska 格式規定,錄製內容必須以數值為零的時間戳記開始。 在外部同步處理相機時,各裝置的第一個時間戳記可以是不為零。

為了保留錄製和播放之間的原始裝置時間戳記,檔案會儲存要套用至時間戳記的位移值。

標記 K4A_START_OFFSET_NS 可指定時間戳記位移值,以便在錄製後重新同步處理檔案。 這個時間戳記位移值可以加到檔案中的每一個時間戳記,以重建原本的裝置時間戳記。

結構 k4a_record_configuration_t 中也提供起始位移值。