How to convert a m4a sound file to mp3?
Solution 1
The simple way to do it is:
ffmpeg -v 5 -y -i input.m4a -acodec libmp3lame -ac 2 -ab 192k output.mp3
If you want a script to wrap that, try aac2mp3, which should work for you. (The syntax for that last statement was pulled from there.) Inline code included below:
#!/bin/bash
#
# $Id: aac2mp3,v 1.2 03/30/2008 10:00 Daniel Tavares ([email protected]) -
# Based on Script - rali Exp $
#
#
# Convert one or more AAC/M4A files to MP3. Based on a script example
# I found at: http://gimpel.gi.funpic.de/Howtos/convert_aac/index.html
#
ME=`basename ${0}`
FFMPEG="/usr/bin/ffmpeg"
EXT="mp4"
BITRATE="128"
do_usage() { # explanatory text
echo "usage: ${ME} [-b nnn] [-e ext] [-f] [-c] [-r] [-v] [-h] [file list]"
echo " Convert music from AAC format to MP3"
echo " -m /path/app Specify the location of ffmpeg(1)"
echo " -b nnn bitrate for mp3 encoder to use"
echo " -e ext Use .ext rather than .m4a extension"
echo " -f Force overwrite of existing file"
echo " -c Delete original AAC|M4A file(s)"
echo " -v Verbose output"
echo " -h This information"
echo ""
echo "For recursive directory, use: find -name '*.${EXT}' -exec ${ME} "{}" [args] \;"
exit 0
}
do_error() {
echo "$*"
exit 1
}
file_overwrite_check() {
if [ "$FORCE" != "yes" ]
then
test -f "${1}" && do_error "${1} already exists."
else
test -f "${1}" && echo " ${1} is being overwritten."
fi
}
create_mp3() { # use ffmpeg(1) to convert from AAC to MP3
file_overwrite_check "${2}"
test $VERBOSE && echo -n "Converting file: ${1}"
${FFMPEG} -v 5 -y -i "${1}" -acodec libmp3lame -ac 2 -ab ${BITRATE}k "${2}";
if [ $? -ne 0 ]
then
echo ""
echo "Error!"
do_cleanup
do_error "Exiting"
fi
test $VERBOSE && echo ". OK"
}
do_cleanup() { # Delete intermediate and (optionally) original file(s)
test ${RMM4A} && rm -f "${1}"
test $VERBOSE && echo ". OK"
}
do_set_bitrate() {
test $VERBOSE && echo -n "Setting bitrate to: $1 kbps"
BITRATE=$1
test $VERBOSE && echo ". OK"
}
GETOPT=`getopt -o l:m:b:e:cfhrv -n ${ME} -- "$@"`
if [ $? -ne 0 ]
then
do_usage
fi
eval set -- "$GETOPT"
while true
do
case "$1" in
-m) FFMPEG=$2 ; shift ; shift ;;
-b) do_set_bitrate $2 ; shift ; shift ;;
-e) EXT=$2 ; shift ; shift ;;
-f) FORCE="yes" ; shift ;;
-c) RMM4A="yes" ; shift ;;
-v) VERBOSE="yes" ; shift ;;
-h) do_usage ;;
--) shift ; break ;;
*) do_usage ;;
esac
done
test -f $FFMPEG || do_error "$FFMPEG not found. Use \"-m\" switch."
if [ $# -eq 0 ]
then # Convert all files in current directory
for IFILE in *.${EXT}
do
if [ "${IFILE}" == "*.${EXT}" ]
then
do_error "Not found ${EXT} in this folder."
fi
OUT=`echo "${IFILE}" | sed -e "s/\.${EXT}//g"`
create_mp3 "${IFILE}" "${OUT}.mp3"
do_cleanup "${IFILE}"
done
else # Convert listed files
for IFILE in "$*"
do
test -f "${IFILE}" || do_error "${IFILE} not found."
OUT=`echo "${IFILE}" | sed -e "s/\.${EXT}//g"`
create_mp3 "${IFILE}" "${OUT}.mp3"
do_cleanup "${IFILE}"
done
fi
exit 0
Solution 2
This worked for me on Ubuntu 14.04:
avconv -i input.m4a ouptut.mp3
To obtain the avconv
command, install libav-tools :
sudo apt-get install libav-tools
Solution 3
SoundConverter can do this without having to mess around on the command-line, and it's available in the Ubuntu Software Center:
Solution 4
I needed an alternate solution because - my files were sitting in recursive subdirectories - I had spaces in paths.
So I eventually settled for :
find . -type f -name '*.m4a' -exec bash -c 'avconv -i "$0" "${0/%m4a/mp3}"' '{}' \;
Then deleted the original files :
find . -type f -name '*.m4a' -exec bash -c 'rm "$0"' '{}' \;
Solution 5
I created a script to do this.
My requirements were:
- Must maintain as many tags as possible
- Must retain album artwork if exists
- Must be 320K mp3s
Works on all m4a files in a directory, and outputs the new shiny Mp3s into a folder the script creates called Mp3. Warning; this script overwrites existing Mp3s in the output folder if they have the same name. Also uses files 'metadata.txt' and 'metadata2.txt' as temp files.
You'll need to install avconv if it doesn't exist already.
I couldn't figure out how to persist the 'Year' tag into ID3v1 tags, so I didn't enable that option.
#!/bin/bash
files=*.m4a
#create output folder if it doesnt exist
if [ ! -d Mp3 ]; then
mkdir Mp3
fi
for file in $files; do
mp3File=${file/%m4a/mp3}
avconv -y -i "${file}" -f ffmetadata metadata.txt
sed -e 's/^date=\(.*\)$/TYER=\1/' -e 's/^major_brand=.*$//' -e 's/^minor_version=.*$//' -e 's/^creation.*$//' -e 's/^compatible.*$//' -e 's/^encoder=.*$//' <metadata.txt >metadata2.txt
avconv -y -i "${file}" -i metadata2.txt -ab 320k -map_metadata 1 -id3v2_version 3 "Mp3/${mp3File}"
done
Save it as 'convert.b', and then run the script by typing:
% bash convert.b
Related videos on Youtube
The Student
My main interests: Object Oriented Programming (mainly Java, Python and C++) Mobile development (Android and iOS) Artificial Neural Networks Philosophy
Updated on September 18, 2022Comments
-
The Student almost 2 years
I tried to convert an
.m4a
file to an.mp3
file usingffmpeg
with the following command:$ ffmpeg -i music.m4a music.mp3
Unfortunately, I got a zero byte-sized file returned as output. The output of the command is as follows:
FFmpeg version 0.6-4:0.6-2ubuntu6.2, Copyright (c) 2000-2010 the FFmpeg developers built on Sep 16 2011 17:11:24 with gcc 4.4.5 configuration: --extra-version=4:0.6-2ubuntu6.2 --prefix=/usr --enable-avfilter --enable-avfilter-lavf --enable-vdpau --enable-bzlib --enable-libgsm --enable-libschroedinger --enable-libspeex --enable-libtheora --enable-libvorbis --enable-vaapi --enable-pthreads --enable-zlib --enable-libvpx --disable-stripping --enable-runtime-cpudetect --enable-gpl --enable-postproc --enable-x11grab --enable-libdc1394 --enable-shared --disable-static WARNING: library configuration mismatch libavutil configuration: --extra-version=4:0.6-2ubuntu6.2 --prefix=/usr --enable-avfilter --enable-avfilter-lavf --enable-vdpau --enable-bzlib --enable-libgsm --enable-libschroedinger --enable-libspeex --enable-libtheora --enable-libvorbis --enable-vaapi --enable-pthreads --enable-zlib --enable-libvpx --disable-stripping --enable-runtime-cpudetect --enable-gpl --enable-postproc --enable-x11grab --enable-libdc1394 --shlibdir=/usr/lib/i686/cmov --cpu=i686 --enable-shared --disable-static --disable-ffmpeg --disable-ffplay libavcodec configuration: --extra-version=4:0.6-2ubuntu6.2 --prefix=/usr --enable-avfilter --enable-avfilter-lavf --enable-vdpau --enable-bzlib --enable-libgsm --enable-libschroedinger --enable-libspeex --enable-libtheora --enable-libvorbis --enable-vaapi --enable-pthreads --enable-zlib --enable-libvpx --disable-stripping --enable-runtime-cpudetect --enable-gpl --enable-postproc --enable-x11grab --enable-libdc1394 --shlibdir=/usr/lib/i686/cmov --cpu=i686 --enable-shared --disable-static --disable-ffmpeg --disable-ffplay libavformat configuration: --extra-version=4:0.6-2ubuntu6.2 --prefix=/usr --enable-avfilter --enable-avfilter-lavf --enable-vdpau --enable-bzlib --enable-libgsm --enable-libschroedinger --enable-libspeex --enable-libtheora --enable-libvorbis --enable-vaapi --enable-pthreads --enable-zlib --enable-libvpx --disable-stripping --enable-runtime-cpudetect --enable-gpl --enable-postproc --enable-x11grab --enable-libdc1394 --shlibdir=/usr/lib/i686/cmov --cpu=i686 --enable-shared --disable-static --disable-ffmpeg --disable-ffplay libavdevice configuration: --extra-version=4:0.6-2ubuntu6.2 --prefix=/usr --enable-avfilter --enable-avfilter-lavf --enable-vdpau --enable-bzlib --enable-libgsm --enable-libschroedinger --enable-libspeex --enable-libtheora --enable-libvorbis --enable-vaapi --enable-pthreads --enable-zlib --enable-libvpx --disable-stripping --enable-runtime-cpudetect --enable-gpl --enable-postproc --enable-x11grab --enable-libdc1394 --shlibdir=/usr/lib/i686/cmov --cpu=i686 --enable-shared --disable-static --disable-ffmpeg --disable-ffplay libavfilter configuration: --extra-version=4:0.6-2ubuntu6.2 --prefix=/usr --enable-avfilter --enable-avfilter-lavf --enable-vdpau --enable-bzlib --enable-libgsm --enable-libschroedinger --enable-libspeex --enable-libtheora --enable-libvorbis --enable-vaapi --enable-pthreads --enable-zlib --enable-libvpx --disable-stripping --enable-runtime-cpudetect --enable-gpl --enable-postproc --enable-x11grab --enable-libdc1394 --shlibdir=/usr/lib/i686/cmov --cpu=i686 --enable-shared --disable-static --disable-ffmpeg --disable-ffplay libswscale configuration: --extra-version=4:0.6-2ubuntu6.2 --prefix=/usr --enable-avfilter --enable-avfilter-lavf --enable-vdpau --enable-bzlib --enable-libgsm --enable-libschroedinger --enable-libspeex --enable-libtheora --enable-libvorbis --enable-vaapi --enable-pthreads --enable-zlib --enable-libvpx --disable-stripping --enable-runtime-cpudetect --enable-gpl --enable-postproc --enable-x11grab --enable-libdc1394 --shlibdir=/usr/lib/i686/cmov --cpu=i686 --enable-shared --disable-static --disable-ffmpeg --disable-ffplay libpostproc configuration: --extra-version=4:0.6-2ubuntu6.2 --prefix=/usr --enable-avfilter --enable-avfilter-lavf --enable-vdpau --enable-bzlib --enable-libgsm --enable-libschroedinger --enable-libspeex --enable-libtheora --enable-libvorbis --enable-vaapi --enable-pthreads --enable-zlib --enable-libvpx --disable-stripping --enable-runtime-cpudetect --enable-gpl --enable-postproc --enable-x11grab --enable-libdc1394 --shlibdir=/usr/lib/i686/cmov --cpu=i686 --enable-shared --disable-static --disable-ffmpeg --disable-ffplay libavutil 50.15. 1 / 50.15. 1 libavcodec 52.72. 2 / 52.72. 2 libavformat 52.64. 2 / 52.64. 2 libavdevice 52. 2. 0 / 52. 2. 0 libavfilter 1.19. 0 / 1.19. 0 libswscale 0.11. 0 / 0.11. 0 libpostproc 51. 2. 0 / 51. 2. 0 Input #0, mov,mp4,m4a,3gp,3g2,mj2, from 'music.m4a': Metadata: major_brand : M4A minor_version : 0 compatible_brands: M4A mp42isom Duration: 00:00:03.41, start: 0.000000, bitrate: 66 kb/s Stream #0.0(und): Audio: aac, 44100 Hz, mono, s16, 63 kb/s Output #0, mp3, to 'music.mp3': Stream #0.0(und): Audio: 0x0000, 44100 Hz, mono, s16, 64 kb/s Stream mapping: Stream #0.0 -> #0.0 Encoder (codec id 86017) not found for output stream #0.0
How can I convert an
.m4a
sound file to an.mp3
file format?-
Braden Best over 9 yearsInstall avconv and use this script: gist.github.com/bradenbest/cfba10c9df4b4c0daaab. You can also configure the
fformat
andtformat
vars to change what audio formats you're converting between. -
Aaron John Sabu about 4 yearsYour question was my answer :-D
-
-
The Student over 12 yearsGot (after many lines of text):
Unknown encoder 'libmp3lame' Error! Exiting
. With apt-get I can seelibmp3lame0
andlibmp3lame-dev
. I tried to install libmp3lame0, but nothing changed. -
jefe goode almost 12 yearsIf you don't want to compile ffmpeg: sudo apt-get install libavcodec-extra-53
-
HDave over 10 yearsIf you have your files tagged by MusicBrainz, then find another solution: bugs.launchpad.net/soundconverter/+bug/1174949
-
Denilson Sá Maia about 10 years
ffmpeg
has been replaced byavconv
in newer Ubuntu/Debian releases. See askubuntu.com/questions/432542/… and installlibav-tools
-
Peter Flynn over 9 yearsChrist on a crutch, what a mess. Soundconverter failed because Python was missing some packages, then it popped up an installer window for over 20 more packages, none of which it could install, of course, because it wasn't running as root, of course. Someone needs to rewrite the installer and the dependencies.
-
Peter Flynn over 9 yearsThis does not work because ffmpeg is not in the Ubuntu repos...and nor are avconv or libav-tools. Could whoever is in charge of audio software please stop footling around and settle on something stable?
-
Admin almost 9 yearsProgram does not load Ubuntu 14.04
-
krumpelstiltskin over 8 yearsthere is currently a bug in soundconverter related to m4a: bugs.launchpad.net/soundconverter/+bug/1512007
-
David Davies-Jones about 8 yearsFFMPEG is not deprecated. AvConv was a fork that decided to put that message in when somebody called it by the FFMPEG executable name
-
ctrl-alt-delor over 7 yearsI am trying to avoid messing around with the gui: I want to automate it.
-
Mark Slater over 7 yearsFor me, this is the top answer. A small point - the deletion can be expressed more succinctly as:
find . -type f -name '*.m4a' -delete
-
bomben over 6 yearsI modified the command by adding -y and -b:a 256k to make sure the program does not halt to ask for permission to overwrite existing mp3-files, and for a better quality (although I did not recognise a difference between the standard output of 128kbit/s (which was only half the bitrate my original m4a's had been): find . -type f -name '*.m4a' -exec bash -c 'avconv -i "$0" -y -b:a 256k "${0/%m4a/mp3}"' '{}' \;
-
Rom098 over 6 yearsThis is exactly what I'm looking for.
-
Eduardo Lucio over 6 years'EXT="mp4"' needs to be changed to 'EXT="m4a"' according to the question. I would add the following explanatory text to make the understanding simpler: '# EXAMPLE: Will convert all files in the current directory with extension # "m4a" to "mp3" # bash SCRIPT_NAME -b 256 -v'
-
Kevin Bowen over 5 yearsThis command can be used successfully by substituting 'ffmpeg' for 'avconv'.
-
Kevin Bowen over 5 yearsAs of 15.04, ffmpeg is back in the repos: webupd8.org/2014/11/ffmpeg-returns-to-official-ubuntu.html As of 18.04, libav-tools and avconv are no longer available.
-
Kevin Bowen over 5 yearsFYI. As of 18.04, libav-tools and avconv are no longer included in repos.
-
Radon Rosborough about 5 yearsJust using
ffmpeg
directly, as specified in the question, works fine for me with ffmpeg 4.1.3 on macOS 10.14.4. -
George Udosen about 5 yearskiller script, change the
avconv
toffmpeg
and that did the job. Please update the answer to include explanation for the various commands! -
davernator almost 4 yearsUpvote. It worked as-is. Nice script there as well (:-).
-
Giulia over 3 yearsOh thank you thank you...
-
Csaba Toth over 3 yearsI liked this one because I could easily parametrize
lame
. Somehow ffmpeg parametrization was a nightmare. For lame I just give-V 0
or-V 3
or something like that. -
fitojb about 3 yearsVery convenient! The only drawback I see is that this method seems to lose the metadata in the files, but I might have missed to check a box somewhere.