如何从node.js应用程序中检测损坏/不完整的MP3文件



MP3文件的完整性不正确时的常见情况是文件已部分上载到服务器。在这种情况下,指示的音频持续时间与MP3文件中的实际内容不一致:我们可以听到开头,但在某个时候播放停止,音频播放器的指示持续时间被破坏。

我尝试了node-ffprobe之类的库,但它们似乎只是读取元数据,而没有与文件中的真实音频数据进行比较。有没有一种方法可以有效地检测node.js中损坏或不完整的MP3文件?

注意:上传MP3文件的客户端是一个硬件(录音机(,在FTP服务器上上传文件。不是浏览器。因此,我无法从客户端上传可能更有用的数据。

MP3文件通常没有持续时间。它们只是一系列MPEG帧。有时,会有一个ID3标签指示持续时间,但并非总是如此。

玩家可以通过选择以下几种方法之一来确定持续时间:

  • 解码整个音频文件
    这是最慢的方法,但如果你无论如何都要解码文件,你最好走这条路,因为它会给你一个确切的持续时间
  • 阅读整个文件,略读帧头
    您必须从磁盘读取整个文件,但不必对其进行解码。如果I/O速度很慢,则可能会很慢,但会给您一个确切的持续时间
  • 读取第一帧的比特率,并根据文件大小估计持续时间
    绝对是最快的方法,也是玩家最常用的方法。持续时间只是一个估计,对于CBR来说是相当准确的,但对于VBR来说可能非常不准确

我得到的是,这些文件实际上可能没有被破坏。它们可能只是你的播放器不知道持续时间的VBR文件。

如果你确信它们被破坏了(比如在内容中间停下来(,那么你必须弄清楚你想如何处理它。可能只有几种方法可以确定这一点:

  • 理想情况下,有一个ID3标记指示持续时间,您可以解码整个文件并确定其实际持续时间进行比较
  • 通常,ID3标记不存在,所以您必须检查最后一帧是否完整

除此之外,您真的没有一个很好的方法来知道流是否不完整,因为没有一个外部容器可以实际指定预期的帧数。

根据持续时间和编码计算mp3文件大小的表达式非常简单:

x = length of song in seconds
y = bitrate in kilobits per second
(x * y) / 1024 = filesize (MB)

在同一个问题的另一个答案中,还有WebAudio API的javascript实现。也许这在Node实现中会很有用。

mp3diags是一些较老的用于修复mp3的开源软件,非常适合批量处理这样的东西。源代码是c++,如果你觉得多管闲事,想看看这些功能是如何实现的,它仍然可用。

值得一看,因为它有一些功能可能在您的环境中有用:

什么是MP3诊断,它有什么作用

  • 低质量音频
  • 缺少VBR标头
  • 缺少规范化数据
  • 更正显示歌曲持续时间不正确的文件
  • 更正玩家无法正确查找的文件

最新更新