如何修复错误的mp3时长?

我的音乐库中有很多歌曲的播放时长显示不正确,在Clementine中只能部分播放。在Banshee和其他一些播放器中,它们显示不同的时长,并且有时可以完整播放。
有没有办法修复这个问题,而不必“重新编码”这首歌?
4个回答

MP3 Diags可以修复不正确的时长(和其他错误)。它是开源的,并且在存储库中可以找到。它是一个图形用户界面工具。

安装

sudo apt-get install mp3diags mp3diags-doc

另一个选择是MP3val, 可以通过命令行或图形界面使用: 安装
sudo apt-get install mp3val

使用示例

mp3val damaged.mp3 -f -t

-f:修复错误, -t:保留原始时间戳


这对我很有效。我使用cat命令将有声读物的各个部分合并成一个文件(cat 1.mp3 2.mp3 > out.mp3),这在播放时效果非常好,但几乎每个播放器都会对时间戳产生问题,甚至mediainfo显示的持续时间也是来自第一个文件而不是合并后的文件。 - blockloop
1猫对于合并MP3这样的任务来说并不是最理想的选择。一个更好的方法是参考以下链接:http://superuser.com/questions/314239/how-to-join-merge-many-mp3-files - phoibos
你为什么这样认为呢?MP3文件本质上只是原始流,它们几乎是cat命令的完美选择,除了一些微不足道的副作用,可以通过简单重新评估Xing头数据来解决。即使没有经过mp3val处理,这些文件在我测试的每个播放器中仍然可以正常播放。相比使用ffmpeg重新编码,cat命令非常高效且速度更快,即使加上mp3val命令也是如此。 - blockloop
3使用ffmpeg命令结合concat-acodec copy选项时,不会重新编码音视频流,而是直接复制流(因此速度很快),但会在第一次创建文件时确保生成正确的文件(避免在结果文件中出现多次无用的头部和标签数据)。 - phoibos

如果您不想安装任何新软件,可以尝试使用ffmpeg

ffmpeg -i file_orig.mp3 -acodec copy file_fixed.mp3

2完美解决方案,即使由ffmpeg自身创建了错误的mp3文件也能工作! - Pierpaolo Cira
1这对我来说确实有效,当mp3valmp3check的解决方案无效时。(只是为了确认,它不会重新编码,对吗?) - Noldorin
2使用-acodec copy参数,它不会重新编码。如果你想验证一下,可以尝试使用和不使用该参数,并检查速度有多快。 - Alcaro

除了VBR头与实际音频不匹配(你可以使用mp3val进行修正,如其他答案中所提到的),导致这种情况的另一个原因是MP3文件具有ID3标签,其中TLEN标签的值不正确。你可以使用mutagen软件包中的mid3v2工具来修复此问题,删除该标签(显然它是可选的)。
$ mid3v2 --delete-frames=TLEN filename.mp3

音乐播放器Quodlibet还有一个方便的 "修复MP3时长" 插件,您可以使用它来完成这个操作。

(取自Quodlibet常见问题解答页面:http://quodlibet.readthedocs.org/en/latest/guide/faq.html)


mp3check对我来说也完美地支持通配符。
sudo apt-get install mp3check

mp3check {filename or wildcard} --cut-junk-start --cut-junk-end --fix-headers

当Windows媒体播放器显示错误的MP3文件时,我提供了帮助。 - Mantas D
警告 如果您有id3v2标签、封面艺术等,请非常注意这些问题(我吃了亏)https://bugs.launchpad.net/ubuntu/+source/mp3check/+bug/592775 https://bugs.launchpad.net/ubuntu/+source/mp3check/+bug/1348223 - digitaltoast