如何将m4a音频文件转换为mp3?

我尝试使用以下命令将一个.m4a文件转换为一个.mp3文件,使用的工具是ffmpeg:
$ ffmpeg -i music.m4a music.mp3

很不幸,我得到了一个大小为零字节的文件作为输出返回。命令的输出如下所示:
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

如何将一个 .m4a 声音文件转换为 .mp3 文件格式?

1安装avconv并使用此脚本:https://gist.github.com/bradenbest/cfba10c9df4b4c0daaab。您还可以配置`fformat`和`tformat`变量以更改要转换的音频格式。 - Braden Best
1你的问题就是我的答案 :-D - Aaron John Sabu
请注意,提问者的问题在Ubuntu 20.04上如预期般正常运行,如下所答:https://askubuntu.com/users/165216/eamonn-kenny。 - DaReal
12个回答

简单的方法是:
ffmpeg -v 5 -y -i input.m4a -acodec libmp3lame -ac 2 -ab 192k output.mp3

如果你想要一个用来包装的脚本,可以试试aac2mp3,这个对你应该有用。(最后一句的语法是从那里引用过来的。)以下是内联代码:
#!/bin/bash
#
# $Id: aac2mp3,v 1.2  03/30/2008 10:00 Daniel Tavares (dantavares@gmail.com) - 
# 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

1在安装过程中出现了错误信息:Unknown encoder 'libmp3lame' Error! Exiting。通过使用apt-get命令,我发现了libmp3lame0libmp3lame-dev这两个软件包。我尝试安装了libmp3lame0,但是问题依然存在,没有任何改变。 - The Student
1еңЁиҫғж–°зҡ„Ubuntu/DebianзүҲжң¬дёӯпјҢffmpegе·Іиў«avconvеҸ–д»ЈгҖӮиҜ·еҸӮиҖғhttp://askubuntu.com/questions/432542/is-ffmpeg-missing-from-the-official-repositories-in-14-04并е®үиЈ…`libav-tools`гҖӮ - Denilson Sá Maia
这个不起作用是因为Ubuntu软件仓库中没有ffmpeg,也没有avconv或libav-tools。能负责音频软件的人请停止胡闹,选择一个稳定的解决方案好吗? - Peter Flynn
根据问题,需要将'EXT="mp4"'更改为'EXT="m4a"'。为了使理解更简单,我会添加以下说明性文本: '# 示例:将当前目录中所有扩展名为"m4a"的文件转换为"mp3"

bash SCRIPT_NAME -b 256 -v'

- Eduardo Lucio
1截至15.04版本,ffmpeg已重新加入软件仓库:http://www.webupd8.org/2014/11/ffmpeg-returns-to-official-ubuntu.html 从18.04版本开始,libav-tools和avconv不再可用。 - Kevin Bowen
点赞。它原样运行了。脚本也很棒(:-)。 - davernator
使用sudo apt install ffmpeg命令来安装。 - MeSo2

这对我在Ubuntu 14.04上有效:
avconv -i input.m4a ouptut.mp3

为了获取avconv命令,请安装libav-tools Install libav-tools
sudo apt-get install libav-tools

18FFMPEG并没有被弃用。AvConv是一个分支,当有人使用FFMPEG可执行文件名来调用它时,它决定显示这个消息。 - David Davies-Jones
2鉴于18.04版本,libav-tools和avconv不再包含在仓库中。 - Kevin Bowen
1只需直接使用指定的ffmpeg,在我的macOS 10.14.4上,ffmpeg 4.1.3可以正常工作。 - Radon Rosborough

SoundConverter 可以在不必在命令行上瞎折腾的情况下完成这个任务,并且它可以在 Ubuntu 软件中心中获取:

Install via the software center

soundcoverter main window and prefs

conversion inprogress


如果您的文件已经由MusicBrainz标记,请寻找其他解决方案:https://bugs.launchpad.net/soundconverter/+bug/1174949 - Dave
3天哪,这真是一团糟。Soundconverter因为缺少一些Python包而失败了,然后弹出了一个安装程序窗口,要求安装超过20个包,当然,由于没有以root权限运行,所以它当然无法安装任何一个包。有人需要重新编写安装程序和依赖项。 - Peter Flynn
程序无法加载Ubuntu 14.04。 - user200348
目前SoundConverter在处理m4a文件时存在一个错误:https://bugs.launchpad.net/soundconverter/+bug/1512007 - krumpelstiltskin
6我正在尝试避免与图形用户界面(GUI)纠缠不清:我想要自动化它。 - ctrl-alt-delor

我需要一个替代方案,因为: - 我的文件存放在递归子目录中 - 路径中有空格。
所以最终我选择了:
 find . -type f -name '*.m4a' -exec bash -c 'avconv -i "$0" "${0/%m4a/mp3}"' '{}' \;

然后删除原始文件:
find . -type f -name '*.m4a' -exec bash -c 'rm "$0"' '{}' \;

4对我来说,这是最佳答案。一个小细节 - 删除操作可以更简洁地表达为:find . -type f -name '*.m4a' -delete - Mark Slater
4我通过添加-y和-b:a 256k来修改了命令,以确保程序不会停止询问是否覆盖现有的mp3文件,并获得更好的音质(尽管我没有注意到标准输出128kbit/s与我原始m4a文件一半比特率之间的差异):find . -type f -name '*.m4a' -exec bash -c 'avconv -i "$0" -y -b:a 256k "${0/%m4a/mp3}"' '{}' ; - bomben
4可以通过将“avconv”替换为“ffmpeg”成功地使用此命令。 - Kevin Bowen

在Ubuntu 20.04中,原始命令可以直接使用:
ffmpeg -i music.m4a music.mp3

2这是对于在Ubuntu 20.04(以及可能更新的版本)上运行ffmpeg的任何人来说最好的答案。 - DaReal
这对我来说有效,使用的是Debian 10 (buster)上的ffmpeg version 4.1.6-1~deb10u1版本。 - Kyle

我创建了一个脚本来完成这个任务。
我的要求是:
- 必须尽可能保留所有标签 - 如果存在专辑封面,必须保留 - 必须是320K的mp3文件
该脚本适用于目录中的所有m4a文件,并将新的闪亮Mp3文件输出到脚本创建的名为Mp3的文件夹中。警告:如果输出文件夹中存在同名的Mp3文件,该脚本会覆盖它们。还使用文件'metadata.txt'和'metadata2.txt'作为临时文件。
如果尚未安装avconv,您需要先安装它。
我无法找到如何将“年份”标签持久保存到ID3v1标签中,所以我没有启用该选项。
#!/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

将其保存为'convert.b',然后通过键入以下命令来运行脚本:
% bash convert.b

这正是我正在寻找的。 - Rom098
杀手脚本,将avconv更改为ffmpeg就可以了。请更新答案,包括对各个命令的解释! - George Udosen

老问题,但我没有看到一个非常简单的解决方案:使用VLC

在VLC中,您可以加载一个.m4a文件并将其转换为.MP3非常简单。

  1. 打开VLC(不需要加载任何文件)

  2. 点击媒体或按CTRL+R

  3. 点击转换/保存

  4. 配置文件中选择MP3

  5. 选择目标位置

  6. 点击开始并等待。要知道它是否正在执行操作, 请查看时间条。

希望这对某人有用。


非常方便!我唯一看到的缺点是这种方法似乎会丢失文件中的元数据,但可能是我漏掉了某个选项框。 - fitojb

有时候avconv和ffmpeg的工作并不那么顺利,所以:
sudo apt-get install faad lame
faad myfile.m4a -w | lame - myfile.mp3

总是对我有效。

哦,谢谢谢谢... - Giulia
我喜欢这个,因为我可以很容易地对lame进行参数化。不知何故,ffmpeg的参数化过程真是一场噩梦。对于lame,我只需要给出-V 0-V 3之类的参数就行了。 - Csaba Toth


1如果你不想编译ffmpeg:sudo apt-get install libavcodec-extra-53 - z7sg

在我的L-Ubuntu上,libav-tools不可用。我安装了winffsudo apt-get install winff 它提供了一个图形化工具,可以将音频和视频文件转换成多种不同的格式。
刚试了一下:对于.m4a.mp3,效果很好 :-)
另外,vlc也可以很好地播放.m4a文件: sudo apt-get install vlc