Multiple channels in one file
MCAP stores multiple channels of timestamped, pre-serialized data, so a stereo pair, hand pose and IMU can sit in one file on one log-time axis.
Delivery format
Why MCAP for stereo data
MCAP stores multiple channels of timestamped, pre-serialized data, so a stereo pair, hand pose and IMU can sit in one file on one log-time axis.
MCAP stores message schemas alongside the data, so the files stay readable as your codebase evolves, and it records messages in Protobuf, ROS, JSON and other encodings.
The stereo head rig dataset lists dual fisheye cameras at 1080p per eye, a 62 mm baseline and per-unit calibration, shipped as MCAP.
Topic names, message encoding and which streams go in the file are set in the skill spec, so the files match the tooling you already use.
Definition
It is first-person video from two calibrated cameras, with hand pose and sensor streams, written to .mcap files. MCAP is the container and stereo is the capture. They are separate choices, so this page treats the format and the rig separately.
The site states MCAP delivery in two places. The off-the-shelf stereo head rig, dataset 06, ships as MCAP, and a custom order is packaged in the format you name, such as MP4 with JSON or CSV, MCAP, LeRobot or a custom layout. The site does not state topic names, message schemas, encodings, rates or files per episode. Those are agreed in the skill spec.
Firsthand is not affiliated with Foxglove or the MCAP maintainers. The facts about MCAP below come from mcap.dev and the foxglove/mcap repository, linked in the sources.
The container
MCAP is an open source container file format for multimodal log data, supporting multiple channels of timestamped pre-serialized data. It is serialization-agnostic, so messages can be Protobuf, DDS (CDR), ROS, JSON and more. Its design is row-oriented and append-only, it stores schemas alongside the data, and it offers an optional index plus optional LZ4 or Zstandard chunk compression. mcap.dev also describes it as the default log format in ROS 2.
Reader and writer libraries exist for C++, Go, Python, Rust, Swift and TypeScript, and the mcap CLI can inspect, merge and split files. The repository is MIT-licensed; that is the MCAP project’s licence, not the licence of a Firsthand delivery.
File structure
A file begins and ends with magic bytes. Between them sit a Header record, a data section and a Footer, with an optional summary section. The data section holds Schema, Channel and Message records, plus Chunk, Message Index, Attachment and Metadata records. A Message record carries a channel ID, a log time, a publish time and the data, and timestamps are uint64 nanoseconds since a user-understood epoch.
Attachment records hold auxiliary artifacts, and the specification names calibration data as an example. The registered media type is application/vnd.mcap with the .mcap extension. Whether a Firsthand file uses chunking, compression, CRC checksums or a summary section is not stated on the site; ask for it in the spec.
Streams
For dataset 06 the site states a calibrated stereo head rig with hand-tracking output and 9-axis IMU, shipped as MCAP. Site-wide, Firsthand hand pose is 21 joints per hand with a per-joint visibility flag. Stereo collection lists stereo RGB, depth, IMU and audio, with calibration measured every session and shipped with the episode.
What is not stated is which of those streams are channels in an MCAP file, how they are named or at what rate. Depth, wrist cameras, action segments and contact events are all in that category. If a stream matters to you, name it in the skill spec and confirm it on a Spec Pilot batch rather than assuming it. The first two tables below set out what is stated and what is not.
Comparison
The site states RLDS, LeRobot, WebDataset, HDF5/zarr and Rerun .rrd as exports of the same captured and annotated episodes. MCAP is stated as a packaging option for custom orders and for dataset 06, but the site does not say that an MCAP file is exported from the same canonical episodes, so confirm that in the spec.
The practical difference is the reader. MCAP files are read with the MCAP libraries and CLI, while RLDS, LeRobot and WebDataset are read by their own loaders. If your training loop expects one of those, name it in the spec alongside MCAP. The third table below sets them side by side.
Scale
Off-the-shelf covers what is already in stock: the stereo category lists four stereo datasets, and only dataset 06 is stated as MCAP. Custom collection covers the rest: custom collection at scale through a network of thousands of capture providers, for a consistent, recurring data flow to labs.
Where coverage for the requested tasks and regions is already deep, the median time from signed spec to first validated batch is a median of 48 hours. Where it is thin, turnaround runs three to four weeks. Choosing MCAP adds no separate stage that the site states.
Ordering
Write down the tasks, environments, objects and camera tier your model needs. Then name the streams you want in the file, the topic naming and message encoding your reader expects, whether calibration ships inside the file or beside it, and whether MCAP is the only delivery or sits beside a training format.
Most orders begin with a Spec Pilot, a small first batch that proves the spec and the accept criteria on real footage before you scale. Paid, consented contributors perform the real task, faces and screens are blurred at ingest, and rejected episodes go to a reject log that ships with every batch. The fourth table below shows what each spec element decides.
At a glance
Every collection runs through the same seven-stage end-to-end custom collection pipeline. End-to-end custom data collection is a managed service that takes an AI data need from problem to owned dataset in a single accountable pipeline.
MCAP at a glance
| Property | What the MCAP documentation states | Official source |
|---|---|---|
| What it is | An open source container file format for multimodal log data, with multiple channels of timestamped pre-serialized data | mcap.dev |
| Serialization | Serialization-agnostic: Protobuf, DDS (CDR), ROS, JSON and more | mcap.dev |
| Write design | Row-oriented and append-only | mcap.dev |
| Schemas | Stored alongside the data | mcap.dev |
| Index and compression | Optional index; optional LZ4 or Zstandard chunk compression | mcap.dev |
| Integrity | Optional CRC checksums | mcap.dev |
| File identity | Extension .mcap; registered media type application/vnd.mcap | MCAP specification |
| Timestamps | log_time and publish_time per message, uint64 nanoseconds since a user-understood epoch | MCAP specification |
| Attachments | Auxiliary artifacts such as text, core dumps or calibration data | MCAP specification |
| Libraries and CLI | C++, Go, Python, Rust, Swift and TypeScript; CLI to inspect, merge and split files | foxglove/mcap on GitHub |
| Licence of the project | MIT License | foxglove/mcap on GitHub |
Stream map
| Stream or item | What the site states | In an MCAP delivery, as the site states it |
|---|---|---|
| Stereo pair | Dual fisheye, 1080p per eye, 62 mm baseline (dataset 06) | Dataset 06 is stated as shipped as MCAP; channel layout not stated |
| Calibration | Per-unit (dataset 06); measured every session and shipped with the episode | Placement in the file not stated |
| Hand pose | 21 joints per hand with a per-joint visibility flag; dataset 06 lists hand-tracking output | Channel layout and joint order not stated |
| IMU | 9-axis (dataset 06) | Channel layout and rate not stated |
| Depth | Listed among stereo collection streams | Not stated |
| Wrist cameras, action segments, contact events | Listed in the site’s episode schema | Not stated |
| Topic names, schemas, encoding, rates | Not stated | Agreed in the skill spec |
| Synchronization | Hardware-triggered onto one clock; 2.0 ms cross-stream ceiling | How it maps to message times not stated |
MCAP vs the rest
| MCAP | HDF5 / zarr | RLDS | LeRobot | WebDataset | |
|---|---|---|---|---|---|
| Container | Timestamped multi-channel .mcap file | One .h5 or .zarr group per episode | TFDS-compatible tfrecord shards | Parquet + mp4 per camera, Hugging Face datasets layout | .tar shards of 512 samples, streamed from signed URLs |
| Open or read with | MCAP libraries (C++, Go, Python, Rust, Swift, TypeScript) and the mcap CLI | h5py (HDF5); zarr | tensorflow_datasets | lerobot.common.datasets.lerobot_dataset | The webdataset library |
| Timestamps | log_time and publish_time per message; Firsthand’s use not stated | int64 nanoseconds per stream, PTP domain | int64 nanoseconds, PTP domain, per stream | Per-frame, aligned to the head-camera clock | Set per program in the skill spec |
| Site states it as | Multi-stream timestamped data and calibration files | Random access, sync verification, the most complete export | TensorFlow-based pipelines, RL-style step sequences | Imitation-learning pipelines; the smaller on-disk option | Streaming training beyond local disk |
Skill spec
| Spec element | What it decides | Where it shows up |
|---|---|---|
| Task and skill | What one attempt is and how it is named | Episode boundaries; how episodes map to files is set per program |
| Streams in the file | Stereo pair, hand pose, IMU and any others | The channels you can read; confirm on the Spec Pilot |
| Topic names and encoding | What your reader expects | Set per program |
| Calibration delivery | Inside the file or beside it | Set per program |
| Compression, index, CRC | The MCAP options the files use | Set per program |
| Accept criteria | What passes QA | Reject log per batch |
| Delivery format | How the data is packaged | MCAP alone, or beside RLDS, LeRobot, WebDataset, HDF5 or zarr |
| License | Who owns the dataset | Perpetual, irrevocable, buyer-owned, non-exclusive by default |
Example footage
One real clip already published on this site. It is a format and rig example: a head-mounted stereo capture with hands in frame. It is not an MCAP file and does not show a specific task from this page.
No MCAP-delivered clip is published on the site, so this is the nearest stereo clip. Request a sample to see the delivered files. See stereo sample page, stereo + wrist-cam example videos, request an egocentric data sample.
FAQ
Sources
Tell us the tasks, environments and camera tier your model needs, name the streams and topic layout your reader expects, and specify MCAP as the delivery format. The same episodes can also ship as RLDS, LeRobot, WebDataset or HDF5, with a first validated batch in a median of 48 hours where coverage is deep.