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.
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.
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.
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 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.
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.
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.
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).
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.
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.
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.