Difference between revisions of "Convert FLAC to MP3"

From ArchWiki
Jump to: navigation, search
(fixed a small bug in sed line)
m (Style fixes.)
(25 intermediate revisions by 14 users not shown)
Line 1: Line 1:
[[Category:Audio/Video (English)]]
+
[[Category:Audio/Video]]
[[Category:Scripts (English)]]
+
[[Category:Scripts]]
[[Category:HOWTOs (English)]]
+
{{Article summary start}}
=Introduction=
+
{{Article summary text|Converting audio formats}}
Here is a script that will convert FLAC to MP3 via the commandline.
+
{{Article summary heading|Related}}
 +
{{Article summary wiki|Convert Any To Mp3}}
 +
{{Article summary wiki|Convert any Movie to DVD Video}}
 +
{{Article summary end}}
  
Essentially, the .flac files within a directory will be decompressed to .wav and then the resulting .wav files will be encoded to .mp3 using the latest LAME switches for encodings (''-V 0 --vbr-new''). The ID3 tags of the original .flac files will be passed to the resulting .mp3 files.
+
Here are a few scripts and tools that facilitate converting FLAC to MP3.
  
The original .flac files will not be harmed and the resulting .mp3s will be in the same directory. All other files in the directory (.nfo, images, .sfv, etc) will be ignored and unharmed.  
+
For more information on LAME switches/settings such as V0, visit the [http://wiki.hydrogenaudio.org/index.php?title=LAME Hydrogenaudio LAME Wiki]. V0 is roughly equivalent to {{ic|--preset extreme}} which results in a variable bitrate usually between 220-260. The audio of a V0 is transparent, meaning one cannot tell the difference between the lossy file and the original source (compact disc/lossless), but yet the file size is a quite reasonable.
  
For more information on LAME switches/settings such as V0, visit [http://wiki.hydrogenaudio.org/index.php?title=LAME Hydrogenaudio LAME Wiki]. V0 is roughly equivalent to ''--preset extreme'' which results in a variable bitrate usually between 220-260. The audio of a V0 is transparent, meaning one cannot tell the difference between the lossy file and the original source (compact disc/lossless), but yet the file size is a quite reasonable.
+
== Scripts ==
  
More information on flac: [http://wiki.hydrogenaudio.org/index.php?title=Flac FLAC]
+
In these two examples, the FLAC files in a directory are read, decompressed to WAV, and streamed into the MP3 encoder, LAME. Both scripts pass the ID3 tags from the FLAC files to the resulting MP3 files, and encode to MP3 V0.
  
==Installation==
+
The original .flac files are not modified and the resulting .mp3s will be in the same directory. All files with extensions not matching {{ic|*.flac}} in the working directory ({{ic|.nfo}}, images, {{ic|.sfv}}, etc.) are ignored.
  
First you need to install the following packages: flac, lame, and id3
+
=== With FFmpeg ===
  
<pre>
+
Chances are, your system already has {{ic|ffmpeg}} installed, which brings in the {{ic|flac}} and {{ic|lame}} packages. FFmpeg has all the encoding and decoding facilities built in to do the job.
pacman -S flac lame id3
+
</pre>
+
  
Once those are installed, copy the following script into your preferred editor:
+
{{bc|
 +
#!/bin/bash
  
<pre>
+
for f in *.flac; do
for a in *.flac
+
  ffmpeg -i "$f" -qscale:a 0 "${f[@]/%flac/mp3}"
 +
done
 +
}}
  
do
+
=== Without FFmpeg ===
OUTF=`echo "$a" | sed s/\.flac$/.mp3/g`
+
  
ARTIST=`metaflac "$a" --show-tag=ARTIST | sed s/.*=//g`
+
If for some reason you have something against FFmpeg, you still need to have {{ic|flac}} and {{ic|lame}} installed. Here, the tagging process is more explicit, using the metadata utility that comes with {{ic|flac}}, and passing the information to {{ic|lame}}
TITLE=`metaflac "$a" --show-tag=TITLE | sed s/.*=//g`
+
ALBUM=`metaflac "$a" --show-tag=ALBUM | sed s/.*=//g`
+
GENRE=`metaflac "$a" --show-tag=GENRE | sed s/.*=//g`
+
TRACKNUMBER=`metaflac "$a" --show-tag=TRACKNUMBER | sed s/.*=//g`
+
DATE=`metaflac "$a" --show-tag=DATE | sed s/.*=//g`
+
  
flac -c -d "$a" | lame -m j -q 0 --vbr-new -V 0 -s 44.1 - "$OUTF"
+
{{bc|<nowiki>
id3 -t "$TITLE" -T "${TRACKNUMBER:-0}" -a "$ARTIST" -A "$ALBUM" -y "$DATE" -g "${GENRE:-12}" "$OUTF"
+
#!/bin/bash
  
done
+
for a in *.flac; do
</pre>
+
  # give output correct extension
 +
  OUTF="${a[@]/%flac/mp3}"
  
Save the script as ''flac2mp3'' and make the script executable:
+
  # get the tags
 +
  ARTIST=$(metaflac "$a" --show-tag=ARTIST | sed s/.*=//g)
 +
  TITLE=$(metaflac "$a" --show-tag=TITLE | sed s/.*=//g)
 +
  ALBUM=$(metaflac "$a" --show-tag=ALBUM | sed s/.*=//g)
 +
  GENRE=$(metaflac "$a" --show-tag=GENRE | sed s/.*=//g)
 +
  TRACKNUMBER=$(metaflac "$a" --show-tag=TRACKNUMBER | sed s/.*=//g)
 +
  DATE=$(metaflac "$a" --show-tag=DATE | sed s/.*=//g)
  
<pre>
+
  # stream flac into the lame encoder
chmod a+x flac2mp3
+
  flac -c -d "$a" | lame -V0 --add-id3v2 --pad-id3v2 --ignore-tag-errors \
</pre>
+
    --ta "$ARTIST" --tt "$TITLE" --tl "$ALBUM"  --tg "${GENRE:-12}" \
 
+
    --tn "${TRACKNUMBER:-0}" --ty "$DATE" - "$OUTF"
As root, copy the script to /usr/local/bin (or anywhere else that is in your $PATH).
+
done
 
+
</nowiki>}}
<pre>
+
cp flac2mp3 /usr/local/bin
+
</pre>
+
  
To make /usr/local/bin in your $PATH, do (as normal user):
+
=== Usage ===
  
<pre>
+
For ease of use, add the script to your {{ic|PATH}}. Open up a terminal, {{ic|cd}} to the directory of FLAC files that you wish to convert, and invoke {{ic|flac2mp3}} (or whatever you named the script). You'll see the verbose decoding/encoding process in the terminal which may take a few moments. Done! At this point, it's trivial to {{ic|mv *.mp3}} all your new MP3s wherever you wish.
PATH=$PATH:/usr/local/bin/
+
</pre>
+
  
and then (as normal user):
+
A useful extension of the above scripts is to let it recurse into all subdirectories of the working directory. Replace the first line ({{ic|for .... do}}) with
<pre>
+
nano .bashrc
+
</pre>
+
  
and add ''export PATH=$PATH:/usr/local/bin/''
+
$ find -type f -name "*.flac" -print0 | while read -d $'\0' a; do
  
===Usage===
+
== Packages ==
  
Open up a terminal and cd to the directory of .flac files that you wish to convert and enter ''flac2mp3''
+
* {{AUR|whatmp3}} - A small Python script that accepts a list of directories containing FLAC files as arguments and converts them to MP3 with the specified options.
 +
* {{AUR|flac2all}} - Audio converter of FLAC to either Ogg Vorbis or MP3 retaining all tags and metadata.
 +
* {{AUR|flac2mp3-bash}} - Bash script to convert Flac to Mp3 easily.
  
You'll see the verbose decoding/encoding process in the terminal which may take a few moments.
+
== See also ==
  
Done.
+
* https://www.xiph.org/flac/
 +
* https://en.wikipedia.org/wiki/FLAC
 +
* http://lame.sourceforge.net/
 +
* http://wiki.hydrogenaudio.org/index.php?title=Flac - More information on FLAC.

Revision as of 15:24, 8 September 2013

Template:Article summary start Template:Article summary text Template:Article summary heading Template:Article summary wiki Template:Article summary wiki Template:Article summary end

Here are a few scripts and tools that facilitate converting FLAC to MP3.

For more information on LAME switches/settings such as V0, visit the Hydrogenaudio LAME Wiki. V0 is roughly equivalent to --preset extreme which results in a variable bitrate usually between 220-260. The audio of a V0 is transparent, meaning one cannot tell the difference between the lossy file and the original source (compact disc/lossless), but yet the file size is a quite reasonable.

Scripts

In these two examples, the FLAC files in a directory are read, decompressed to WAV, and streamed into the MP3 encoder, LAME. Both scripts pass the ID3 tags from the FLAC files to the resulting MP3 files, and encode to MP3 V0.

The original .flac files are not modified and the resulting .mp3s will be in the same directory. All files with extensions not matching *.flac in the working directory (.nfo, images, .sfv, etc.) are ignored.

With FFmpeg

Chances are, your system already has ffmpeg installed, which brings in the flac and lame packages. FFmpeg has all the encoding and decoding facilities built in to do the job.

#!/bin/bash

for f in *.flac; do
  ffmpeg -i "$f" -qscale:a 0 "${f[@]/%flac/mp3}"
done

Without FFmpeg

If for some reason you have something against FFmpeg, you still need to have flac and lame installed. Here, the tagging process is more explicit, using the metadata utility that comes with flac, and passing the information to lame

#!/bin/bash

for a in *.flac; do
  # give output correct extension
  OUTF="${a[@]/%flac/mp3}"

  # get the tags
  ARTIST=$(metaflac "$a" --show-tag=ARTIST | sed s/.*=//g)
  TITLE=$(metaflac "$a" --show-tag=TITLE | sed s/.*=//g)
  ALBUM=$(metaflac "$a" --show-tag=ALBUM | sed s/.*=//g)
  GENRE=$(metaflac "$a" --show-tag=GENRE | sed s/.*=//g)
  TRACKNUMBER=$(metaflac "$a" --show-tag=TRACKNUMBER | sed s/.*=//g)
  DATE=$(metaflac "$a" --show-tag=DATE | sed s/.*=//g)

  # stream flac into the lame encoder
  flac -c -d "$a" | lame -V0 --add-id3v2 --pad-id3v2 --ignore-tag-errors \
    --ta "$ARTIST" --tt "$TITLE" --tl "$ALBUM"  --tg "${GENRE:-12}" \
    --tn "${TRACKNUMBER:-0}" --ty "$DATE" - "$OUTF"
done

Usage

For ease of use, add the script to your PATH. Open up a terminal, cd to the directory of FLAC files that you wish to convert, and invoke flac2mp3 (or whatever you named the script). You'll see the verbose decoding/encoding process in the terminal which may take a few moments. Done! At this point, it's trivial to mv *.mp3 all your new MP3s wherever you wish.

A useful extension of the above scripts is to let it recurse into all subdirectories of the working directory. Replace the first line (for .... do) with

$ find -type f -name "*.flac" -print0 | while read -d $'\0' a; do

Packages

  • whatmp3AUR - A small Python script that accepts a list of directories containing FLAC files as arguments and converts them to MP3 with the specified options.
  • flac2allAUR - Audio converter of FLAC to either Ogg Vorbis or MP3 retaining all tags and metadata.
  • flac2mp3-bashAUR - Bash script to convert Flac to Mp3 easily.

See also