# YouTube

> Render a 16:9 film for a YouTube upload, with the YouTube limits and the vawe commands.

Canonical: https://vawe.dev/docs/youtube

At the end of this page you have a 1920 × 1080 mp4 that follows the YouTube encoding page for codec, container and audio. For a vertical film under 3 minutes, read [YouTube Shorts](https://vawe.dev/docs/youtube-shorts).

## The limits

The full table with sources is in [Video specs by platform](https://vawe.dev/docs/platforms). The rows that matter here, read from the YouTube Help pages on 2026-10-31 and 2026-11-01:

* 16:9 is the standard aspect on a computer. A square or vertical upload of 3 minutes or less is a Short.
* A file is 256 GB or 12 hours, whichever is less. An unverified account uploads 15 minutes at most by default.
* YouTube asks for H.264, an MP4 container with the moov atom at the front, AAC-LC audio at 48 kHz, and BT.709 colour for SDR.
* At 1080p, YouTube lists 8 Mbps for 24 to 30 fps and 12 Mbps for 48 to 60 fps.
* YouTube does not state a loudness target on these pages.

## Make the film

<Steps>
  <Step>
    ### Start a 16:9 page

    ```bash
    bin/vawe new my-video --request "a 45 second product intro" --aspect 16:9 --length 45
    ```

    The verb writes `films/my-video/page.html` with `<meta name="aspect" content="16:9">` and `<meta name="duration" content="45">`. Change the duration in the page if the film grows.
  </Step>

  <Step>
    ### Check the draft

    ```bash
    bin/vawe dev films/my-video/page.html
    ```

    See [Draft](https://vawe.dev/docs/draft).
  </Step>

  <Step>
    ### Measure the sound

    ```bash
    bin/vawe sound films/my-video/page.html --waveform
    ```

    The verb prints the LUFS and the true peak of the mix. Without a `<meta name="loudness">`, the level is what the cues add up to. See [Loudness and the mix](https://vawe.dev/docs/loudness-and-the-mix).
  </Step>

  <Step>
    ### Ship the final

    ```bash
    bin/vawe ship films/my-video/page.html --aspect 16:9
    bin/vawe ship --status --wait
    ```

    `ship` needs a fresh critique and the owner approval first. See [Ship](https://vawe.dev/docs/ship). The master is `out/my-video.mp4`.
  </Step>
</Steps>

## What the final contains

The final is 60 fps, H.264 High profile, `yuv420p`, with `+faststart` (the moov atom at the front). The audio is AAC at 48 kHz. These match the YouTube page for codec, container, sample rate and fast start. Upload `out/my-video.mp4`. Do not upload the `.web.mp4` copy beside it.

YouTube asks to upload at the recording frame rate. A vawe final is always 60 fps, because `ship` has no fps flag. The 60 fps row is on the YouTube list (48 to 60 fps).

## Limits

* Colour: the encode arguments in `harness/media/render-page.mjs` set no colour tag, and no code in `harness/media/` names BT.709. The YouTube page recommends BT.709 for SDR. Check the colour of a final with your own tools before a colour-critical upload.
* B-frames and GOP: the YouTube page lists 2 B-frames and a closed GOP. vawe passes only `-profile:v high -preset fast -crf 16 -x264-params aq-mode=3`, so these settings are the x264 defaults.
* Bitrate: `-crf 16` is a quality target, so `ship` sets no bitrate.

  <Card title="Video specs by platform" href="/docs/platforms">
    All six platforms, with sources.
  </Card>

  <Card title="Loudness and the mix" href="/docs/loudness-and-the-mix">
    Set and measure the level.
  </Card>

  <Card title="Aspect ratios" href="/docs/aspect-ratios">
    One page, many aspects.
  </Card>

{/* sources (vawe 4d9a5acb4):
  YouTube limits: https://support.google.com/youtube/answer/1722171 and /71673, read 2026-10-31
  new --aspect --length, meta written: bin/vawe new --help
  sound --waveform prints LUFS and true peak: bin/vawe sound --help
  ship needs critique and approval: bin/vawe ship --help
  encode args: harness/media/render-page.mjs:580 (libx264 high yuv420p fast crf 16 faststart); AAC 192k 48 kHz harness/media/page-audio.mjs
  no colour tag: grep for bt709, colorspace, -color in render-page.mjs found nothing (2026-10-31)
  60 fps, no fps flag: bin/vawe ship --help
  */}
