Video timestamp format#

When recording videos, the application automatically saves frame timestamps to a JSON file alongside the video file.

File naming#

Note

If you would like more information on the output path structure and settings, please refer to the Recording output options section.

For a video file named recording_2025-10-23_143052.mp4, the timestamp file will be:

recording_2025-10-23_143052.mp4_timestamps.json

JSON structure#

{
  "video_file": "recording_2025-10-23_143052.mp4",
  "num_frames": 1500,
  "timestamps": [
    1729693852.123456,
    1729693852.156789,
    1729693852.190123
  ],
  "start_time": 1729693852.123456,
  "end_time": 1729693902.123456,
  "duration_seconds": 50.0
}

Fields#

  • video_file: Name of the associated video file

  • num_frames: Total number of frames recorded

  • timestamps: Array of Unix timestamps (seconds since epoch with microsecond precision) for each frame

  • start_time: Timestamp of the first frame

  • end_time: Timestamp of the last frame

  • duration_seconds: Total recording duration in seconds

Usage#

The timestamps correspond to the time each frame was captured by the camera (from FrameData.timestamp) when that timestamp is provided by the caller. If no timestamp is provided, the recorder falls back to time.time() at enqueue time.

This allows precise synchronization with:

  • DLC pose estimation results

  • External sensors or triggers

  • Other data streams recorded during the same session

Loading timestamps in Python#

import json
from datetime import datetime

# Load timestamps
with open('recording_2025-10-23_143052.mp4_timestamps.json', 'r') as f:
    data = json.load(f)

print(f"Video: {data['video_file']}")
print(f"Total frames: {data['num_frames']}")
print(f"Duration: {data['duration_seconds']:.2f} seconds")

# Convert first timestamp to human-readable format
start_dt = datetime.fromtimestamp(data['start_time'])
print(f"Recording started: {start_dt.isoformat()}")

# Calculate average frame rate (based on timestamps)
avg_fps = data['num_frames'] / data['duration_seconds'] if data['duration_seconds'] else 0.0
print(f"Average FPS: {avg_fps:.2f}")

# Access individual frame timestamps
for frame_idx, timestamp in enumerate(data['timestamps']):
    print(f"Frame {frame_idx}: {timestamp}")

Notes#

About timestamps#

  • Timestamps use time.time() (Unix epoch seconds) when no explicit timestamp is supplied to the recorder.

  • Frame timestamps are captured when frames are enqueued for writing (before encoding), and when provided by the caller can represent camera capture time.

  • If frames are dropped due to queue overflow, those frames will not have timestamps in the array.

  • The timestamp array length should match the number of frames in the video file.

The encoded video is written with a fixed input frame rate configured when recording starts.

The timestamps reflect capture/enqueue timing and may not perfectly match the encoded frame pacing, especially if frames are dropped or capture timing varies.