正如标题所述。我有许多 320kbps 格式的 MP3,需要将其转换为 192kbps。目前我正在使用lame --mp3input -b 192
它来创建一个同名文件,但带有额外的 .mp3 扩展名。所以我最终得到了foo.mp3.mp3
。
我需要能够进入一个目录,扫描子目录中的任何 320kbps 并转换为 192kbps 并覆盖(如果发现)。Lame 是实现此目的的最佳工具吗?
谢谢
答案1
lame
非常适合这项任务,但我将使用ffmpeg
和ffprobe
来回答这个问题,因为我对它们了如指掌,而且它们可以推广到不仅仅是 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
并将其馈送到grep
。grep
将仅打印与给定模式匹配的行 - 在本例中,包含字符串 的行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 有效。用几个测试文件试试。
下一步是让它处理多个文件。有两种标准方法可以做到这一点:循环for
和find
命令。以下内容将对目录中的每个 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
这不会进入子目录;为了这样做,您必须设置globstar
shell 选项:
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 文件、检查比特率和转换的命令...