<?xml version="1.0" encoding="UTF-8"?><rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom" version="2.0"><channel><title><![CDATA[mp4.now]]></title><description><![CDATA[mp4.now]]></description><link>https://mp4now.hashnode.dev</link><generator>RSS for Node</generator><lastBuildDate>Fri, 13 Nov 2026 18:34:22 GMT</lastBuildDate><atom:link href="https://mp4now.hashnode.dev/rss.xml" rel="self" type="application/rss+xml"/><language><![CDATA[en]]></language><ttl>60</ttl><item><title><![CDATA[Why won't this MP4 play? Containers, codecs, and how to fix the usual failures]]></title><description><![CDATA["It's an MP4, so it should play everywhere" is one of the most common assumptions in video, and one of the most frequently wrong. An MP4 that plays…]]></description><link>https://mp4now.hashnode.dev/why-won-t-this-mp4-play-containers-codecs-and-how-to-fix-the-usual-failures</link><guid isPermaLink="true">https://mp4now.hashnode.dev/why-won-t-this-mp4-play-containers-codecs-and-how-to-fix-the-usual-failures</guid><category><![CDATA[video]]></category><category><![CDATA[FFmpeg]]></category><category><![CDATA[webdev]]></category><category><![CDATA[codecs]]></category><dc:creator><![CDATA[mp4.now]]></dc:creator><pubDate>Tue, 10 Nov 2026 17:48:59 GMT</pubDate><content:encoded><![CDATA[<p>"It's an MP4, so it should play everywhere" is one of the most common assumptions in video, and one of the most frequently wrong. An MP4 that plays perfectly on one phone can show a black screen in a browser, play audio with no picture on a TV, or refuse to open at all on an older laptop.</p>
<p>I make mp4.now, an online MP4 converter and toolkit built on FFmpeg, and nearly every "broken MP4" we see falls into one of a few categories. This post explains what is actually inside an MP4 file, and what to do in each case.</p>
<h2>An MP4 is a box, not a format of video</h2>
<p>MP4 (MPEG-4 Part 14) is a <strong>container</strong>. It holds one or more streams plus metadata that says how to play them. The streams themselves are encoded with <strong>codecs</strong>:</p>
<ul>
<li><strong>Video codecs</strong> commonly found in MP4: H.264 (AVC), H.265 (HEVC), AV1, and sometimes VP9.</li>
<li><strong>Audio codecs</strong>: AAC most often, but also MP3, Opus, AC-3 and others.</li>
<li><strong>Other tracks</strong>: subtitles, chapters, and metadata such as rotation and creation date.</li>
</ul>
<p>When a player says it "supports MP4", it means it can read the container. Whether it can play the file depends on whether it can decode the specific codecs inside. That is the root of most compatibility problems.</p>
<h2>Step one: find out what is inside</h2>
<p>Before changing anything, inspect the file. With FFmpeg installed:</p>
<pre><code class="language-bash">ffprobe -hide_banner input.mp4
</code></pre>
<p>Look for the <code>Stream</code> lines. You will see something like <code>Video: hevc (Main 10)</code> or <code>Video: h264 (High)</code>, the resolution and frame rate, and <code>Audio: aac</code> or similar. mp4.now's MP4 Metadata &amp; Media Info tool shows the same information in a browser if you do not have FFmpeg handy.</p>
<p>Now match the symptom.</p>
<h2>Failure 1: No video, or a black screen, but audio plays</h2>
<p><strong>Likely cause:</strong> the player cannot decode the video codec. HEVC is the usual suspect. Many recent phones record HEVC by default to save space, and support for it varies across browsers, operating systems and older hardware. On Windows, HEVC playback may need an extra codec extension.</p>
<p><strong>Fix:</strong> re-encode the video to H.264, which is the most widely supported option. Keep the audio as is if it is AAC.</p>
<pre><code class="language-bash">ffmpeg -i input.mp4 -c:v libx264 -crf 20 -preset medium -c:a copy output.mp4
</code></pre>
<p>Lower CRF values mean higher quality and larger files. Around 18 to 23 is a sensible range for most uses.</p>
<h2>Failure 2: Video plays, but no sound</h2>
<p><strong>Likely cause:</strong> an audio codec the player does not support, such as AC-3 or Opus in an MP4 on a device that expects AAC.</p>
<p><strong>Fix:</strong> keep the video stream and re-encode only the audio:</p>
<pre><code class="language-bash">ffmpeg -i input.mp4 -c:v copy -c:a aac -b:a 192k output.mp4
</code></pre>
<p>Because the video is copied rather than re-encoded, this is fast and loses no picture quality.</p>
<h2>Failure 3: It plays in a desktop player, but not in the browser</h2>
<p><strong>Likely causes:</strong> an unsupported codec (see above), or an unusual pixel format. Browsers are pickier than desktop players like VLC. 10-bit H.264, or 4:2:2 chroma from some cameras, may not play in browsers.</p>
<p><strong>Fix:</strong> for maximum browser compatibility, use H.264 with the common <code>yuv420p</code> pixel format and AAC audio:</p>
<pre><code class="language-bash">ffmpeg -i input.mp4 -c:v libx264 -pix_fmt yuv420p -c:a aac output.mp4
</code></pre>
<h2>Failure 4: It only starts after downloading completely</h2>
<p><strong>Likely cause:</strong> the <code>moov</code> atom, the index that tells a player where everything is, sits at the end of the file. Players streaming over HTTP have to fetch the whole file before they can start.</p>
<p><strong>Fix:</strong> move the index to the start. This is a <strong>remux</strong>, so no re-encoding is needed:</p>
<pre><code class="language-bash">ffmpeg -i input.mp4 -c copy -movflags +faststart output.mp4
</code></pre>
<p>If you host video on your own site, do this for every MP4 you publish.</p>
<h2>Failure 5: The file will not open at all</h2>
<p><strong>Likely causes:</strong> the recording was interrupted, for example the camera battery died or an app crashed. That can leave the file without a valid index. Or the file was truncated during a download or copy.</p>
<p><strong>Fix:</strong> first try a remux, which rebuilds the container around the existing streams:</p>
<pre><code class="language-bash">ffmpeg -i input.mp4 -c copy remuxed.mp4
</code></pre>
<p>mp4.now has a Repair / Remux tool for this case. Be realistic, though: if the index was never written, a simple remux may not be enough, and recovery may need specialist tools or a reference file from the same camera. Always keep the original.</p>
<h2>Failure 6: It plays sideways or upside down</h2>
<p><strong>Likely cause:</strong> phones often record in one orientation and store a rotation flag in the metadata. Some players honour it; others ignore it.</p>
<p><strong>Fix:</strong> apply the rotation permanently. On mp4.now, the Rotate or Flip tool does this. With FFmpeg, re-encoding the video normally applies the rotation flag to the pixels automatically in recent versions.</p>
<h2>Remux or re-encode?</h2>
<p>This is the single most useful distinction in video:</p>
<ul>
<li><strong>Remux</strong> (<code>-c copy</code>): changes the container or its structure without touching the streams. Fast, lossless, but cannot fix codec problems.</li>
<li><strong>Re-encode</strong>: decodes and encodes the stream again. Fixes codec and compatibility problems, but takes longer and loses some quality each time.</li>
</ul>
<p>Always try the cheapest fix first. If only the container is wrong, remux. If the codec is wrong, re-encode only the stream that needs it.</p>
<h2>When MP4 is not the right answer</h2>
<p>Sometimes the fix is a different container. WebM is designed for browser delivery and pairs well with VP9 or AV1. MOV is still common in Apple editing workflows. And for short silent loops, a GIF, despite its limited colour palette, may be what a platform expects.</p>
<p>mp4.now converts MP4 to WebM, MOV, AVI, GIF, MP3, WAV and JPG frames, and turns MOV, AVI, WebM and MKV into MP4, alongside compression, trimming, merging, cropping, rotation, speed, muting and subtitle tools.</p>
<h2>Quick reference</h2>
<table>
<thead>
<tr>
<th>Symptom</th>
<th>Most likely cause</th>
<th>First fix</th>
</tr>
</thead>
<tbody><tr>
<td>Black screen, audio plays</td>
<td>Unsupported video codec (often HEVC)</td>
<td>Re-encode video to H.264</td>
</tr>
<tr>
<td>Picture, no sound</td>
<td>Unsupported audio codec</td>
<td>Re-encode audio to AAC</td>
</tr>
<tr>
<td>Fails in browser only</td>
<td>Codec or pixel format</td>
<td>H.264 + yuv420p + AAC</td>
</tr>
<tr>
<td>Slow to start streaming</td>
<td>Index at end of file</td>
<td>Remux with faststart</td>
</tr>
<tr>
<td>Will not open</td>
<td>Missing or damaged index</td>
<td>Remux, then repair tools</td>
</tr>
<tr>
<td>Wrong orientation</td>
<td>Rotation flag ignored</td>
<td>Apply rotation</td>
</tr>
</tbody></table>
<p>If you would rather not install FFmpeg, you can inspect, remux, and convert files in your browser on <a href="https://mp4.now">mp4.now</a>. Either way, check the codecs first. It saves a lot of guessing.</p>
]]></content:encoded></item></channel></rss>