🍱 Lunchbox Hands

audio

Record Voice Memos on Your Laptop Without Installing Anything (and Why Safari Can Give You an M4A)

Record audio straight from a browser tab, no app and no upload. What each browser saves (WebM, M4A, WAV), how big the files get, and how to fix a silent recording.

You need a thirty-second voice memo or a test take for a podcast, and your laptop has no recording app you trust. Every current browser can already record your microphone to a file, and the file it hands you depends on which browser you used, not on anything you chose. Chrome gives you WebM. Firefox gives you WebM or Ogg, never MP4. Safari, on older versions or on any site that doesn’t ask for a format, gives you an MP4 audio file that saves as .m4a. None of it has to leave your machine.

Below: how browser recording works, what each browser produces, how big the files get (with the arithmetic), and what to check when a take comes out silent. Our voice recorder does all of this in a tab, so it’s the reference for every behaviour described here.

How a browser records audio

Two web APIs do the work. getUserMedia asks permission and opens the microphone as a live stream. MediaRecorder takes that stream and encodes it into a file. The page asks the recorder for a format with a MIME type string, and the browser either agrees or says no:

MediaRecorder.isTypeSupported('audio/webm;codecs=opus') // true or false
const rec = new MediaRecorder(stream, { mimeType: 'audio/webm;codecs=opus' })
rec.start(1000) // hand over a chunk of data every 1000 ms

If the page passes no mimeType, the browser picks for itself. MDN’s mimeType reference says the property returns the type that was requested or, “if none was specified, which was chosen by the browser.”

Our recorder asks in a fixed order and takes the first yes:

  1. audio/webm;codecs=opus
  2. audio/webm
  3. audio/ogg;codecs=opus
  4. audio/mp4
  5. nothing (let the browser choose)

Each take then shows a badge with the type the browser actually reported, such as “WebM (Opus)” or “MP4”, and the download gets the matching extension.

What each browser produces

BrowserWhat it can recordWhat our recorder getsSaved as
Chrome, EdgeWebM (Opus or PCM), MP4WebM with Opus.webm
FirefoxWebM, OggWebM with Opus.webm
Safari 18.4 and laterMP4 (AAC and others), WebM (Opus)WebM with Opus.webm
Safari before 18.4MP4 onlyMP4 with AAC.m4a
Safari, no format requestedDefault is MP4(n/a).m4a

The Safari rows are the interesting ones. WebKit’s notes for Safari 18.4 say MediaRecorder “now supports creating WebM files using the Opus audio codec.” Before that release, MP4 was the only container Safari could write. And WebKit’s source still falls back to audio/mp4 when a page gives no type, so plenty of sites that never ask still hand Safari users an MP4.

An audio-only MP4 is exactly what an .m4a file is. The container is MP4, the codec is AAC, and .m4a is just the extension that tells your computer “this one has no video.” It plays in Apple Music, QuickTime, VLC and nearly every phone.

The WAV download

WAV is the format that comes out the same in every browser, because no browser records it here. When you click “Download .wav”, the recorder decodes your take with the Web Audio API (AudioContext.decodeAudioData) and writes the raw samples out as 16-bit PCM behind a standard 44-byte header. The sample rate is whatever the audio context decodes at, which is usually your audio device’s rate, 48 kHz or 44.1 kHz. A “Downmix WAV to mono” checkbox averages the channels into one and halves the file.

Pick WAV when an editor or upload form asks for it. Keep the native file when you want something small to send.

How big the files get

Uncompressed PCM is easy to work out. Every second stores one sample per channel, and 16-bit means 2 bytes per sample:

bytes per minute = sample rate × channels × 2 bytes × 60 seconds

48,000 × 1 × 2 × 60 =  5,760,000 bytes   (48 kHz mono)
48,000 × 2 × 2 × 60 = 11,520,000 bytes   (48 kHz stereo)
44,100 × 1 × 2 × 60 =  5,292,000 bytes   (44.1 kHz mono)

Compressed audio is measured by bitrate instead. Divide by 8 to get bytes, then multiply by 60:

bytes per minute = kbps × 1000 ÷ 8 × 60

 32 kbps →   240,000 bytes
 64 kbps →   480,000 bytes
128 kbps →   960,000 bytes
FormatBitratePer minutePer hour
WAV, 16-bit 48 kHz mono768 kbps5.76 MB345.6 MB
WAV, 16-bit 48 kHz stereo1,536 kbps11.52 MB691.2 MB
Opus (WebM)32 kbps0.24 MB14.4 MB
Opus (WebM)64 kbps0.48 MB28.8 MB
AAC (M4A)64 kbps0.48 MB28.8 MB
AAC (M4A)128 kbps0.96 MB57.6 MB

(MB here is 1,000,000 bytes.) The browser chooses the compressed bitrate unless the page sets one, and our recorder doesn’t set one, so look at the size shown next to each take for the real number.

There’s one hard limit. A WAV file’s size fields are 32-bit, so it can’t go past 4 GB. At 5.76 MB a minute that’s more than 12 hours of mono, and the recorder warns you if a take would cross it.

Why a Chrome WebM shows no length

Open a WebM from Chrome and the player may show no total time, or refuse to seek until playback reaches the end. The file isn’t broken.

A WebM file has an optional Duration field and an optional Cues index that players use to show length and jump around. Pipe’s investigation of Chrome’s output (updated June 2026) found that since Chrome 140, Duration is written for recordings made in one piece. Recordings made in chunks still lack it, and Cues are missing either way. Without them, a player has to read the whole file before it knows the length.

Our recorder records in chunks on purpose. It calls start(1000), so the browser hands over data every second. If you unplug a USB mic or a Bluetooth headset drops mid-take, the recorder stops cleanly and keeps everything captured up to that moment, and the take appears in the list as normal. The trade-off is that missing duration in Chrome. If a tool down the line chokes on it, download the WAV instead, which always has its length in the header.

Troubleshooting a bad take

The browser says access is blocked. The page gets a NotAllowedError and can’t ask again by itself. Unblock it from the browser: in Chrome and Edge, use the microphone icon at the right end of the address bar. In Firefox, the permissions icon left of the URL. In Safari, Safari menu, then Settings for This Website, then Microphone. We cover the long version in why browser microphone access fails.

The browser allowed it but nothing comes through. Your operating system can block the browser as an app. On macOS, Apple’s path is Apple menu > System Settings > Privacy & Security > Microphone, then switch on your browser. On Windows 11, Microsoft’s is Settings > Privacy & security > Microphone. Turn on “Microphone access”, “Let apps access your microphone” and, since browsers are desktop apps, “Let desktop apps access your microphone”.

It’s recording the wrong mic. Laptops often keep the built-in microphone even with a headset plugged in. Pick the input from the recorder’s device dropdown and talk. The level meter and scrolling waveform should move. If they don’t, nothing will be in the file.

The take is silent or very quiet. Check for a mute switch or a muted headset first. Then watch the meter: normal speech should land roughly between −30 and −10 dBFS. If it sits lower, raise the input volume in your system sound settings or move closer. The mic test shows the same meter plus your sample rate if you want to diagnose before recording.

Music sounds pumped or smeared. Browsers turn on noise suppression, echo cancellation and auto gain by default, because they assume a video call. Those help a spoken memo and hurt a guitar. The recorder has a checkbox for each. Untick all three for a raw signal. A browser can ignore the request, and the recorder tells you next to the checkbox when it did.

What it doesn’t do

The recorder records, pauses and resumes (where the browser supports pause), plays back, and downloads. It doesn’t trim. Use Pause to skip the parts you don’t want while you record. For cutting afterwards, open the WAV or M4A in a free editor like Audacity, or send it to your phone and trim it in an audio app there.

Takes live in the tab’s memory only, so nothing is uploaded and nothing is saved when you close the page. Download the ones you want to keep.

Next time you need a quick memo, skip the app store. Open the voice recorder, pick your mic, watch the meter move, and press Record.