Portfolio
Case study · AI training data

Multi-camera sync and QC for an egocentric video dataset.

Contract work for Prolific: turning raw footage from body-worn cameras into synced, checked and documented scenes, ready to train AI models.

Client
Prolific (London), via Upwork
Period
Aug – Sep 2026 · ~164 hours
Volume
100+ scenes · 2 to 6 cameras each
Cameras
Insta360 GO · DJI Osmo · GoPro

No client footage on this page: the scenes are real homes and real people. Every image here is a diagram I drew.

/ The job

Real homes, cameras on people, one dataset.

People wore cameras on their head or body, or held them, while doing everyday things at home: cooking, cleaning, playing board and card games. Each scene had 2 to 6 cameras rolling at once, with a clap at the start and at the end to sync them.

My part was everything between the raw upload and an accepted scene: sync, trim, quality checks, the acceptance review, a mosaic of all cameras, and a report per scene. It started with one test scene and continued as an hourly contract, renewed batch after batch through August and September.

/ What made it hard

Same scene, very different cameras.

01

Mixed hardware

Different camera brands, sometimes in the same scene. Frame rates like 50 next to 59.94 or 25 fps, 1080p next to 1440p, H.264 next to HEVC.

02

Clocks that drift

Each camera’s clock runs at its own pace. I measured up to 55 ppm between units: about 80 ms over 25 minutes. A take can start in sync and end out of tolerance.

03

Missing or weak claps

Some sessions had no sync clap at all, or only on one camera. In a kitchen, plenty of sounds are louder than a clap.

04

Metadata you can’t trust

Some cameras wrote rotation flags that turned an upright image sideways, and many had their clock unset (dates in 1970).

05

Strict acceptance rules

At least 1080p and 24 fps, zero post-production (no cuts, color, stabilization, audio work or blur), no visible personal data, nobody outside the consent list.

/ Sync

Find the same instant in every camera.

Each camera starts recording at a different moment. The clap is the shared mark: once it lines up on every track, the whole take lines up — at least at the start.

RAW · EACH CAMERA STARTS ON ITS OWNCAM 1CAM 2CAM 3SYNCED · ALIGNED ON THE CLAPCAM 1CAM 2CAM 3clap
Illustration · not client audio
33 ms tolerance0510152025minutes into the take04080error, msshift only · ~80 msconformed
Illustration based on a measured drift of 55 ppm
/ Drift

In sync at the start doesn’t mean in sync at the end.

Clocks drift. A fixed offset keeps the error growing until it leaves the tolerance. Checking against the closing clap shows it; conforming the timing — not just shifting the file — keeps the whole take inside.

/ How I worked

Six steps per scene.

  1. 01

    Sync on the clap

    A coarse offset from the whole audio track first, then refined on sharp sounds that every camera hears: the clap, knocks, doors. Sound reaches each mic at a different time (3.4 m of distance is already 10 ms), so I average many events instead of trusting one. Tolerance: 33 ms. Typical worst-case residual per scene: 0.4 to 20 ms.

  2. 02

    Verify on the closing clap, then fix drift

    If the time between the first and last clap differs between cameras, the clocks drifted. Then shifting is not enough: I conform the timing (timestamps rescaled, same frames, picture untouched) and measure again. In one scene the end-of-take error went from 41 ms to 6.8 ms.

  3. 03

    Trim to identical in/out, without re-encoding

    Every camera cut to the exact same start and duration. Streams are copied, not re-compressed; only the few frames before the next keyframe get re-encoded (usually 0 to 5 per file). Audio is copied from the original.

  4. 04

    Technical QC on the final files

    Resolution, frame rate, audio, motion blur and a full decode check — measured on the delivered cut, not on the source. If a number goes in the report, it was measured on that file.

  5. 05

    Human review for the judgment calls

    Personal data on screen, people outside the consent list, phone calls, and the activity thresholds (hands on objects, moving around, two-person conversation). When the source itself was wrong — like a bad rotation flag — I delivered it faithful and flagged it instead of “fixing” it.

  6. 06

    Mosaic, delivery and a report per scene

    A synced grid of all cameras, same duration, plus a short report: offsets, measured residuals, flags and spoken language (detected with Whisper). Uploaded to Google Drive and checked against the local copy.

The measurable parts (offsets, drift, resolution, frame rate, blur) ran as scripted checks in Python and ffmpeg. The judgment calls I made by eye, scene by scene.

/ Delivery

One grid, one timecode.

Each scene shipped as identical-length camera files plus a mosaic of all of them, so anyone reviewing can see at a glance that every view shows the same moment. The layout adapts to the number of cameras and their orientation.

CAM 112:04:17CAM 212:04:17CAM 312:04:17CAM 412:04:174 cameras · same timecode2 cameras3 cameras
Schematic · grey blocks stand in for camera views
/ Outcome

One test scene, then batch after batch.

/ Tools
ffmpegffprobePythonNumPyWhisperrcloneGoogle Drive
/ More work

Other projects.

Nicolás Barrilis
/ About

Nicolás Barrilis

Video editor and motion designer from Santa Fe, Argentina. For more than 8 years I've worked with brands in Latin America and abroad on video, marketing, automation and AI. Since 2026 I also work on video data for AI training.