我如何从 node.js 应用程序检测 corrupt/incomplete MP3 文件?

How can I detect corrupt/incomplete MP3 file, from a node.js app?

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)

在关于 的另一个答案中,还有一个 javascript 网络音频 API 的实现。也许这对您的 Node 实现很有用。

mp3diags 是一些用于修复 mp3 的较旧的开源软件,非常适合像这样的批处理。源代码是 c++,如果您觉得多管闲事并想了解其中一些功能是如何实现的,仍然可以使用。

值得一看,因为它具有一些可能对您的上下文有用的功能:

What is MP3 Diags and what does it do?

  • low quality audio
  • missing VBR header
  • missing normalization data
  • Correcting files that show incorrect song duration
  • Correcting files in which the player cannot seek correctly