Audio
How to Batch Convert Audio Files on Mac
To batch convert audio files on a Mac, select them all in the Music app and choose File → Convert → Create MP3 Version, or run a one-line shell loop over the folder. Both are free. Fourteen tagged M4A files went through a tuned ffmpeg loop in 2,805 ms and through an afconvert loop in 6,151 ms.
The thing that separates the routes is not speed. It is what arrives at the other end. Across the same fourteen files, one route kept every tag and every cover image, one kept the tags and threw the covers away, and one produced fourteen perfectly encoded files with no metadata whatsoever.
All of it measured on 26 September 2026 on an M2 Pro running macOS 27.0 (build 26A428), on fourteen files built from the alert sounds in /System/Library/Sounds so you can rebuild the corpus exactly.
Which batch method should you use?
One corpus: fourteen 30-second AAC files, 10,258,104 bytes in total, each carrying six text tags and a 37,970-byte JPEG cover. Four routes, same machine, same run.
| Route | Target | Time | Output total | Tags | Covers kept |
|---|---|---|---|---|---|
| afconvert loop | AAC m4a, 128 kbps | 6,151 ms | 5,317,747 B | All lost | 0 of 14 |
| ffmpeg loop, defaults | MP3, 128 kbps CBR | 4,053 ms | 10,538,345 B | Kept | 14 of 14, inflated |
| ffmpeg loop, tuned | MP3, LAME V2 | 2,805 ms | 4,234,753 B | Kept | 14 of 14, untouched |
| Smol | MP3, LAME V2 | 2,822 ms | 3,702,837 B | Kept | 0 of 14 |
| Music app | Any encoder it offers | Not measured | Not measured | Kept | Kept |
Three rows deserve flagging before anything else. The ffmpeg default produced more bytes than it went in with, which takes explaining and gets a section below. A tuned ffmpeg loop finished in 2,805 ms against our 2,822 — a dead heat, and it kept the artwork we lost. And the 531,916-byte gap between those two outputs is, almost exactly, the fourteen cover images: 14 × 37,970 is 531,580. We are not smaller because we compress better. We are smaller because we threw your album art away.
Does the Music app batch convert?
Yes, and for anyone whose audio already lives in a Music library it is the obvious answer. Apple documents the route in the Music User Guide: set Music → Settings → Files → Import Settings → Import Using to the encoder you want, then select one or more songs and choose File → Convert → Create [format] Version. Selecting a thousand tracks works the same way as selecting one.
Two behaviours matter at batch scale. Apple states that “the song in its original format and the newly converted song appear in your library”, so a thousand-track conversion leaves you with two thousand entries and a housekeeping job. And Music writes metadata from the library record rather than the source file, which is why this route comes out of the tag question cleanly: the artwork you see is the artwork you get.
We have not published numbers for it. Measuring it properly means importing a test corpus into a real library, and an unmeasured figure is worse than none. The strengths and the housekeeping cost above are both documented by Apple.
The limitation is scope. Music converts what is in Music. A folder of interview recordings, field audio, or sample packs that you do not want indexed into a music library is the case the next three routes exist for. It is also the exact question in “Is there a way to convert audio files in Mac OS X or the command line without using iTunes?” on Ask Different, asked 27 September 2011, score 156 with 138,180 views and nine answers as of 26 September 2026. Fifteen years on, it is still being read.
How do I batch convert with afconvert?
afconvert is Apple’s Core Audio command-line converter, installed on every Mac, no Homebrew required. Looping it over a folder is four lines:
mkdir -p converted
for f in *.m4a; do
afconvert -f m4af -d aac -b 128000 "$f" "converted/${f%.m4a}.m4a"
doneFourteen files took 6,151 ms and came out at 5,317,747 bytes from 10,258,104, which is the encoder doing its job correctly.
Then check the output and the problem is immediate. Of the fourteen files, zero carried any embedded cover, and ffprobe reported no format tags at all. Not a stripped title. No title field. The same held for ALAC and FLAC output. afconvert converts audio; it does not carry metadata across, and it does not warn you.
Which makes it the right tool in exactly one shape of job: bulk audio where the filename is the identity. Podcast masters, voice memos, sample libraries, dialogue takes. For anything with an artist and an album, use something else or plan to re-tag afterwards.
Two more limits worth knowing before you build a pipeline on it. afconvert cannot write MP3. macOS ships an MP3 decoder and no encoder, so the command fails with Error: ExtAudioFileSetProperty ('cfmt') failed ('fmt?') and produces no file. That is covered in full in converting M4A to MP3 on a Mac. And the formats it does write are listed by afconvert -hf, which is worth running once.
How do I batch convert audio with ffmpeg?
The loop everyone writes, and the one that quietly costs you three megabytes:
for f in *.m4a; do ffmpeg -i "$f" "${f%.m4a}.mp3"; doneFourteen files, 4,053 ms, and the output was 10,538,345 bytes from an input of 10,258,104. The conversion made the folder bigger.
The cause is the artwork. ffmpeg preserves embedded covers, which is the right default, and then re-encodes each one as PNG on the way into the ID3 frame. Every 37,970-byte JPEG became a 280,962-byte PNG. Fourteen of those is 3.9 MB of nothing but re-compressed cover image, on top of 128 kbps audio the source did not need.
The loop to use instead:
mkdir -p converted
for f in *.m4a; do
ffmpeg -i "$f" -map 0 -c:a libmp3lame -q:a 2 \
-c:v copy -id3v2_version 3 "converted/${f%.m4a}.mp3"
done| Loop | Time | Output total | Cover per file |
|---|---|---|---|
| Source files | — | 10,258,104 B | 37,970 B JPEG |
| ffmpeg -i in.m4a out.mp3 | 4,053 ms | 10,538,345 B | 280,962 B PNG |
| …with -c:v copy, 128 kbps CBR | 4,026 ms | 7,136,471 B | 37,970 B JPEG |
| …with -c:v copy and -q:a 2 | 2,805 ms | 4,234,753 B | 37,970 B JPEG |
-map 0 keeps every stream rather than ffmpeg’s automatic pick, -c:v copy passes the cover through untouched, -q:a 2 is LAME’s V2 variable bitrate instead of the 128 kbps CBR default, and -id3v2_version 3 keeps older car stereos happy. That is the whole difference between a batch that works and a batch you redo.
Two practical notes for real folders. Write into a separate directory rather than alongside the sources, so a re-run does not pick up its own output. And keep the loop serial: fourteen files finished in four seconds, and the failure mode of fourteen parallel ffmpeg processes on a laptop is worse than the four seconds you save.
What does a native app do differently?
It removes the loop. Smol took the same fourteen files to MP3 in 2,822 ms, output 3,702,837 bytes. Audio targets are m4a, mp3, wav, flac and ogg; compression adds aac and opus, with bitrate settable from 16 to 512 kbps and sample rate from 8 to 192 kHz.
The encoder is not what you are paying for, and it would be dishonest to imply it is. The MP3 stream measured 70,142 bps on the first file of the corpus, which is bit for bit what ffmpeg at -q:a 2 produced from the same input. The tuned loop was also 17 ms faster. What you are buying is the loop not existing: no flag to remember, no output directory to create, no re-run that eats its own results.
Text metadata came through on all fourteen:
| Field | Source | After conversion |
|---|---|---|
| Title | Basso | Basso |
| Artist / Album artist | Smol Test Fixtures | Smol Test Fixtures |
| Album | Alert Suite | Alert Suite |
| Track number | 1/14 | 1/14 |
| Genre | Test Tone | Test Tone |
| Embedded cover | 37,970 B JPEG | Not present |
That last row is the honest cost. Track positions survive, which is the field cheap batch converters most often flatten to a bare number, and the cover does not. Verified across MP3, M4A and FLAC output. If album art matters, the ffmpeg loop above is the better tool and this page says so in the table at the top.
One input limit: AIFF is rejected. Handed a file straight out of /System/Library/Sounds, Smol returns “This file couldn’t be processed. It may be corrupted or in an unsupported format.” Convert AIFF to WAV with afconvert first.
How do I keep a big batch consistent?
Three rules, learned the expensive way by everyone who has done this once.
Pin the bitrate rather than trusting a preset. Variable-bitrate encoders respond to content, so a folder converted at “high quality” comes out at wildly different rates. On our corpus LAME V2 landed at 70,142 bps because the alert sounds are mostly silence; a dense tone bed through the same setting averaged 105,361. Asking for a specific rate gives a specific rate: a request for 192 kbps measured 192,533 bps on the output.
Never convert upward. That same 192 kbps request produced a file larger than its 30-second AAC source, because 192 kbps MP3 is a higher rate than the AAC it was decoded from. You get the file size of the higher bitrate and the quality of the lower one.
Check one file before you run four hundred. Convert a single track, open it, look at the tags, look at the artwork, play the last ten seconds. Every failure mode in this article is visible in thirty seconds on one file and invisible until you need the folder.
If the batch is recurring rather than one-off, Smol ships an MCP server, so Claude Code, Codex and Google Antigravity can drive it directly, each one click to enable in the AI access panel as of Smol 1.0.35. “Convert everything in ~/Interviews to MP3 at 96 kbps mono” becomes one instruction rather than a script you maintain and a flag you forget. The tool surface and the guardrails are on the Smol MCP page. For a folder you convert twice a year, that is overkill and the shell loop above is better.
When Smol is not the answer
This is the section that matters most on this page, because for audio the free tools are genuinely sufficient for most people and we are not going to pretend otherwise.
If your audio is in Music, use Music. It batch converts any selection, it is free, Apple documents it, and it writes the artwork and tags your library holds. No command-line tool on this page handles metadata as well, including ours.
If album art matters, use ffmpeg. The -c:v copy loop kept all fourteen covers byte for byte. Smol kept none. That is a real gap, it is measured above, and it is free to avoid.
If it is a one-off, use the shell loop. Four lines, four seconds, nothing installed beyond ffmpeg. Buying an app to run a for loop once is not a sensible trade.
What is left is genuinely narrow: a folder you process repeatedly, where consistency matters more than artwork, and where audio is one of several things you are squeezing alongside images, video and PDFs in the same drop. If you are already reaching for a PDF compressor and a batch image tool, folding audio into the same window is worth something. If you are not, the $29 is better spent elsewhere and the loops above will serve you for years.
Frequently asked questions
How do I batch convert audio files on a Mac?
Select the tracks in the Music app and choose File, Convert, Create MP3 Version, after setting the encoder under Music, Settings, Files, Import Settings. Outside Music, loop ffmpeg or afconvert over the folder. Fourteen test files took 4,053 ms through an ffmpeg loop and 6,151 ms through afconvert.
Does afconvert keep tags and album art?
No. Across fourteen tagged test files, every AAC, ALAC and FLAC file afconvert produced came back with no format tags and no embedded artwork at all. It is excellent for bulk audio where the filename is the identity, and the wrong tool for a music library.
Why did my ffmpeg batch conversion make the files bigger?
Because ffmpeg preserves embedded cover art and re-encodes it as PNG. A 37,970-byte JPEG cover became a 280,962-byte PNG in each output, so fourteen files grew from 10,258,104 to 10,538,345 bytes. Adding -c:v copy keeps the original JPEG and brings the total to 7,136,471 bytes.
What is the best ffmpeg loop for batch audio conversion?
for f in *.m4a; do ffmpeg -i "$f" -map 0 -c:a libmp3lame -q:a 2 -c:v copy -id3v2_version 3 "converted/${f%.m4a}.mp3"; done. Write into a separate directory so a re-run does not pick up its own output, and keep the loop serial rather than launching one process per file.
Can I set an exact bitrate when batch converting?
Yes, and you should if consistency matters. Variable-bitrate encoders respond to content: the same LAME V2 setting averaged 70,634 bps on a silence-heavy corpus and 105,361 bps on a dense one. Requesting 192 kbps produced a stream measuring 192,533 bps. The usable range is 16 to 512 kbps.
Keep reading