Workflow — Acquisition + Archive
What: Acquire from any source on planet earth, verify the bytes, preserve the metadata, normalize to an archival container, push to cold storage.
Skills used
media-ytdlp, ffmpeg-capture, decklink-tools, decklink-docs, gphoto2-tether, ndi-tools, ndi-docs, ffmpeg-streaming, mediamtx-server, ptz-visca, ptz-onvif, ffmpeg-probe, media-mediainfo, media-exiftool, ffmpeg-metadata, ffmpeg-bitstream, media-mkvtoolnix, media-gpac, media-ffmpeg-normalize, ffmpeg-transcode, media-batch, media-cloud-upload, ffmpeg-ocio-colorpro, vfx-oiio, media-ocr-ai, media-tag.
Pipeline
Step 1 — Acquire
Pick per source:
| Source |
Skill |
Method |
| Web video (1000+ sites) |
media-ytdlp |
bestvideo+bestaudio merged, subs + thumbnail + description |
| Screen + webcam + mic |
ffmpeg-capture |
AVFoundation (macOS) / X11 (Linux) / GDI (Windows) |
| Broadcast SDI |
decklink-tools |
ProRes 422 HQ 10-bit + PCM 24-bit, or v210 raw lossless |
| DSLR tethered |
gphoto2-tether |
single shot, intervalometer timelapse, live view MJPEG |
| NDI network |
ndi-tools |
nditools.py find, record to disk |
| RTSP / IP camera |
ffmpeg-streaming or mediamtx-server |
direct capture TCP, or multi-camera fanout with segmented MP4 |
| PTZ-positioned |
ptz-visca / ptz-onvif |
preset-recall, then any of the above |
Step 2 — Verify integrity
- Full-decode pass —
ffmpeg -v error -i <file> -f null - (non-zero exit = corrupt).
- Deep probe —
ffmpeg-probe + media-mediainfo.
- SHA-256 checksum — store alongside the file.
Step 3 — Preserve metadata
media-exiftool — EXIF from photos, MOV udta, XMP sidecars for custom archival fields. ffmpeg-metadata for MKV global + chapter tags.
Step 4 — Normalize to archival container
MKV is the default — supports every codec, attachments, chapters, unlimited tracks. Attach the probe + mediainfo + checksum as sidecar files inside the MKV if using media-mkvtoolnix.
Step 5 — Optional codec normalization
| Archival target |
Container |
Codec |
| Deep archive lossless |
MKV |
FFV1 |
| SMPTE-compliant |
MXF |
JPEG 2000 |
| Apple-friendly |
MOV |
ProRes 422 HQ |
| Cross-platform |
MXF |
DNxHR HQ |
Step 6 — Batch
media-batch (GNU parallel) fans out ingest + integrity + metadata + normalize across N sources.
Step 7 — Cold storage
media-cloud-upload:
| Tier |
Cost |
Retrieval |
| AWS Glacier Deep Archive |
~$1/TB/mo |
12 h |
| Backblaze B2 |
~$6/TB/mo |
instant (warm) |
| Archive.org |
free (PUBLIC) |
instant |
Variants
- Continuous SDI with segmentation — 1-hour segments via
segment muxer, auto-delete after 30 days.
- Automated content tagging — extract keyframes,
media-tag CLIP/SigLIP per frame, consolidate tags in sidecar JSON.
- OCR verification — 0.2 fps extract,
media-ocr-ai per frame, consolidate burn-in text.
- Color-space-aware archival — preserve original color tags; DO NOT auto-convert to sRGB.
- Incremental sync — rsync + post-sync checksum verification.
Gotchas
ffmpeg -v error -i <file> -f null - is cheap integrity. Non-zero exit OR stderr with "Error" = corrupt.
- Checksums are only meaningful AT CAPTURE TIME. Checksumming an already-corrupt file is useless.
- YouTube / Vimeo re-encode on upload.
--format best is NOT original quality. For true originals, you need the uploader's source.
- yt-dlp filenames can contain non-ASCII characters. Use
-o "%(id)s.%(ext)s" for filesystem safety.
--live-from-start needs source support. Most HLS windows are 20–30 min DVR — older content gone.
- DeckLink format codes are 4-letter (
Hp50, Hi59, 2k24). Wrong code = silent black capture. Verify with -list_formats 1.
- 10-bit DeckLink capture requires
-pix_fmt yuv422p10le AND a 10-bit-capable device.
- gphoto2 locks USB. One app claims the camera. Close EOS Utility / Lightroom / Capture One first.
- gphoto2 live-view framerate is camera-dependent (Canon ~24–30 fps, Nikon ~30 fps).
- NDI runtime (NewTek/Vizrt) is a separate install from the SDK.
-c copy preserves codec metadata (HDR SEI, captions) but CONTAINER metadata (chapters, tags) may be lost when changing container.
- MP4
udta varies by writer (Apple / Sony / FFmpeg all different). ExifTool is the most robust reader.
- MKV global / per-track / chapter / attachment tags are all separate. Use
mkvpropedit for in-place edits — ffmpeg is limited.
- ExifTool
-overwrite_original deletes the backup. Keep backups until verified.
- ExifTool needs
-charset filename=UTF8 for non-ASCII paths. Fails silently otherwise.
- MOV timecode lives in a
tmcd track. ffmpeg -map 0 preserves; narrow stream selection drops it.
- FFV1 lossless is NOT supported by consumer players (great for LOC-grade archive, bad for distribution).
- MKV large attachments (GB-scale) slow re-muxing. For huge manifests, use separate sidecar files.
- Fragmented MP4 (via GPAC
MP4Box -frag) is streamable but legacy tools may reject. Archive BOTH.
- J2K encoding is CPU-heavy (~1–2 fps/core at 4K).
- Variable-bitrate archival is storage-expensive. 60-min UHD FFV1 ≈ 500+ GB. Plan accordingly.
- AWS Deep Archive min retention 180 days. Delete before → full charge.
- Archive.org is PUBLIC. Good for public domain; do NOT upload private material.
- Multi-region replication doubles storage cost — worth it for irreplaceable originals.
Example — Archive 24-hour SDI broadcast feed
decklink-tools capture → ffmpeg segmenter → 1-hour MP4 segments → per-segment: full-decode check + SHA-256 + MediaInfo JSON sidecar → batch-upload to Glacier Deep Archive via media-cloud-upload with lifecycle rule for 30-day local purge after upload confirmation.
Related
workflow-broadcast-delivery — the next step if the archive is to be mastered.
workflow-live-production — the live feed that typically drives an acquisition pipeline.
workflow-analysis-quality — integrity / spec verification.
1---2name: workflow-acquisition-archive3description: Ingest from every source — web (yt-dlp), screen / webcam / mic capture, SDI (DeckLink), DSLR tether (gphoto2), NDI network sources, RTSP / IP cameras via MediaMTX, PTZ — then verify integrity (SHA-256 + full-decode pass), preserve metadata (EXIF / XMP / IPTC), normalize to MKV or FFV1 / J2K / ProRes archival containers, and push to cold-storage cloud (Glacier / B2 / Archive.org). Use when the user says "download YouTube playlist", "capture SDI for 24 hours", "archive IP cameras", "preserve VHS rips", "tether DSLR timelapse", "cold-storage upload", or any ingest-to-archive workflow.4---56# Workflow — Acquisition + Archive78**What:** Acquire from any source on planet earth, verify the bytes, preserve the metadata, normalize to an archival container, push to cold storage.910## Skills used1112`media-ytdlp`, `ffmpeg-capture`, `decklink-tools`, `decklink-docs`, `gphoto2-tether`, `ndi-tools`, `ndi-docs`, `ffmpeg-streaming`, `mediamtx-server`, `ptz-visca`, `ptz-onvif`, `ffmpeg-probe`, `media-mediainfo`, `media-exiftool`, `ffmpeg-metadata`, `ffmpeg-bitstream`, `media-mkvtoolnix`, `media-gpac`, `media-ffmpeg-normalize`, `ffmpeg-transcode`, `media-batch`, `media-cloud-upload`, `ffmpeg-ocio-colorpro`, `vfx-oiio`, `media-ocr-ai`, `media-tag`.1314## Pipeline1516### Step 1 — Acquire1718Pick per source:1920| Source | Skill | Method |21|---|---|---|22| Web video (1000+ sites) | `media-ytdlp` | `bestvideo+bestaudio` merged, subs + thumbnail + description |23| Screen + webcam + mic | `ffmpeg-capture` | AVFoundation (macOS) / X11 (Linux) / GDI (Windows) |24| Broadcast SDI | `decklink-tools` | ProRes 422 HQ 10-bit + PCM 24-bit, or `v210` raw lossless |25| DSLR tethered | `gphoto2-tether` | single shot, intervalometer timelapse, live view MJPEG |26| NDI network | `ndi-tools` | `nditools.py find`, record to disk |27| RTSP / IP camera | `ffmpeg-streaming` or `mediamtx-server` | direct capture TCP, or multi-camera fanout with segmented MP4 |28| PTZ-positioned | `ptz-visca` / `ptz-onvif` | preset-recall, then any of the above |2930### Step 2 — Verify integrity3132- **Full-decode pass** — `ffmpeg -v error -i <file> -f null -` (non-zero exit = corrupt).33- **Deep probe** — `ffmpeg-probe` + `media-mediainfo`.34- **SHA-256 checksum** — store alongside the file.3536### Step 3 — Preserve metadata3738`media-exiftool` — EXIF from photos, MOV `udta`, XMP sidecars for custom archival fields. `ffmpeg-metadata` for MKV global + chapter tags.3940### Step 4 — Normalize to archival container4142MKV is the default — supports every codec, attachments, chapters, unlimited tracks. Attach the probe + mediainfo + checksum as sidecar files inside the MKV if using `media-mkvtoolnix`.4344### Step 5 — Optional codec normalization4546| Archival target | Container | Codec |47|---|---|---|48| Deep archive lossless | MKV | FFV1 |49| SMPTE-compliant | MXF | JPEG 2000 |50| Apple-friendly | MOV | ProRes 422 HQ |51| Cross-platform | MXF | DNxHR HQ |5253### Step 6 — Batch5455`media-batch` (GNU parallel) fans out ingest + integrity + metadata + normalize across N sources.5657### Step 7 — Cold storage5859`media-cloud-upload`:6061| Tier | Cost | Retrieval |62|---|---|---|63| AWS Glacier Deep Archive | ~$1/TB/mo | 12 h |64| Backblaze B2 | ~$6/TB/mo | instant (warm) |65| Archive.org | free (PUBLIC) | instant |6667## Variants6869- **Continuous SDI with segmentation** — 1-hour segments via `segment` muxer, auto-delete after 30 days.70- **Automated content tagging** — extract keyframes, `media-tag` CLIP/SigLIP per frame, consolidate tags in sidecar JSON.71- **OCR verification** — 0.2 fps extract, `media-ocr-ai` per frame, consolidate burn-in text.72- **Color-space-aware archival** — preserve original color tags; DO NOT auto-convert to sRGB.73- **Incremental sync** — rsync + post-sync checksum verification.7475## Gotchas7677- **`ffmpeg -v error -i <file> -f null -` is cheap integrity.** Non-zero exit OR stderr with "Error" = corrupt.78- **Checksums are only meaningful AT CAPTURE TIME.** Checksumming an already-corrupt file is useless.79- **YouTube / Vimeo re-encode on upload.** `--format best` is NOT original quality. For true originals, you need the uploader's source.80- **yt-dlp filenames can contain non-ASCII characters.** Use `-o "%(id)s.%(ext)s"` for filesystem safety.81- **`--live-from-start` needs source support.** Most HLS windows are 20–30 min DVR — older content gone.82- **DeckLink format codes are 4-letter** (`Hp50`, `Hi59`, `2k24`). Wrong code = silent black capture. Verify with `-list_formats 1`.83- **10-bit DeckLink capture requires `-pix_fmt yuv422p10le`** AND a 10-bit-capable device.84- **gphoto2 locks USB.** One app claims the camera. Close EOS Utility / Lightroom / Capture One first.85- **gphoto2 live-view framerate is camera-dependent** (Canon ~24–30 fps, Nikon ~30 fps).86- **NDI runtime (NewTek/Vizrt) is a separate install** from the SDK.87- **`-c copy` preserves codec metadata** (HDR SEI, captions) but CONTAINER metadata (chapters, tags) may be lost when changing container.88- **MP4 `udta` varies by writer** (Apple / Sony / FFmpeg all different). ExifTool is the most robust reader.89- **MKV global / per-track / chapter / attachment tags are all separate.** Use `mkvpropedit` for in-place edits — ffmpeg is limited.90- **ExifTool `-overwrite_original` deletes the backup.** Keep backups until verified.91- **ExifTool needs `-charset filename=UTF8`** for non-ASCII paths. Fails silently otherwise.92- **MOV timecode lives in a `tmcd` track.** `ffmpeg -map 0` preserves; narrow stream selection drops it.93- **FFV1 lossless is NOT supported by consumer players** (great for LOC-grade archive, bad for distribution).94- **MKV large attachments (GB-scale) slow re-muxing.** For huge manifests, use separate sidecar files.95- **Fragmented MP4 (via GPAC `MP4Box -frag`) is streamable** but legacy tools may reject. Archive BOTH.96- **J2K encoding is CPU-heavy** (~1–2 fps/core at 4K).97- **Variable-bitrate archival is storage-expensive.** 60-min UHD FFV1 ≈ 500+ GB. Plan accordingly.98- **AWS Deep Archive min retention 180 days.** Delete before → full charge.99- **Archive.org is PUBLIC.** Good for public domain; do NOT upload private material.100- **Multi-region replication doubles storage cost** — worth it for irreplaceable originals.101102## Example — Archive 24-hour SDI broadcast feed103104`decklink-tools` capture → `ffmpeg` segmenter → 1-hour MP4 segments → per-segment: full-decode check + SHA-256 + MediaInfo JSON sidecar → batch-upload to Glacier Deep Archive via `media-cloud-upload` with lifecycle rule for 30-day local purge after upload confirmation.105106## Related107108- `workflow-broadcast-delivery` — the next step if the archive is to be mastered.109- `workflow-live-production` — the live feed that typically drives an acquisition pipeline.110- `workflow-analysis-quality` — integrity / spec verification.