使用可变比特率 (VBR)

使用可变比特率 (VBR)

我有一大堆音频文件(大约 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使用什么价值观

FFmpeg 维基:MP3

-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

使用FFmpeg命令行版本。

MP3已正式停产(自 2017 年起) 和过时的编解码器(我希望它能尽快消亡)。互联网世界已经转向加气混凝土(更高效、更高质量的编解码器),每个人都应该使用它(而不是mp3):

ffmpeg -i filenameee.m4a -acodec copy output.aac

更新:尽管我不建议这样做,但不幸的是,一些低质量和过时的硬件开发商仍然生产使用这种格式的设备,mp3而且有些人仍然要求这种格式...Agrhhhh,它在这里:

ffmpeg -i filenameee.m4a -acodec libmp3lame -ab 256k output.mp3

答案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 审阅并更正脚本的一些细节(见评论)

相关内容