September 25, 2026

What video formats WordPress supports, and what actually plays everywhere

Sravani Maramreddy
Sravani Maramreddy
Senior software engineer

WordPress takes a video the same way it takes an image. You drag the file into the media library, it uploads, and you drop it into a post. Core keeps a wide upload allow-list, so almost anything off a camera, a phone or a screen recorder gets accepted. The step rarely feels like a decision at all.

The trouble arrives one step later. A MOV from a phone or an MKV from a screen recorder uploads without a single warning. The published post then shows a plain blue link where the player should be. Core builds a player for five extensions only, because wp_get_video_extensions() returns mp4, m4v, webm, ogv and flv. The browser keeps its own list, and it cares about the codecs inside the file rather than the letters at the end of the filename.

So there are three lists, not one, and none of them consults the others. What follows sets out all three, marks where they disagree, and covers what to do with the files that fall into the gaps.

TL;DR

WordPress core accepts around fifteen video containers as uploads, MOV, MKV, AVI and WMV included. It renders a player for five: MP4, M4V, WebM, OGV and FLV. Browsers cut the list again, and FLV plays in none of them. The one combination that plays everywhere with no caveat is MP4 carrying H.264 video and AAC audio. Everything else is either a conversion job or a bare link sitting in your post.

Which video formats does WordPress accept, and which ones actually play?

Read the table across, not down. The value of each row is the disagreement between the three columns, and the disagreement is what sends people to the support forums.

FormatUploads to the media libraryCore [video] renders a playerPlays from a browser <video> element
MP4 (H.264 + AAC)YesYesEverywhere, no caveat
M4VYesYesYes, when H.264 and AAC sit inside
WebM (VP8 or VP9)YesYesChrome, Firefox and Edge. Safari later and less predictably
OGV (Theora)YesYesLegacy. Firefox and Chrome only
FLVYesYesNo current browser plays it
MOVYesNo, bare linkSometimes, when it holds H.264 and AAC
MKVYesNo, bare linkNo
AVIYesNo, bare linkNo
WMV and ASFYesNo, bare linkNo
MPEG and MPGYesNo, bare linkNo
3GP and 3G2YesNo, bare linkMobile only, and unevenly

Two different parts of core produce the first two columns. The upload side reads wp_get_mime_types(), a long allow-list that exists so WordPress can store any file type a site might need. The player side reads wp_get_video_extensions(), a list of five. Nothing reconciles them, so an accepted upload carries no promise of playback.

Which video formats does WordPress accept, render and actually play?

One branch inside wp_video_shortcode() produces this. The function runs the source URL through wp_check_filetype(), compares the extension against the supported list, and returns early when it finds no match:

php
return sprintf(
    '<a class="wp-embedded-video" href="%s">%s</a>',
    esc_url( $atts['src'] ),
    esc_html( $atts['src'] )
);

There is no error, no admin notice and no comment in the markup. A visitor sees a link with the class wp-embedded-video, clicks it, and either downloads a file or watches their browser refuse it. The full set of branches, defaults and filters behind that function is in the WordPress video shortcode reference.

What a WordPress MKV upload looks like before and after it renders in a post

The branch disappears when the embed stops pointing at a file extension. The FastPix WordPress plugin takes MOV, MKV, AVI and the rest in its Add media drop zone. What it embeds is a playback ID rather than a filename, so the renderer never makes this decision.

The extension tells you almost nothing about what a browser can decode

An extension names the container. The container is a wrapper, and the browser has to decode what is inside it. The guide to codecs, formats and containers and the guide to container file formats already set out both parts. What follows is only the piece that changes a WordPress decision.

What is the difference between a video container and a video codec?

Two MP4 files can behave completely differently. One holding H.264 and AAC plays for every visitor. One holding HEVC plays in Safari on hardware that supports it and stalls elsewhere. WordPress renders a player for both, because it never looks past the four letters after the dot. AV1 sits in the middle: Chrome, Firefox and Edge decode it, and Safari does on capable hardware. The compression case for each is in AV1 vs H.264 vs H.265.

MKV is the clearest example of a good container in the wrong place. It handles multiple tracks and odd codecs well, which is why recorders write it, and no browser will play it from a video element. MKV vs MP4 covers the trade in detail.

The four ceilings that stop an upload before format matters

Format is the second failure. The first is size, and four separate limits apply at the same moment.

LimitWhere it livesWhat it stops
upload_max_filesizePHP configurationA single file larger than the value
post_max_sizePHP configurationThe whole request, so it must exceed the file size
memory_limitPHP configurationProcessing after the bytes arrive
Host hard capYour hosting planEverything above, and you cannot raise it from WordPress

WordPress reports the effective limit on the Media screen and again in Site Health, so you never have to guess which of the four is binding. The host cap is the one that ends the conversation, because no php.ini edit moves it.

Uploading through the browser instead of through PHP removes three of the four. The FastPix plugin sends files straight from the browser in resumable 5 MB chunks. A large source never passes through upload_max_filesize or memory_limit, and a closed tab leaves a Resume upload action rather than a failed request. The mechanics of that approach are covered in uploading large video files with chunking, and the storage side in offloading WordPress media.

One converted MP4 is better, and still not enough

Converting the MOV to MP4 with H.264 and AAC fixes the blue link. It does not fix delivery. A single file plays at a single bitrate, so a visitor on hotel wifi downloads exactly the same bytes as a visitor on fibre, and buffers for the difference.

What is the difference between converting a video once and encoding a rendition ladder?

What plays everywhere at every connection speed is a set of renditions behind a manifest, not a file. The difference between the two is set out in ABR vs MBR, and the encode step itself in video encoding vs transcoding.

To build that ladder by hand you need an FFmpeg pipeline, somewhere to run it, and somewhere to keep the output. A platform returns the ladder as a playback ID that you embed with a shortcode. You pick the quality tier per batch at upload time.

Upload the MOV you already have and let the conversion happen off your server

The practical answer to the format question is to stop answering it per file. The FastPix plugin's Add media drop zone takes a much longer list than core renders, and duration is the only hard boundary.

What the drop zone takesThe list
VideoMP4, MOV, AVI, MKV, WMV, FLV, F4V, M4V, MPEG, WebM, OGV, 3GP, ASF, DivX, DV, TS, MTS, M2TS, MXF, VOB
AudioMP3, WAV, AAC, M4A, OGG
Hard limitEight hours per item

Everything on that list comes back as web-playable renditions, so the container you recorded in stops being a publishing decision. Start with the plugin setup guide for the three-step wizard, and test it on a real file first. The free plan covers 10 videos and 100K streaming minutes a month, no card required.

Frequently Asked Questions (FAQs)

What video formats does WordPress support?

Two different lists answer that question. WordPress core accepts around fifteen video containers as media library uploads, including MP4, M4V, MOV, MKV, AVI, WMV, ASF, FLV, MPEG, WebM, OGV, 3GP and 3G2. The core [video] shortcode builds a player for only five of them. That list comes from wp_get_video_extensions(): mp4, m4v, webm, ogv and flv. Every other upload renders as a bare link.

Can you upload a MOV file to WordPress?

Yes. MOV is on the core upload allow-list, so the media library accepts it with no warning. It will not render a player, because MOV is absent from wp_get_video_extensions(). The post shows an anchor tag with the class wp-embedded-video instead. Converting the file to MP4 with H.264 video and AAC audio resolves it, and the codec and container guide explains why those two names matter more than the extension.

Why does my MKV video not play in WordPress?

Two reasons stack up. WordPress core does not render a player for MKV, so the shortcode returns a link. Browsers also do not decode MKV from a <video> element, so even a direct link gives most visitors a download rather than playback. MKV is a capable archive container and a poor delivery container, a trade covered in MKV vs MP4.

Does WordPress support WebM?

Yes. WebM uploads to the media library and the core video shortcode renders a player for it. Browser support is broad but not universal. Chrome, Firefox and Edge decode VP8 and VP9 in WebM reliably, while Safari added support later and behaves less predictably on older devices. WebM works best as a second source alongside an MP4 rather than as the only file.

What is the best video format for WordPress?

MP4 carrying H.264 video and AAC audio. It uploads, the core shortcode renders a player for it, and every current browser decodes it without a caveat. Newer codecs such as VP9 and AV1 compress better and need a fallback, which the core shortcode has no logic for. For one self-hosted file, H.264 in MP4 is the safe answer.

Does WordPress support AV1 or HEVC video?

WordPress never checks codecs, only file extensions, so an MP4 holding AV1 or HEVC uploads and renders a player. The browser then decides. AV1 decodes in Chrome, Firefox and Edge, and in Safari on hardware that supports it. HEVC plays in Safari on capable hardware and is not a safe default elsewhere. AV1 vs H.264 vs H.265 compares the three.

What is the maximum video file size WordPress allows?

There is no single WordPress number. Four limits apply at once: upload_max_filesize and post_max_size in PHP, memory_limit, and the host's own hard cap. That last one cannot be raised from inside WordPress. The Media screen and Site Health both display the effective limit your server enforces. Chunked uploads avoid three of the four.

Share

Stay Ahead of Video
Streaming Trends

Start shipping video today.