如何从 node.js 应用程序检测损坏/不完整的 MP3 文件?
Posted
技术标签:
【中文标题】如何从 node.js 应用程序检测损坏/不完整的 MP3 文件?【英文标题】:How can I detect corrupt/incomplete MP3 file, from a node.js app? 【发布时间】:2020-12-01 17:52:48 【问题描述】:MP3 文件完整性不正确的常见情况是文件已部分上传到服务器。在这种情况下,指示的音频持续时间与 MP3 文件中的实际内容不对应:我们可以听到开头,但在某些时候播放停止并且音频播放器的指示持续时间中断。
我尝试使用 node-ffprobe 之类的库,但它们似乎只是读取元数据,而没有与文件中的真实音频数据进行比较。有没有办法从 node.js 中有效地检测损坏或不完整的 MP3 文件?
注意:上传 MP3 文件的客户端是一个硬件(录音机),上传文件到 FTP 服务器上。不是浏览器。所以我无法从客户端上传可能更有用的数据。
【问题讨论】:
除了文件之外,您还可以让客户端发送持续时间:***.com/questions/34647536/… 在我这边,客户端是硬件(上传到 FTP 服务器的录音机),而不是浏览器,所以我在这方面有点局限。 【参考方案1】:MP3 文件通常没有持续时间。它们只是一系列 MPEG 帧。有时,会有一个 ID3 标签指示持续时间,但并非总是如此。
玩家可以通过选择以下几种方法之一来确定持续时间:
解码整个音频文件。这是最慢的方法,但如果你还是要解码文件,你不妨走这条路线,因为它会给你一个准确的持续时间。 读取整个文件,略读帧头。您必须从磁盘读取整个文件,但不必解码。如果 I/O 很慢,可能会很慢,但会提供准确的持续时间。 读取第一帧的比特率并根据文件大小估计持续时间。绝对是最快的方法,也是玩家最常用的方法。持续时间只是一个估计值,对于 CBR 来说相当准确,但对于 VBR 来说可能非常不准确。我的意思是这些文件实际上可能并没有被破坏。它们可能只是您的播放器不知道持续时间的 VBR 文件。
如果您确信它们已损坏(例如在内容中间停止),那么您必须弄清楚您想如何处理它。可能只有两种方法可以确定这一点:
理想情况下,有一个 ID3 标签指示持续时间,您可以解码整个文件并确定其实际持续时间以进行比较。 通常,该 ID3 标记不存在,因此您必须检查最后一帧是否完整。除此之外,您实际上并没有很好的方法来了解流是否不完整,因为没有外部容器可以实际指定预期的帧数。
【讨论】:
很抱歉我迟到的反馈,非常感谢您的回答。暴露的3个方法很清楚。幸运的是,我们的记录器正在添加 ID3 标记持续时间,因此我可以将此值与您公开的第二种方法(读取整个文件,浏览帧头)进行比较, 仅供参考,我使用mp3-duration 获取基于帧头计算的持续时间,并使用music-metadata 获取 ID3 持续时间标签。 酷,很高兴您找到了可行的解决方案! Borewit 的东西很棒……我自己用!【参考方案2】:根据持续时间和编码计算 mp3 文件大小的表达式(来自this 答案)非常简单:
x = length of song in seconds
y = bitrate in kilobits per second
(x * y) / 1024 = filesize (MB)
在same question 的另一个答案中还有一个 Web Audio API 的 javascript 实现。也许这对您的 Node 实现很有用。
mp3diags 是一些用于修复 mp3 的较旧的开源软件,非常适合此类批处理。源代码是 c++,如果您觉得很爱管闲事并想看看其中一些功能是如何实现的,仍然可以使用。
值得一看,因为它具有一些可能对您的上下文有用的功能:
什么是 MP3 Diags,它有什么作用?
低质量音频 缺少 VBR 标头 缺少标准化数据 更正显示错误歌曲时长的文件 更正播放器无法正确查找的文件
【讨论】:
以上是关于如何从 node.js 应用程序检测损坏/不完整的 MP3 文件?的主要内容,如果未能解决你的问题,请参考以下文章
从cloudinary删除带有完整url的图像不起作用-Node.js
如何在heroku中显示node.js中的所有console.log?