13

我正在尝试使用 decodeAudioData 在 javascript 中解码和播放较大 mp3 文件的初始部分。我的第一个粗略的方法是从 mp3 的开头切出一些字节并将它们提供给 decodeAudioData。毫不奇怪,这失败了。

经过一番挖掘,似乎 decodeAudioData 只能使用Fair Dinkum Thinkum记录的“有效 mp3 块” ,here

然而,没有关于有效 mp3 块的结构的说明(上述的作者没有进入这个)。我知道那里存在各种 mp3 拆分器,但我想以编程方式解决这个问题。(我正在尝试在服务器端使用 nodejs 实现一种“穷人的流媒体”)。

那么,在 mp3 帧头上拆分是否就足够了,还是我需要做更多?(也许通过在末尾附加一些数据来“关闭”每个块?)“字节库”怎么样?这会导致问题吗?作为记录,我目前正在使用 128kbps cbr mp3。这会以任何方式简化流程吗?

任何有关 decodeAudioData 期望作为有效数据的信息将不胜感激。

谢谢你。

PS:我意识到这可能是对 Fair Dinkum Thinkum帖子的澄清请求,但我的低声誉使我无法发表评论。所以除了一个新问题,我看不出还能怎么做。再次感谢。

4

2 回答 2

7

在对 decodeAudioData(在 Chrome 上)进行了更多实验之后,我发现:

  • 只要在 mp3 帧边界上拆分,任何初始mp3 块都将被成功解码。找到该边界可能并不总是微不足道的(例如,涉及解析 mp3 标头),因为即使是恒定比特率的 mp3 也不总是包含恒定大小的帧。例如,128kbps mp3 文件包含 417 字节帧和 418 字节帧。(某些帧包含一个额外的字节作为填充)。
  • 即使在“两侧”的精确帧边界上分割,也不能保证任意 mp3 块是可解码的。这种类型的某些块可以被解码,但其他块会导致 decodeAudioData 抛出错误。我猜这与mp3 位存储库有关,它在 mp3 帧之间创建了依赖关系。
于 2012-11-09T19:58:11.903 回答
4

如果您将文件拆分为以有效 MP3 标头开头的片段(在字节边界上对齐的 12 位“1”:FF Fx),您很可能会没事。

于 2012-05-06T13:33:10.330 回答