46 lines
1.7 KiB
Markdown
46 lines
1.7 KiB
Markdown
# ECP-0034: Raw CMAF Output (CMAF-First, Playlist-Optional)
|
|
|
|
Status: Draft
|
|
Author: Codex
|
|
Reviewers: founder@every.channel
|
|
Created: 2026-02-07
|
|
|
|
## Decision
|
|
|
|
Treat CMAF artifacts (init segment + fMP4 media fragments) as the canonical transport payload for low-latency video in every.channel.
|
|
|
|
Add a subscriber option to write *raw CMAF* files to disk without generating an HLS playlist:
|
|
|
|
- `ec-node moq-subscribe --container cmaf --subscribe-init --raw-cmaf`
|
|
- writes `init.mp4`
|
|
- writes `segment_%06d.m4s`
|
|
|
|
HLS (and any other playlist formats) become optional *views* over those CMAF bytes, generated by a separate component when needed.
|
|
|
|
## Motivation
|
|
|
|
- CMAF is the common denominator for modern streaming and is the right level of abstraction for MoQ object transport.
|
|
- Keeping the transport canonical at "init + fragments" avoids hard coupling the core to HLS/DASH playlist semantics.
|
|
- Determinism experiments should focus on fragment bytes, not playlist formatting.
|
|
|
|
## Scope
|
|
|
|
In scope:
|
|
- Raw CMAF sink for `ec-node moq-subscribe`.
|
|
- Keep the existing HLS writer for local playback workflows.
|
|
|
|
Out of scope:
|
|
- MPEG-DASH support (explicitly not pursued here).
|
|
- Browser-native playback pipeline (still expected to use a view layer like HLS/MSE).
|
|
|
|
## Implementation Notes
|
|
|
|
- `ec-node` already publishes CMAF init on a dedicated MoQ track (`init`) and publishes segments on the main chunks track.
|
|
- `--raw-cmaf` is only valid with `--container cmaf` and errors otherwise.
|
|
- Naming is stable and deterministic for tests and downstream proxies.
|
|
|
|
## Reversibility
|
|
|
|
- This change is additive and gated behind a flag.
|
|
- If we later standardize a manifest-driven playlist format, `--raw-cmaf` can remain as a debug and interoperability mode.
|
|
|