Apple - How to I go from .flac to .mp3 using LAME & FLAC using the Terminal alone?
Converting a single file without preserving tags
brew install lame
flac --decode --stdout test.flac | lame --preset extreme - test.mp3
--decode --stdout
=-dc
lame - $outfile
= input from STDIN--preset extreme
= ~245 kbit/s VBR
A shell script that preserves some ID3 tags
#!/bin/bash
for f in "$@"; do
[[ "$f" != *.flac ]] && continue
album="$(metaflac --show-tag=album "$f" | sed 's/[^=]*=//')"
artist="$(metaflac --show-tag=artist "$f" | sed 's/[^=]*=//')"
date="$(metaflac --show-tag=date "$f" | sed 's/[^=]*=//')"
title="$(metaflac --show-tag=title "$f" | sed 's/[^=]*=//')"
year="$(metaflac --show-tag=date "$f" | sed 's/[^=]*=//')"
genre="$(metaflac --show-tag=genre "$f" | sed 's/[^=]*=//')"
tracknumber="$(metaflac --show-tag=tracknumber "$f" | sed 's/[^=]*=//')"
flac --decode --stdout "$f" | lame --preset extreme --add-id3v2 --tt "$title" --ta "$artist" --tl "$album" --ty "$year" --tn "$tracknumber" --tg "$genre" - "${f%.flac}.mp3"
done
To use the script, just save it somewhere like ~/bin/flac2mp3
and make it executable with chmod +x ~/bin/flac2mp3
.
This would convert all flac files in your Music folder:
find ~/Music/ -name '*.flac' -exec ~/bin/flac2mp3 {} \;
Or slightly faster, since it only calls flac2mp3 once:
find ~/Music/ -name '*.flac' -print0 | xargs -0 ~/bin/flac2mp3
ffmpeg would preserve tags (but not cover art) by default.
for f in *.flac; do ffmpeg -i "$f" -aq 1 "${f%flac}mp3"; done
-aq 1
corresponds to -V 1
in lame. -acodec libfaac
would convert the files to AAC:
for f in *.flac; do ffmpeg -i "$f" -acodec libfaac -aq 200 "${f%flac}m4a"; done
i took what you guys had, but then made it run even faster by using xargs
to parallelize the jobs.
find <directory> -name '*.flac' -print0 | xargs -0 -P8 -n1 /usr/local/bin/flac2mp3
Then this is the script from above /usr/local/bin/flac2mp3
#!/usr/bin/env bash
for f in "$@"; do
[[ "$f" != *.flac ]] && continue
album="$(metaflac --show-tag=album "$f" | sed 's/[^=]*=//')"
artist="$(metaflac --show-tag=artist "$f" | sed 's/[^=]*=//')"
date="$(metaflac --show-tag=date "$f" | sed 's/[^=]*=//')"
title="$(metaflac --show-tag=title "$f" | sed 's/[^=]*=//')"
year="$(metaflac --show-tag=date "$f" | sed 's/[^=]*=//')"
genre="$(metaflac --show-tag=genre "$f" | sed 's/[^=]*=//')"
tracknumber="$(metaflac --show-tag=tracknumber "$f" | sed 's/[^=]*=//')"
flac --decode --stdout "$f" \
| lame --preset extreme \
--add-id3v2 \
--tt "$title" \
--ta "$artist" \
--tl "$album" \
--ty "$year" \
--tn "$tracknumber" \
--tg "$genre" \
- "${f%.flac}.mp3"
done
and heres some stats for the performance speedup using parallelism.
find <dirOfFlac24s> -name '*.flac -print0 | xargs -0 -P8 -n1 /usr/local/bin/flac2mp320
0.00s user 0.00s system 60% cpu 0.002 total
115.94s user 1.40s system 359% cpu 32.655 total
time /usr/local/bin/flac2mp320 <dirOfFlac24s>/*.flac
96.63s user 1.46s system 109% cpu 1:29.98 total
you can see it also utilized my CPUs more effectively, i have an intel i7, so 8 is probably the right number of processes.