feat: add MOV (ProRes 4444) as transparent video output format (#224)

## Summary

- Adds `--format mov` to the render CLI for ProRes 4444 transparent video output
- ProRes 4444 with alpha is the industry standard for transparent video overlays, supported by CapCut, Final Cut, Premiere, DaVinci, and After Effects
- WebM VP9 alpha technically works but is ignored by all major video editors — only browsers decode it
- Adds MOV to the studio export dropdown alongside MP4 and WebM

## Transparency format comparison

| Format | Codec | Alpha | Video editors | Browsers | File size |
| --- | --- | --- | --- | --- | --- |
| **MOV** | ProRes 4444 | Yes | CapCut, Final Cut, Premiere, DaVinci, After Effects | No (won't play in browser) | Large (~5-40 MB) |
| **WebM** | VP9 | Yes | None (shows black) | Chrome, Firefox | Small (~200 KB) |
| **MP4** | H.264 | No | All | All | Small |

> **Note:** ProRes MOV files do not play in Chromium browsers — they are an intermediate/editing format, not a delivery format. Use [rotato.app/tools/transparent-video](https://rotato.app/tools/transparent-video) to verify transparency works correctly.

## Changes

- **CLI**: Add `mov` to `--format` validation, examples, and output path logic
- **Engine**: `getEncoderPreset()` returns ProRes 4444 (`yuva444p10le`) for `mov` format; handle `.mov` in `applyFaststart` and `muxVideoWithAudio`; add `pix_fmt` to streaming encoder ProRes path
- **Producer**: Treat `mov` like `webm` for alpha capture (PNG frames, screenshot mode, `forceScreenshot`)
- **Studio**: Add MOV option to export format dropdown and render queue hook
- **Core**: Add `mov` to studio API types, render route, and mime helpers
- **Tests**: Add encoder preset tests for mov format (42 total, all passing)

## Usage

```bash
hyperframes render --format mov --output overlay.mov
```

## Test plan

- [x] `pnpm build` passes
- [x] `pnpm --filter @hyperframes/engine test` — 42 tests pass (2 new for MOV)
- [x] `oxlint` and `oxfmt` clean on all 12 changed files
- [x] End-to-end local render produces ProRes 4444 (`yuva444p12le`) with working alpha
- [x] Docker render with `--format mov` — ProRes 4444 confirmed via ffprobe
- [x] Studio dropdown shows MOV option in built JS
- [x] Transparency verified with [rotato.app/tools/transparent-video](https://rotato.app/tools/transparent-video)
This commit is contained in:
Miguel Ángel
2026-04-08 03:11:37 +02:00
committed by GitHub
parent 85a76c0043
commit 43e9252065
15 changed files with 180 additions and 57 deletions
+4 -5
View File
@@ -66,7 +66,7 @@ interface RenderInput {
outputPath?: string | null;
fps: 24 | 30 | 60;
quality: "draft" | "standard" | "high";
format?: "mp4" | "webm";
format?: "mp4" | "webm" | "mov";
workers?: number;
useGpu: boolean;
debug: boolean;
@@ -98,10 +98,9 @@ function parseRenderOptions(body: Record<string, unknown>): Omit<RenderInput, "p
? body.entryFile.trim()
: undefined;
const format = (["mp4", "webm"].includes(body.format as string) ? body.format : undefined) as
| "mp4"
| "webm"
| undefined;
const format = (
["mp4", "webm", "mov"].includes(body.format as string) ? body.format : undefined
) as "mp4" | "webm" | "mov" | undefined;
return { outputPath, fps, quality, workers, useGpu, debug, entryFile, format };
}