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


9

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

我需要能够输入目录,扫描子目录中的任何320kbps并转换为192kbps并覆盖(如果找到)。Lame甚至是最好的工具吗?

谢谢

Answers:


12

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

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

要检查文件的比特率,可以使用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将仅打印与给定模式匹配的行-在这种情况下,将包含string的行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

这不会进入子目录;为此,您必须设置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 {}' 

壮观的答案。我已经用la脚将某些东西拼凑在一起,但我会在此之前给出。将会回报。
Moif Murphy 2014年

我收到此错误: Unrecognized option 'select_streams' Failed to set value 'a:0' for option 'select_streams'
Moif Murphy

使用avconv,将其替换为:avconv -i {} -b:a 192k {.}.temp.mp3 && mv {.}.temp.mp3 {}
lepe

2

Lame 是执行此任务的最佳工具之一

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

我不太适合使用管道命令,但可以exiftool用来获取mp3文件的比特率

exiftool -AudioBitrate File.mp3 

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


编辑了两次,修复了命令并增加了比特率
AdigaJo
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.