Answers:
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
的&&
存在意味着该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
并将其馈送到grep
。grep
将仅打印与给定模式匹配的行-在这种情况下,将包含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
这不会进入子目录;为此,您必须设置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 {}'
Unrecognized option 'select_streams' Failed to set value 'a:0' for option 'select_streams'
avconv -i {} -b:a 192k {.}.temp.mp3 && mv {.}.temp.mp3 {}