我有几千个 MP3 文件,它们都是混合比特率的。
我想运行一个可以批量编码为 128 kbps 的程序。有没有适用于 Windows 的合适且免费的解决方案?
答案1
很简单:这是一个免费的:http://winff.org
运行它并添加所有文件,然后转到选项按钮和音频设置选项卡并将音频比特率更改为 128。
它会花一点时间,然后会出现一个命令提示符,它会使用 ffmpeg 来发挥它的魔力
高级:如果您使用命令行,您可以下载 ffmpeg并使用以下命令行转换文件:
ffmpeg -i source.mp3 -vn -ar 44100 -ac 2 -ab 128 -f mp3 output.mp3
如果将其放入批处理文件中,则可以一次转换一大堆。我的看起来像这样:
---convert.bat----
set formats=*.mp4 *.flv
set presets=-vn -ar 44100 -ac 2 -ab 192k -vol 400 -f mp3
set outputext=mp3
for %%g in (%formats%) do start /b /wait "" "%~dp0bin\ffmpeg.exe" -i "%~dp0%%g" %presets% "%~dp0%%~ng.%outputext%" && TITLE "Converted: "%%g
--end---
答案2
我嫂子家里的电脑里有大约 9GB 的音乐,她总是把电脑搞坏。然后我就得过来把音乐传输到笔记本电脑上,然后重新格式化后再传输回来。她不会注意到 256 kbps 和 128 kbps 之间的质量差异,而且她音乐收藏的传输时间几乎缩短了一半。
我认为你的问题不是转换 mp3,而是从你嫂子的机器快速恢复的过程。
因此,我建议如下:
- 创建另一个分区(
D:
例如)。C:
是你安装操作系统的地方(我假设它是Windows)和D:
是您保存所有个人文件的地方。可以将“我的文档”移动到另一个文件夹。 - 格式化机器后,创建一个重影从
C:
驱动器中,并使用它录制 DVD 或存储在D:
分区上。(您可以尝试 Ghost 的 OSS 替代品,名为克隆兹拉也)
当你嫂子把机器弄坏时,你只需要在 C: 盘中恢复 Ghost Image(10 分钟内)。D: 中的所有文件都完好无损。
(如果你不喜欢我的建议,仍然想重新编码 mp3,你可以使用foobar2000,一个免费的 Windows 音频播放器(它也可以转换文件)应用程序。)
答案3
我使用的是 dbPowerAmp。它有 21 天的全功能试用版,可以批量处理所有内容。
答案4
在 9 GB 上,这将花费很长时间,但我使用的一种简单方法是遍历文件夹结构,找到 mp3,然后将任何尚未达到 128kbps 的文件放入ffmpeg
需要安装的路径中。我在 Windows 上测试过这个,但还没有与任何工业级解决方案进行过基准测试。使用时请自担风险——它会破坏原始文件。
为了提高速度,您可以在 Perl 脚本中或手动为每个可用核心分叉几个进程,并在文件夹/文件的子集上运行每个进程,因为该任务是高度并行的。
# Convert files to mp3 recursively using ffmpeg, destroying originals
use strict;
use warnings;
use File::Copy;
use File::Find;
my $verbose = 0;
my $target_bitrate = 128;
# any mp3s above this bitrate will be converted to $target_bitrate
my $threshold_bitrate = 128;
sub process {
if (-f $_ && $_ =~ /\.mp3$/) {
my $file = $_;
my $info = `ffmpeg -i \"$file\" 2>&1`;
$info =~ /^\s*Stream.+Audio: mp3.+?(\d+) kb\/s$/m;
return if $1 <= $threshold_bitrate;
print "$file\n" if $verbose;
my $cmd = "ffmpeg -i \"$file\" -hide_banner -loglevel warning -vn ".
"-write_id3v1 1 -id3v2_version 3 ".
"-b:a ${target_bitrate}k \"____$file\"";
system($cmd) == 0 or die "$0: [$cmd] failed: $?\n";
move("____$file", $file) or die "move failed: $!";
}
}
find(\&process, $ARGV[0] || ".");