Java 使用带有 javax.sound.sampled.Clip 的 mp3、ogg 和 wav 文件或获取声音文件的比特率

问题描述

我的目标是同时播放多个 mp3、ogg 或 wav 音乐文件,以便在视频游戏中创建自适应音乐。

我没有使用 java sound API 中的 Clip 类,而是设法创建了一个名为 Track 的类,多亏了 mp3spi 和 vorbisspi,它可以通过在 SourceDataLine 中写入音频数据来读取 mp3、ogg 和 wav 文件。 由于这篇文章,我找到了这个解决方案:

https://stackoverflow.com/a/17737483/13326269

使用线程进入流函数一切正常,因此我可以创建许多 Track 对象来同时播放多个声音。但我想从 Clip 类创建一个类似 void setMicrosecondPosition(long microseconds);函数

我尝试了很多东西,我找到了一种方法

in = getAudioInputStream(new File(file).getAbsoluteFile());
int seconds = 410;
int bitrate = 320; //in kbit/s
in.skip(seconds*bitrate*1000/8); // divided by 8 because the skip method use bytes.

但我需要文件的比特率。那么,如何获得任何声音文件比特率?或者更好的是,我如何通过 javax.sound.sampled.Clip 类使用 mp3 和 ogg 文件

解决方法

我相信如果你真的有工作 AudioInputStreamsskip 函数引用的字节数应该是每帧固定的数量,由音频格式决定。例如立体声,无论如何,16 位将是每帧 4 个字节。因此,您应该能够使用帧速率(例如,44100 帧/秒)跳到所需的起点。

另一种方法是读取但忽略从 AudioInputStream 传入的字节,该方法类似于链接解决方案示例中的 stream 方法。您可以很快到达所需的位置,因为您不会被 sdl write() 阻止。但是,如果这样做有效,那么 skip 方法也应该有效,并且会更可取。