我有一大堆音频文件(大约 1000 个),想将它们从 m4a 转换为 mp3,以便可以在带有 USB 端口的 CD 播放器上播放它们。
我尝试做一些简单的事情:ffmpeg -i FILE.m4a FILE.mp3
但这似乎将比特率降低到一个非常低的值,这不是我想要的。
同样,我不想使用恒定比特率(例如 320k)进行转换,因为我正在转换的一些文件是 320k m4a,而有些文件的质量低至 96k m4a。
强制使用 320k 似乎毫无意义,因为有些文件会变得比需要的大很多倍。同样,将所有 320k 文件转换为远低于 96k 的大小而销毁也是毫无意义的。(目前,这些文件被转换为大约 50k。)
有人知道我该怎么做吗?我真正想做的是告诉 ffmpeg 将目录中的所有 m4a 文件转换为 mp3,同时尽可能保留当前音频质量。(当然可能会有一些额外的转换造成的损失有损到有损文件格式,高于从无损格式转换为有损格式时预期的水平。)
感谢您的帮助。如果这不可能,是否有某种脚本可以在单独转换文件时检测所需的质量?
附言:我正在使用英特尔 Mac,但也有一台 Ubuntu 盒子。
答案1
使用可变比特率 (VBR)
您可以使用-q:a
选项ffmpeg
创建可变比特率 (VBR) MP3 输出:
ffmpeg -i input.m4a -c:v copy -c:a libmp3lame -q:a 4 output.mp3
-q:a
使用什么价值观
-q:a
使用(或别名)控制质量-qscale:a
。值是编码器特定的,因此对于 libmp3lame 来说,范围是 0-9,其中值越低,质量越高。
- 0-3 通常会产生透明的结果
- 4(默认值)应接近感知透明度
- 6 通常可产生“可接受”的质量。
该选项
-q:a
映射到-V
独立lame
命令行界面工具中的选项。
您必须进行实验才能确定哪个值对您来说是可以接受的。另请参阅Hydrogen Audio:推荐的 LAME 编码器设置。
编码多个文件
在 Linux 和 macOS 中,您可以使用 Bash“for 循环”对目录中的所有文件进行编码:
$ mkdir newfiles
$ for f in *.m4a; do ffmpeg -i "$f" -codec:v copy -codec:a libmp3lame -q:a 2 newfiles/"${f%.m4a}.mp3"; done
答案2
答案3
这对我有用:
ffmpeg -i testing.m4v -b:a 192K -vn testing.mp3
答案4
@jbowman的回答多于是(在撰写本文时)唯一真正解决 OP 主要问题的方法,即在生成的 MP3 上保留原始 M4A 中的比特率(不多也不少)。他提供的脚本正是这样做的,依靠avprobe
从 M4A 中提取比特率,然后再实际转换为 MP3。
avprobe
遗憾的是,libav
图书馆,被认为是废弃软件,因为其上一次稳定发布是在 2018 年 2 月(2019 年初其 git 上有过一些更新)。
好消息是,你可以用avprobe
来替换ffprobe
— — 毕竟,它自带了ffmpeg
,所以你不需要为此添加额外的包。ffprobe
充其量,很难强制转换为正确的格式,但是,经过大量的谷歌搜索,我找到了一种解决方案,确实可以提取正确的比特率(至少对于 M4A 中的第一个流 — — 如果有很多,这可能不起作用):
ffprobe -v quiet -of flat=s=_ -show_entries format=bit_rate <source filename>
结果应该是这样的:
format_bit_rate="324440"
这需要一种略微不同(且更简单)的解析方式,因此我编写了自己的脚本来执行此操作,但有一点不同:就我而言,我的 Mac 上有很多专辑,其中一些是 M4A 格式的,需要转换为 MP3 格式才能播放我的低端汽车音响播放器。至少有无数工具可以做到这一点,有些甚至只是基于 GUI 的前端,ffmpeg
但没有什么比“掌控一切”并从中做到这一点更好的了bash
!
因此,复制并粘贴下面的脚本,将其放入文件中,添加所需的chmod +x file-name-chosen-for-the-script
,然后让它运行,通过使用单个参数调用它,该参数是 M4A 文件集合所在的目录。就像 @jbowman 一样,我将转换后的文件放在目录中mp3s/
,但有一个变化:它将专辑名称添加为额外的子目录(基本上是提供给脚本的目录的最后一个元素)——因此所有内容将再次按专辑名称分组 :)
#!/usr/bin/env bash
# Takes a directory as parameter and converts everything inside it
# from M4A to MP3, respecting the bitrate, and creating a directory
# for the converted files.
#
# Based on https://superuser.com/a/1211902/127382 by @jbowman (2017)
if [ -d "${1}" ]
then
echo "Doing conversions from directory \"${1}\"..."
else
echo "Source directory not found! Please add it as a parameter, e.g.:"
echo " ${0} path/to/album/containing/mp3/files"
exit 1
fi
# Get the album's name from the first parameter
ALBUM_PATH="${1}"
ALBUM=$()basename "${ALBUM_PATH}")
echo "Attempting to process album \"${ALBUM}\" in source directory
\"${ALBUM_PATH}\"..."
# Create a directory for this run
mkdir -p "mp3s/${ALBUM}"
# Check if mkdir succeeded
if [[ $? -ne 0 ]]
then
echo "Could not create directory mp3s/${ALBUM} for output. Exiting..."
exit 2
fi
# Loop across the filnames in that directory that end in *.m4a, invoke
# ffprobe to extract the bitrate, then use ffmpeg to convert it into MP3
# and place the result inside the mp3s/${ALBUM}/ directory:
for f in "${ALBUM_PATH}"/*.m4a
do
echo "Before ffprobe... testing ${f}"
bitrate=$(ffprobe -v quiet -of flat=s=_ -show_entries format=bit_rate "${f}" | sed 's/[^0-9]*//g')
new_filename=$(basename "${f}" .m4a).mp3
echo "Reading ${f} and writing to mp3s/${ALBUM}/${new_filename} with bitrate ${bitrate}..."
# echo ffmpeg -y -i "${f}" -codec:a libmp3lame -b:a "${bitrate}" -q:a 2 "mp3s/${ALBUM}/${new_filename}"
ffmpeg -y -i "${f}" -codec:a libmp3lame -b:a "${bitrate}" -q:a 2 "mp3s/${ALBUM}/${new_filename}"
done
待办事项:允许将多个目录作为命令行参数,从而允许在整个音乐库(1000 首歌曲!)中运行长批处理,并根据专辑名称正确组织它们。当前脚本仅适用于一目录(没有通配目录名称,否则结果将无法预测 - 这是一个公平的警告!)。
警告:某些 M4A真的有一个非常高比特率,并且ffmpeg
对此有点抱怨——毕竟,MP3 规范将最大比特率定义为 320 Kbps,而 192 Kbps(可变比特率)实际上是人类在 MP3 提供的有损压缩下可以听到的“最佳”值尽管 LAME 据称可以达到 640 Kbps,但这种 MP3 无论如何都无法通过普通的低技术设备播放。
ffmpeg
但仍然进行转换,并且限制为 320 Kbps(根据规格)
脚本也可用作要旨。
更新:感谢@mashuptwice 审阅并更正脚本的一些细节(见评论)