Video, Audio and Document Assets

Images are the easy case. Video goes to a streaming service and needs time to encode before anyone can play it; audio accepts exactly one format; and documents accept everything, because “document” is what a file becomes when Leed does not recognize it as anything else. This page covers the three of them: what each accepts, what happens after you press Submit, and what you can set on the asset afterwards.

All three uploads are free on every plan, and so is playback on your published site. Reading the transcript Leed makes from a video or an audio file needs Starter, and the viewer figures on this page need Growth; both are marked where they appear.

Three upload flows, three destinations

Start any of them from New asset at the top of the Assets panel and pick the type, or drag the file onto any screen in the CMS and let Leed route it. Where the bytes end up differs by type, and that difference is the reason the three flows feel different.

The Upload Video dialog takes a Name and a Description, previews the file locally so you can check you picked the right one, and then uploads it to Cloudflare Stream over a resumable connection with a live percentage. Resumable means the upload survives a wobble in your connection instead of starting over.

Two things happen before the bytes move: Leed reserves a placeholder asset so the upload has somewhere to land, and it fingerprints your file to check you have not uploaded this exact video before. When the transfer finishes the placeholder is finalized with the real video id and the transcription workflow starts.

sequenceDiagram
    participant You
    participant Leed
    participant Stream as Cloudflare Stream
    You->>Leed: Choose a file, add Name and Description
    Leed->>You: Local preview of the chosen file
    Leed->>Leed: Reserve a placeholder asset
    Leed->>Leed: Fingerprint the bytes to check for a duplicate
    Leed->>Stream: Resumable upload, reporting progress as a percentage
    Stream-->>Leed: Upload finalized
    Leed-->>You: Asset page, showing Processing…

All three run the same exact-duplicate check before uploading: a SHA-256 of the file’s bytes, compared against what you already hold. A match opens a dialog headed This file is already uploaded — An identical file already exists in your media library. — with Cancel and Not a duplicate — upload anyway. Unlike images, there is no near-duplicate detection for these types: a re-encoded video or a re-saved PDF is a different file and will not be caught. Images have both checks; uploading images explains the difference.

Video formats

Thirteen distinct formats, matched by MIME type rather than by extension.

ExtensionMIME typeNotes
.mp4video/mp4the safe default for anything you record or export yourself
.mkvvideo/x-matroska
.movvideo/quicktimewhat most Apple devices and Final Cut produce
.avivideo/x-msvideo
.flvvideo/x-flv
.tsvideo/mp2tMPEG transport stream
.psvideo/mp2pMPEG program stream
.mxfapplication/mxfbroadcast interchange
.lxfvideo/vnd.lxfbroadcast interchange
.gxfapplication/gxfbroadcast interchange
.3gpvideo/3gppolder mobile capture
.webmvideo/webm
.mpgvideo/mpeg

Anything else whose type begins with video/ is refused rather than falling through to the document flow — you get Unsupported video type. Supported video formats: … naming the list above. (video/quicktime is registered twice in the accepted list, which is why the message ends with mov repeated. It is accepted once and the duplicate is cosmetic.)

Audio is MP3 only

One format is live today: MP3, MIME type audio/mpeg. That is not a summary of a longer list — it is the list.

ExtensionMIME typeStatus
.mp3audio/mpegaccepted

WAV, OGG, AAC, M4A and WebM audio are present in the product’s source but switched off, so a file in any of them is refused with Unsupported audio type. Supported audio formats: mp3. rather than being quietly turned into a document. Convert to MP3 before uploading.

“Processing…” and what ends it

A freshly uploaded video is not immediately playable. The asset page shows a gray panel reading Processing… where the player will be, with the Name and Description fields already usable beneath it.

stateDiagram-v2
    [*] --> Uploading: bytes move to Cloudflare Stream
    Uploading --> Processing: upload finalizes
    Processing --> Playable: Stream reports the encode done
    Playable --> [*]

While the asset sits in Processing… the player area is a gray panel, but the asset is already real: Name and Description are editable and save normally, and the asset has an id you can reference. Only playback is unavailable.

What ends that state is not Cloudflare finishing the encode — it is Leed noticing. The transcription workflow that starts when the upload finalizes polls Stream, and the moment Stream reports the video ready it flips the asset’s status and captures the playback URL. It polls up to 120 times at 30-second intervals, so it will keep watching for about an hour before giving up.

sequenceDiagram
  autonumber
  participant B as Your browser
  participant L as Leed
  participant S as Cloudflare Stream
  participant W as Transcription workflow

  B->>L: New asset → Video
  L-->>B: Placeholder asset reserved
  B->>L: Request an upload destination
  L->>S: Ask for a resumable upload URL
  S-->>L: Upload URL
  L-->>B: Upload URL
  B->>S: Upload the file (resumable, with progress)
  S-->>B: Transfer complete
  B->>L: Finalise the asset with the video id
  L->>W: Start the transcription workflow
  Note over B,L: The asset now shows "Processing…"
  loop up to 120 times, 30s apart
    W->>S: Is this video ready?
    S-->>W: Not yet
  end
  S-->>W: Ready, here is the playback URL
  W->>L: Mark the asset ready
  Note over B,L: Reload the asset — the player appears

The step ordering is the answer to the question people actually ask: why does it still say Processing when Cloudflare already has my video? Because the flag that governs the player is written by Leed’s workflow on its next poll, not by Stream directly.

My video is still Processing

Work through these in order.

  1. Reload the page. The asset page never updates itself. This is the fix nine times out of ten.
  2. Give it time proportional to the file. A long or high-bitrate video takes Stream real minutes to encode; the poll runs for about an hour before it stops.
  3. If it is still Processing after that, re-upload. A genuinely failed encode does not currently surface as an error — the asset simply stays on Processing rather than telling you something went wrong. Upload the file again (a fresh upload creates a new asset) and delete the stuck one. This gap is listed in known limitations.

Choosing the poster frame

The still shown before someone presses play is the frame at 0 s unless you choose otherwise, and the first frame of a video is very often black.

To pick a better one: play or scrub the player on the asset page to the frame you want, then press Set Thumbnail from Current Position. Leed records the timestamp on the asset and tells Stream about it, so that frame becomes the poster everywhere at once — in the CMS asset grid, on the asset page itself, and in the embedded player on your published site. There is nothing to re-publish and no second place to set it.

Playback options

Both video and audio carry a collapsible Player Settings panel on the asset page. Every checkbox saves the moment you tick it.

OptionApplies toDefaultEffect on the published embed
Show Controlsvideoonoff hides the play bar entirely — the viewer cannot start, pause or seek
Autoplayvideo, audiooffthe player attempts to start on its own when the page loads
Mutedvideooffstarts silent; the viewer can unmute from the controls
Loopvideo, audiooffrestarts at the end instead of stopping
Allow fullscreenvideoonthe embed always permits fullscreen; there is no control for this in the CMS
Thumbnail timestampvideounset — the frame at 0sset by Set Thumbnail from Current Position, not by a checkbox

Only values that differ from the defaults are written into the embed URL, so a video left on its defaults produces a clean embed with no query string at all. The audio player’s controls are always on in the snippet Leed generates and have no checkbox of their own.

A ready video asset with the Stream player and its poster frame, the Set Thumbnail from Current Position button, the expanded Player Settings panel, and the Analytics section showing its chart

Documents

A PDF gets an inline preview on its asset page — the real document in a scrollable frame, so you can confirm you uploaded the right revision without downloading it. Every other extension shows a generated file-type icon instead.

Extension groupPreview in the CMSText extraction attemptedServed as
PDFinline document previewyesa download from a /f/… URL
DOC, DOCXfile-type iconyesa download from a /f/… URL
everything elsefile-type iconnoa download from a /f/… URL
A PDF document asset showing the inline preview frame, the Name and Description fields, the collapsed Extracted Content section and the Copy HTML Snippet button

The Filename shown under File Details is what a visitor’s browser will name the file when they download it. It is display-only here — the link a visitor follows is keyed on the asset id, not on the filename, so nothing breaks if the underlying file was named something unhelpful. Asset delivery and protection explains the /f/… URL and what it does and does not protect.

The Description field on a document, a video or an audio asset is internal metadata. It helps you and your colleagues recognize the asset in a year’s time; it is not published copy, it does not appear beside the file on your site, and it is not the alt text (only images have one of those). Text pulled out of a document, on the other hand, is real content — it powers search and AI answers about your site — and that is covered in transcription and text extraction, along with the Starter gate on reading it back.

A document attached to a form’s response email is an ordinary document asset — nothing special is uploaded for it. See response emails and gated downloads.

Per-asset engagement

Video and audio asset pages carry an Analytics section in the body, between the marketing-approval checkbox and the labels. It has a date-range picker and reports, for that one asset over that range, how many unique viewers it had, the total time viewed and the average time per viewer.

Documents have no analytics section at all — not an empty one, not an upgrade panel. Downloads are recorded, but there is no per-document chart on the asset page.

Deleting and replacing

Deleting works the same for these types as for every asset: the Delete button is disabled while the asset is referenced by a page, a form, an email template or a profile, and deleting needs the Content Publisher role. Asset details and usage owns that rule, along with labels, marketing approval and the Copy HTML Snippet button that gives you the embed for each type.

There is no replace-file action. Uploading a corrected cut of a video or a revised PDF creates a new asset with a new id; the old one keeps its own id and every reference to it. So the sequence for a correction is: upload the new file, swap it in wherever the old one was used, then delete the old one — and the Used in list on the old asset is the checklist for that middle step.

Once the video is ready, place it on a page with the editor’s Asset button, which inserts the player rather than a link — see inserting media and embeds. In Leed Markdown a Cloudflare video, an audio file and an iframe each take their own parameters, which embeds and icons sets out.

ESC