(MP3) 如何在 Java 中计算字节位置

Posted

技术标签:

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

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

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

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

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

-编辑

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

【问题讨论】:

How to get audio data from a MP3?的可能重复 @teppic 不,我正在使用 JLayer 链接的答案描述了Jlayer的使用。 @teppic 链接的答案没有提供任何关于在 mp3 文件中搜索的内容。除此之外,提供的链接使用我没有使用的 MP3SPI。没有 MP3SPI 的代码很快就不同了。 This answer might help,特别是 BpmDJ 的作者通过一些示例链接到 git 存储库 (随机访问解码器的 git 存储库可以从 git://yellowcouch 获得.org/home/git/JLayerDemos.git/) 【参考方案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;

【讨论】:

以上是关于(MP3) 如何在 Java 中计算字节位置的主要内容,如果未能解决你的问题,请参考以下文章

如何计算在java中执行的字节码数

获取 mp3 文件指定时间范围的字节范围位置

如何从字节播放 mp3?

如何将 mp3 转换为 ogg python

Java - MP3 解码并将其存储到字节数组中

如何在 ID3v2.2 MP3 标签中获取帧大小?