我如何全面地确定 mp3 文件的音频数据是否被截断/裁剪/缩短?

我如何全面地确定 mp3 文件的音频数据是否被截断/裁剪/缩短?

我有一堆 mp3 文件,其中一些被截断了(由于未完成下载或其他原因)。我想确定哪些是好的,哪些是坏的(即那些在中间被截断的)。相关问题的答案列出了几种可能性,例如

使用元数据来确定长度是否与预期不符(并查找和纠正其他错误)。有几个工具可以用于此目的,例如mp3valmp3checkmp3diags(我可以通过 Ubuntu 存储库获得它们apt-get,它们看起来很有前途且易于使用),以及将死(我没尝试过)。

然而,这些方法对我而言都不起作用,因为显然所有文件似乎都有元数据错误。因此,我不得不手动收听每段音频的结尾,看看它是否正确结束或明显被缩短了。有没有办法可以自动对大量文件执行这样的操作(监听突然的声音中断)?

我找到了至少一种方法(我将把它作为答案发布)。显然,整个方法都是基于一个假设,并且取决于所讨论的 mp3 文件的性质 - 即它们是否应该以静音结束。但是,我预计对于大多数遇到这个普遍问题的人来说,情况都是如此,因此这似乎是一种有用的方法,可供其他可能遇到同样问题的人检查和发布。

答案1

我发现命令行应用程序sox(已安装在我的 ubuntu 机器上 - 可能由我的一个音频应用程序内部使用)可以为您提供有关“响度”(振幅等)的统计数据。它还可以修剪文件并执行许多其他操作。最重要的是,它允许您将命令串联在一起 - 例如将文件修剪到最后半秒左右并查看振幅统计数据。为此,您可以执行以下操作:

sox file.mp3 -n trim -0.5 stat

如果文件以静音结束,则报告的“最大振幅”值应接近于零,否则应在 0 到 1 之间。添加几个命令(在 linux/bash 中)以提取此数字:

sox file.mp3 -n trim -0.5 stat 2>&1 | grep 'Maximum amplitude' | sed 's/.* //g'

我添加了 2>&1 来隐藏一些sox我不关心的警告和错误行。最后,为了做出判断,您可以将此数字与合理的阈值进行比较(例如,在我的情况下,.1 似乎效果很好)。在大量文件上自动执行此操作可能看起来像这样:

for f in $(ls *.mp3); 
    do echo $f:; 
    end_amp=$(sox $f -n trim -0.5 stat 2>&1 | grep 'Maximum amplitude' | sed 's/.* //g');
    python -c "print('bad' if $end_amp>0.1 else 'good')"; 
done

对我来说,这个程序在 300 多个文件上运行了几秒钟,并且可以轻松修改以根据需要移动或删除坏文件。我过去常常python进行浮点数比较,因为在 bash 中似乎没有更简单的方法来执行此操作。由于某种原因,它在几个文件上失败了(我认为这些文件几乎完全是空的,所以sox什么都没有得到 - 但这些类型的文件可以通过文件大小阈值来捕获)。它对大多数文件都有效。

这是一行代码,可以复制/粘贴到终端中。只需在怀疑有坏文件的文件夹中运行即可:

for f in $(ls *.mp3); do echo $f:; a=$(sox $f -n trim -0.5 stat 2>&1 | grep 'Maximum amplitude' | sed 's/.* //g'); python -c "print('bad' if $a>0.1 else 'good')"; done

相关内容