首页 > 解决方案 > Java 使用带有 javax.sound.sampled.Clip 的 mp3、ogg 和 wav 文件(或获取声音文件的比特率)

问题描述

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

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

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

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

我尝试了很多事情,并找到了一种方法:

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.

但我需要文件的比特率。那么,我怎样才能得到任何声音文件的比特率呢?或者更好的是,如何将 mp3 和 ogg 文件与javax.sound.sampled.Clip类一起使用。

标签: javaaudiojavasoundtritonus

解决方案


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

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


推荐阅读