【问题标题】:(MP3) How To Calculate Byte Position In Java(MP3) 如何在 Java 中计算字节位置
【发布时间】:2016-11-27 19:55:12
【问题描述】:

如果要在某个时间位置启动.mp3文件的InputStream,如何使用InputStream.skip()方法计算要跳过的字节数?

我可以访问以下数据: 您想在几秒钟内开始的点

  • mp3 的采样率
  • mp3 的样本大小
  • mp3 的帧率
  • mp3 的帧大小

我已尝试搜索描述如何计算它的公式/算法,但我找不到它。有没有人知道怎么做?

-编辑

我尝试过执行帧大小 * 帧率​​ * 位置(秒),但相差 10 倍。当歌曲中跳到 50 秒时,将其除以 10 时仍会相差 3 秒,跳过较大的块时甚至更多。

【问题讨论】:

  • @teppic 不,我正在使用 JLayer
  • 链接的答案描述了Jlayer的使用。
  • @teppic 链接的答案没有提供任何关于在 mp3 文件中搜索的内容。除此之外,提供的链接使用我没有使用的 MP3SPI。没有 MP3SPI 的代码很快就不同了。
  • This answer might help,特别是 BpmDJ 的作者通过一些示例链接到 git 存储库 (随机访问解码器的 git 存储库可以从 git://yellowcouch 获得.org/home/git/JLayerDemos.git/)

标签: java audio decoding


【解决方案1】:

我在 C++ 中做同样的计算。万一谷歌人到达这个页面,我就是这样做的。到目前为止,它工作正常。我假设用户想要跳转到时间skipToTime(以秒为单位):

int numberOfFrames = (skipToTime * sampleRate)/1152;
int skipPositionInBytes = (numberOfFrames * frameSize);

有一点是 frameSize 并不总是相同的。特别是,第一帧和第二帧可能具有与其他帧不同的大小。所以最好分开测量。

我假设前两个帧的大小不同,而你计算了它们,那么整个计算将如下所示:

int numberOfFrames = (skipToTime * sampleRate)/1152;
numberOfFrames -= 2; // Or whatever it took to reach a stable frame size
int skipPositionInBytes = (numberOfFrames * frameSize) + OFFSET;

OFFSET 是达到稳定帧大小所需的总字节数。如果需要 2 帧,则:

OFFSET = frameSize1 + frameSize2;

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-04-12
    • 2023-03-15
    • 2011-06-20
    • 1970-01-01
    相关资源
    最近更新 更多