<?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[4Dev.Net]]></title><description><![CDATA[4Dev.Net]]></description><link>https://4dev.hashnode.dev</link><generator>RSS for Node</generator><lastBuildDate>Thu, 29 Oct 2026 04:35:28 GMT</lastBuildDate><atom:link href="https://4dev.hashnode.dev/rss.xml" rel="self" type="application/rss+xml"/><language><![CDATA[en]]></language><ttl>60</ttl><item><title><![CDATA[Why your iPhone video won't play on your PC (and how a browser tab fixes it in seconds)]]></title><description><![CDATA[iPhones record HEVC video that many PCs, TVs and editors can't play. How to check your file, the 10-second fix, and converting it in the browser.]]></description><link>https://4dev.hashnode.dev/why-your-iphone-video-won-t-play-on-your-pc-and-how-a-browser-tab-fixes-it-in-seconds</link><guid isPermaLink="true">https://4dev.hashnode.dev/why-your-iphone-video-won-t-play-on-your-pc-and-how-a-browser-tab-fixes-it-in-seconds</guid><category><![CDATA[webdev]]></category><category><![CDATA[JavaScript]]></category><category><![CDATA[WebAssembly]]></category><category><![CDATA[Tutorial]]></category><dc:creator><![CDATA[4dev.net]]></dc:creator><pubDate>Fri, 23 Oct 2026 09:38:29 GMT</pubDate><enclosure url="https://cdn.hashnode.com/uploads/covers/6adb222bd765c2aedad44b22/8f3dacfa-6067-4cd7-88b3-1cb465371b3d.jpg" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>You AirDrop a clip from your iPhone to your laptop, double-click it, and get an error. Or sound with no picture. Or a player asking you to buy a codec. You email it to a colleague, and they can't open it either.</p>
<p>The file isn't broken. It's speaking a language half the world's devices don't understand, and the fix takes about ten seconds without uploading the video anywhere.</p>
<blockquote>
<p><strong>TL;DR</strong></p>
<ul>
<li>iPhones record <strong>HEVC (H.265)</strong> video inside <code>.mov</code> files. Many PCs, Android phones, TVs and editors can't decode HEVC.</li>
<li>Renaming <code>.mov</code> to <code>.mp4</code> does nothing. The video inside is still HEVC.</li>
<li>Fix: convert to <strong>MP4 with H.264</strong>. You can do it <a href="https://4dev.net/mov-to-mp4?utm_source=hashnode&amp;utm_medium=referral&amp;utm_campaign=iphone-mov">right in your browser</a> (nothing is uploaded), or flip one iPhone setting so it never happens again.</li>
</ul>
</blockquote>
<h2>First, check what's actually inside your file</h2>
<p>A video file has two layers. The <strong>container</strong> (<code>.mov</code>, <code>.mp4</code>, <code>.mkv</code>) is the box. The <strong>codecs</strong> inside decide how the picture and sound are compressed. The extension only tells you about the box.</p>
<p>If you have FFmpeg installed, one line shows the video codec:</p>
<pre><code class="language-bash">ffprobe -v error -select_streams v:0 -show_entries stream=codec_name -of csv=p=0 IMG_0412.MOV
# hevc
</code></pre>
<p>On a Mac, <strong>Get Info</strong> shows it under <em>More Info → Codecs</em>. If it says <code>hevc</code> or <code>H.265</code>, you've found the culprit.</p>
<h2>Why HEVC breaks on so many devices</h2>
<p>Since iOS 11 (2017, iPhone 7 and later), iPhones record <strong>MOV + HEVC</strong> by default. HEVC is excellent: roughly half the size of H.264 at the same quality. But it's patent-encumbered, so support is patchy:</p>
<ul>
<li><strong>Windows</strong> doesn't play HEVC out of the box. Microsoft sells <em>HEVC Video Extensions</em> in the Store for about $1, because it doesn't pay HEVC royalties on every Windows licence. There's also a free <em>HEVC Video Extensions from Device Manufacturer</em> package from Microsoft. It just doesn't show up in a normal Store search.</li>
<li><strong>Many Android phones, smart TVs, older laptops and video editors</strong> can't decode it.</li>
<li><strong>Plenty of upload forms and course platforms</strong> only accept MP4.</li>
</ul>
<p>So "my iPhone video won't play" almost always means <strong>"this device can't decode HEVC"</strong>. Sometimes it means "this site only wants <code>.mp4</code>".</p>
<h2>The 10-second fix: change the box, re-encode only when you must</h2>
<p>Here's the part most "online converters" don't explain: <strong>MOV → MP4 is often not a conversion at all.</strong> If the streams are H.264 or HEVC with AAC audio, they can move into an MP4 container untouched. No quality loss, and a 400 MB clip is done in seconds.</p>
<p>That only fixes the box. If the device can't decode HEVC, the video itself has to be re-encoded to <strong>H.264</strong>, which every computer, phone, TV and browser plays.</p>
<p>Which one you need:</p>
<table>
<thead>
<tr>
<th>Your problem</th>
<th>What to do</th>
</tr>
</thead>
<tbody><tr>
<td>A site rejects <code>.mov</code> but your devices play it</td>
<td>Keep the original streams: instant, lossless</td>
</tr>
<tr>
<td>PC shows sound but no picture, or "codec not supported"</td>
<td>Re-encode HEVC → H.264</td>
</tr>
<tr>
<td>File too big for email or WhatsApp</td>
<td>Re-encode at 1080p/720p or set a target size</td>
</tr>
</tbody></table>
<p>A real example: <code>IMG_0412.MOV</code> (HEVC, 4K, 380 MB) re-encoded to 1080p H.264 comes out around 60 MB, and plays everywhere.</p>
<h2>How a browser tab does this without uploading anything</h2>
<p>Until recently, converting video meant sending it to a server running FFmpeg. Browsers now ship <strong>WebCodecs</strong>: direct access to the device's own encoders and decoders, usually hardware-accelerated. You can ask the browser up front what it can produce:</p>
<pre><code class="language-js">const { supported } = await VideoEncoder.isConfigSupported({
  codec: 'avc1.640028', // H.264 High profile
  width: 1920,
  height: 1080,
});
</code></pre>
<p>On <a href="https://4dev.net/mov-to-mp4?utm_source=hashnode&amp;utm_medium=referral&amp;utm_campaign=iphone-mov">4Dev.Net</a> I pair WebCodecs with <a href="https://github.com/Vanilagy/mediabunny">Mediabunny</a>, which reads and writes the containers. The core is a few lines:</p>
<pre><code class="language-js">const input = new Input({ source: new BlobSource(file), formats: ALL_FORMATS });
const output = new Output({ format: new Mp4OutputFormat(), target: new BufferTarget() });
const conversion = await Conversion.init({ input, output }); // streams kept as they are when they fit
await conversion.execute();
</code></pre>
<p>That maps directly to the table above:</p>
<ul>
<li><strong>Keep original quality:</strong> streams go into the MP4 unchanged. Fastest, and enough when the problem is just the <code>.mov</code> extension.</li>
<li><strong>High, Medium or Low:</strong> the video is re-encoded, and <strong>HEVC becomes H.264</strong>. This is the fix for the PC with sound and no picture.</li>
<li><strong>Trim</strong> or set a <strong>target size in MB</strong> to make it fit an email or chat app.</li>
</ul>
<p>Everything runs in the tab, so the video never leaves your device. That matters more than it sounds: the clip is often your kids, your home, or something you don't want sitting on a stranger's server. The limit is 500 MB per file, because the result is built in memory.</p>
<p>👉 <strong><a href="https://4dev.net/mov-to-mp4?utm_source=hashnode&amp;utm_medium=referral&amp;utm_campaign=iphone-mov">Try it on one of your own MOV files</a></strong>. Drag it in, pick High, done.</p>
<h2>Stop it happening again: one iPhone setting</h2>
<p><strong>Settings → Camera → Formats → Most Compatible</strong> makes the iPhone record H.264 instead of HEVC. The files are bigger, so many people keep HEVC and convert only the videos they share.</p>
<h2>Same root cause, same trick: HEIC photos</h2>
<p>iPhone <em>photos</em> have the same problem. They're saved as <strong>HEIC</strong>, which is also based on HEVC, and plenty of PCs, Android phones and upload forms reject them.</p>
<p>Safari decodes HEIC natively; Chrome, Firefox and Edge don't. So the site loads <strong>libheif compiled to WebAssembly</strong>, only when someone opens a HEIC file in a browser that needs it. It sniffs the real format from the file header instead of trusting the extension:</p>
<pre><code class="language-js">// Bytes 8-11 of an ISO-BMFF file hold the major brand.
const brand = new TextDecoder().decode(bytes.subarray(8, 12));
if (/^(heic|heix|hevc|hevx|heim|heis|mif1|msf1)$/.test(brand)) return 'heic';
</code></pre>
<p>Decoding runs in a Web Worker, so a 48-megapixel photo doesn't freeze the page. You can convert up to 50 photos at once into one ZIP. Location data from the HEIC isn't carried into the JPG, so sharing the photo doesn't share where you took it. 👉 <a href="https://4dev.net/heic-to-jpg?utm_source=hashnode&amp;utm_medium=referral&amp;utm_campaign=iphone-mov">HEIC to JPG</a></p>
<h2>What else runs entirely in the tab</h2>
<p>The same "nothing leaves your device" approach powers the rest of the site:</p>
<ul>
<li><strong><a href="https://4dev.net/pdf-to-word?utm_source=hashnode&amp;utm_medium=referral&amp;utm_campaign=iphone-mov">PDF to Word</a>.</strong> PDF.js reads the PDF, a layout pass rebuilds paragraphs, real tables and headers/footers, and a hand-written OOXML writer produces the <code>.docx</code>. Hebrew and Arabic stay right-to-left.</li>
<li><strong><a href="https://4dev.net/mp4-to-mp3?utm_source=hashnode&amp;utm_medium=referral&amp;utm_campaign=iphone-mov">MP4 to MP3</a>,</strong> using a LAME encoder compiled to WASM (64–320 kbps).</li>
<li><strong><a href="https://4dev.net/developer-tools?utm_source=hashnode&amp;utm_medium=referral&amp;utm_campaign=iphone-mov">Developer tools</a>:</strong> JSON ↔ CSV/YAML/TypeScript, cURL to code, a regex tester, a JWT decoder, hashes, cron explained, timestamps and more.</li>
</ul>
<h2>The takeaway</h2>
<ul>
<li>If a video won't play, suspect the <strong>codec</strong>, not the file. Renaming the extension changes nothing.</li>
<li>Changing the container is instant and lossless. Re-encode to H.264 only when a device can't play HEVC.</li>
<li>Your browser can now do this on your own machine. Private videos don't need to be uploaded anywhere.</li>
</ul>
<p>Next time a clip shows sound and no picture, you'll know it isn't broken, just speaking HEVC. <strong><a href="https://4dev.net/mov-to-mp4?utm_source=hashnode&amp;utm_medium=referral&amp;utm_campaign=iphone-mov">Fix your first video here</a></strong>.</p>
<p>Have you hit a device or app that still won't play the result? Tell me in the comments. I'm collecting the edge cases.</p>
]]></content:encoded></item></channel></rss>