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

Moi*_*phy 10 command-line music mp3 lame

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

我需要能够进入一个目录,扫描任何 320kbps 的子目录并转换为 192kbps 并在找到时覆盖。Lame 甚至是最好的工具吗?

谢谢

evi*_*oup 12

lame非常适合这项任务,但我将使用ffmpegandffprobe来回答这个问题,因为我了解它们就像我的手背一样,因为它们不仅可以推广到 MP3。首先:

sudo apt-get install ffmpeg
Run Code Online (Sandbox Code Playgroud)

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

ffmpeg -i file.mp3 -c:a libmp3lame -b:a 192k temp.mp3
mv temp.mp3 file.mp3
Run Code Online (Sandbox Code Playgroud)

您可以将这些组合成一行:

ffmpeg -i file.mp3 -c:a libmp3lame -b:a 192k temp.mp3 && mv temp.mp3 file.mp3
Run Code Online (Sandbox Code Playgroud)

&&存在意味着该mv命令将不被执行,除非ffmpeg为0的状态退出(这意味着成功)。

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

ffprobe -show_streams -select_streams a:0 -v quiet file.mp3 | grep -F 'bit_rate=320000'
Run Code Online (Sandbox Code Playgroud)

-show_streams告诉ffprobe显示有关单个流的信息;-select_streams告诉它选择哪些a:0意思是“第一个音频流(这对于封面艺术的 MP3 文件很重要,它被存储为视频流)。管道 ( |) 获取 的标准输出ffprobe并将其提供给grepgrep将只打印那些匹配给定模式的行——在这种情况下,包含字符串的行bit_rate=320000。如果你在 320k kbps MP3 上运行它,你会得到这样的一行:

bit_rate=32000
Run Code Online (Sandbox Code Playgroud)

如果你以不同的比特率运行它,你根本不会得到任何输出;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
Run Code Online (Sandbox Code Playgroud)

或者,更易读一点:

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
Run Code Online (Sandbox Code Playgroud)

这只会对 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
Run Code Online (Sandbox Code Playgroud)

这不会进入子目录;为此,您必须设置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
Run Code Online (Sandbox Code Playgroud)

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"' '{}' \;
Run Code Online (Sandbox Code Playgroud)

所有这些都将严格按顺序运行——它们一次只转换一个文件。不过,您的处理器几乎肯定能做到更多;为了加快速度,您可以使用 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
Run Code Online (Sandbox Code Playgroud)

或者:

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 {}' 
Run Code Online (Sandbox Code Playgroud)


小智 3

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

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

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

exiftool -AudioBitrate File.mp3 
Run Code Online (Sandbox Code Playgroud)

但你仍然需要一种方法来通过管道查找 mp3 文件、检查比特率和转换的命令...