Lame - 如何将所有 320kbps mp3 重新编码为 192kbps mp3

Lame - 如何将所有 320kbps mp3 重新编码为 192kbps mp3

正如标题所述。我有许多 320kbps 格式的 MP3,需要将其转换为 192kbps。目前我正在使用lame --mp3input -b 192它来创建一个同名文件,但带有额外的 .mp3 扩展名。所以我最终得到了foo.mp3.mp3

我需要能够进入一个目录,扫描子目录中的任何 320kbps 并转换为 192kbps 并覆盖(如果发现)。Lame 是实现此目的的最佳工具吗?

谢谢

答案1

lame非常适合这项任务,但我将使用ffmpegffprobe来回答这个问题,因为我对它们了如指掌,而且它们可以推广到不仅仅是 MP3。首先:

sudo apt-get install ffmpeg

据我所知,没有哪个工具可以读取媒体文件然后直接覆盖输入:您需要使用中间文件。对于单个文件,您可以执行以下操作:

ffmpeg -i file.mp3 -c:a libmp3lame -b:a 192k temp.mp3
mv temp.mp3 file.mp3

您可以将它们合并为一行:

ffmpeg -i file.mp3 -c:a libmp3lame -b:a 192k temp.mp3 && mv temp.mp3 file.mp3

这里&&的意思是,除非以状态 0(表示成功)退出,mv否则不会执行命令。ffmpeg

要检查文件的比特率,您可以使用ffprobe

ffprobe -show_streams -select_streams a:0 -v quiet file.mp3 | grep -F 'bit_rate=320000'

-show_streams告诉ffprobe显示有关各个流的信息;-select_streams告诉它哪个选择的,和a:0表示“第一个音频流(这对于 MP3 文件的封面很重要,因为封面以视频流的形式存储)。管道 ( |) 接收 的标准输出ffprobe并将其馈送到grepgrep将仅打印与给定模式匹配的行 - 在本例中,包含字符串 的行bit_rate=320000。如果您在 320k kbps MP3 上运行此命令,您将得到如下一行:

bit_rate=32000

如果您在任何具有不同比特率的东西上运行它,您将不会得到任何输出;grep 将无法匹配,并以状态 1 退出。这意味着您可以将该命令与 ffmpeg 命令链接起来:

ffprobe -show_streams -select_streams a:0 -v quiet file.mp3 | grep -F 'bit_rate=320000' && ffmpeg -i file.mp3 -c:a libmp3lame -b:a 192k temp.mp3 && mv temp.mp3 file.mp3

或者,更易读一点:

ffprobe -show_streams -select_streams a:0 -v quiet file.mp3 | grep -F 'bit_rate=320000' &&
ffmpeg -i file.mp3 -c:a libmp3lame -b:a 192k temp.mp3 &&
mv temp.mp3 file.mp3

这只对 320 kbps MP3 有效。用几个测试文件试试。

下一步是让它处理多个文件。有两种标准方法可以做到这一点:循环forfind命令。以下内容将对目录中的每个 MP3 起作用:

for f in *.mp3; do 
ffprobe -show_streams -select_streams a:0 "$f" | grep -F 'bit_rate=320000' &&
ffmpeg -y -i "$f" -c:a libmp3lame -b:a 192k /tmp/temp.mp3 && mv /tmp/temp.mp3 "$f"
done

这不会进入子目录;为了这样做,您必须设置globstarshell 选项:

shopt -s globstar
for f in **/*.mp3; do
ffprobe -show_streams -select_streams a:0 "$f" | grep -F 'bit_rate=320000' &&
ffmpeg -y -i "$f" -c:a libmp3lame -b:a 192k /tmp/temp.mp3 && mv /tmp/temp.mp3 "$f"
done

find

find . -name '*.mp3' -exec sh -c 'ffprobe -show_streams -select_streams a:0 "$0" | grep -F "bit_rate=320000" &&
ffmpeg -y -i "$0" -c:a libmp3lame -b:a 192k /tmp/temp.mp3 && mv /tmp/temp.mp3 "$0"' '{}' \;

所有这些将严格按顺序运行 —— 它们一次只能转换一个文件。不过,您的处理器几乎肯定能够处理更多文件;为了加快速度,您可以使用 GNU parallel

sudo apt-get install parallel
shopt -s globstar
parallel 'ffprobe -show_streams -select_streams a:0 {} | grep -F "bit_rate=320000" &&
ffmpeg -y -i {} -c:a libmp3lame -b:a 192k {.}.temp.mp3 && mv {.}.temp.mp3 {}' ::: **/*.mp3

或者:

find . -name '*.mp3' | parallel 'ffprobe -show_streams -select_streams a:0 {} | grep -F "bit_rate=320000" &&
ffmpeg -y -i {} -c:a libmp3lame -b:a 192k {.}.temp.mp3 && mv {.}.temp.mp3 {}' 

答案2

Lame是你能找到的最好的完成这项任务的方法之一

您可以使用命令lame -b 192 input.mp3 output.mp3

我不擅长使用管道命令,但你可以使用它exiftool来获取 mp3 文件的比特率

exiftool -AudioBitrate File.mp3 

但是您仍然需要一种方法来传输查找 mp3 文件、检查比特率和转换的命令...

相关内容