Check which codec a video uses

Drop an MP4, MOV or WebM file. See its video and audio codecs, the exact codec string, a browser support estimate, and how to fix a file that will not play.

How it works

  1. Drop an MP4, M4V, MOV or WebM file
  2. Read the codecs, the codec string and the support estimate from your browser
  3. Open the browser table and copy the fix if the file will not play

What the checker reads

To find out which codec a video uses, drop the MP4, MOV, M4V or WebM file on this page: it reads the file's header boxes and shows the video and audio codec of every track, with the exact codec string a browser needs, such as avc1.640028. The video is never decoded and never loaded whole. The tool walks the top-level boxes by their size headers, skips the media data (mdat) without reading it, and reads the movie box (moov), which holds one track box per video, audio or text stream. From it come the container brand (ftyp), the duration, each track's codec entry, its pixel size, its frame rate and its rotation. The frame rate is the number of samples divided by the track time in the stts table: 360 samples of 1001 ticks at 30000 ticks per second is 29.97 fps. WebM and Matroska files are read by element: the SeekHead, or the top-level element headers, point to Info and Tracks, a Void of any length is skipped by its size and Cluster data is never read. AVI, MPEG-TS and other containers are not read, and a file with no movie box is reported as incomplete.

How the codec string is built

The string follows RFC 6381, as MDN describes it. For H.264 it is avc1. followed by three bytes in hexadecimal: profile, constraint flags and level. A profile byte of 100, no flags and level 40 gives 64 00 28, so avc1.640028, which is High profile at level 4.0. For HEVC the string is hvc1 or hev1, then the profile, the compatibility flags written in reverse bit order, L or H for the tier with the level, and the constraint bytes: Main profile at level 4.0 reads hvc1.1.6.L120.90, because level 120 divided by 30 is 4.0. A 10-bit HEVC clip often reads hvc1.2.4.L153.B0, which is Main 10 at level 5.1. AV1 is av01.profile.levelTier.bitDepth, for example av01.0.08M.08, and VP9 is vp09.profile.level.bitDepth. AAC is mp4a.40.2 for AAC-LC. The tag matters: hvc1 keeps the parameter sets in the sample entry, while hev1 allows them inside the video samples, and some players accept only hvc1.

Fast start and why a video waits before it plays

An MP4 holds its index in the moov box. When moov comes after the media data, a browser has to reach the end of the file before it can start, which is why some downloads show a spinner first. This page reports Fast start as Yes when moov sits before mdat and No when it sits after. The FFmpeg documentation says the +faststart movflag runs a second pass that moves the index (moov atom) to the beginning of the file, and the fix is a copy, not a re-encode: ffmpeg -i input.mp4 -c copy -movflags +faststart output.mp4. A fragmented MP4 has no single index, so Fast start is shown as Fragmented. The check only needs the order of the top-level boxes, so it works the same on a 50 MB clip and a 5 GB recording.

The support estimate and the table

The page builds the MIME type of the whole file and of each track, for example video/mp4; codecs="avc1.640028, mp4a.40.2", and asks your browser two questions: canPlayType on a video element, which answers probably, maybe or an empty string, and MediaSource.isTypeSupported, which answers true or false. The page never plays the file, so these are two separate support estimates, shown side by side. A MOV is tested as video/quicktime and a 3GP as video/3gpp. They are answers about this browser on this device, so an HEVC file can pass on a Mac and fail on a Linux laptop. The table for Chrome, Edge, Firefox, Safari on macOS, Safari on iOS and Chrome on Android was compiled from caniuse data and MDN's codec guides on 15 October 2026, and the sources are listed under the table. The table rates codecs, not containers, so a Matroska file or a MOV gets no whole-file line. Some entries are partly supported. HEVC in Chrome, for example, depends on a hardware decoder on Windows. For Dolby Digital, ProRes and PCM the page has no table row and says so. This tool does not decode frames, so a file with correct headers and damaged data can still fail to play.

Frequently asked questions

How do I check which codec a video file uses?

Drop the file on this page. The Tracks table lists each stream, such as H.264 (AVC) with avc1.640028 for video and AAC with mp4a.40.2 for sound, plus the profile, level, pixel size and frame rate. It works on MP4, M4V, MOV and WebM files and reads only the headers, so a 4 GB file does not have to be loaded.

What does the codec string avc1.640028 mean?

It is the H.264 stream's profile, flags and level in hexadecimal: 64 is profile 100 (High), 00 means no constraint flags and 28 is level 40, which is 4.0. Browsers use the string in canPlayType and isTypeSupported.

Why does my MP4 play in Safari but not in Firefox or Chrome?

The codec is probably HEVC (H.265), which Safari plays on macOS 10.13 and later while Chrome (from 107) and Firefox (from 134) depend on the decoder in the device. Check the table for your file's codec, then re-encode to H.264 High with AAC, the most widely supported pair (Firefox relies on the system AAC decoder).

What is fast start and how do I add it to an MP4?

Fast start means the moov index is at the start of the file, so playback can begin while the rest downloads. If this page says No, run ffmpeg -i input.mp4 -c copy -movflags +faststart output.mp4. It copies the streams without re-encoding, so the picture is unchanged.

How do I convert HEVC to H.264 so it plays in more browsers?

Run ffmpeg -i input.mp4 -c:v libx264 -profile:v high -pix_fmt yuv420p -crf 20 -c:a aac -b:a 192k -movflags +faststart output.mp4. That gives 8-bit 4:2:0 H.264 High with AAC, and a lower crf value such as 18 keeps more detail at a larger file size. HDR sources should be tone-mapped first, or the colours can look flat.

Is my video uploaded?

No. The file is read in your browser and not uploaded. Only the header boxes are read, in slices of a few kilobytes up to the size of the movie box (or the WebM Tracks element), and the video is never decoded or stored. The page counts visits with Google Analytics, using rough size groups such as 1 to 10 MB, never a file name or contents.